Skip to content

Commit 1becbf4

Browse files
authored
Merge pull request #15754 from charlespierce/string_literal_completion
Prevent Duplicate String Literal Completions
2 parents bed1e02 + cff19ab commit 1becbf4

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

src/services/completions.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,12 @@ namespace ts.Completions {
221221
function getStringLiteralCompletionEntriesFromCallExpression(argumentInfo: SignatureHelp.ArgumentListInfo, typeChecker: TypeChecker): CompletionInfo | undefined {
222222
const candidates: Signature[] = [];
223223
const entries: CompletionEntry[] = [];
224+
const uniques = createMap<true>();
224225

225226
typeChecker.getResolvedSignature(argumentInfo.invocation, candidates);
226227

227228
for (const candidate of candidates) {
228-
addStringLiteralCompletionsFromType(typeChecker.getParameterType(candidate, argumentInfo.argumentIndex), entries, typeChecker);
229+
addStringLiteralCompletionsFromType(typeChecker.getParameterType(candidate, argumentInfo.argumentIndex), entries, typeChecker, uniques);
229230
}
230231

231232
if (entries.length) {
@@ -258,7 +259,7 @@ namespace ts.Completions {
258259
return undefined;
259260
}
260261

261-
function addStringLiteralCompletionsFromType(type: Type, result: Push<CompletionEntry>, typeChecker: TypeChecker): void {
262+
function addStringLiteralCompletionsFromType(type: Type, result: Push<CompletionEntry>, typeChecker: TypeChecker, uniques = createMap<true>()): void {
262263
if (type && type.flags & TypeFlags.TypeParameter) {
263264
type = typeChecker.getBaseConstraintOfType(type);
264265
}
@@ -267,16 +268,20 @@ namespace ts.Completions {
267268
}
268269
if (type.flags & TypeFlags.Union) {
269270
for (const t of (<UnionType>type).types) {
270-
addStringLiteralCompletionsFromType(t, result, typeChecker);
271+
addStringLiteralCompletionsFromType(t, result, typeChecker, uniques);
271272
}
272273
}
273274
else if (type.flags & TypeFlags.StringLiteral) {
274-
result.push({
275-
name: (<LiteralType>type).text,
276-
kindModifiers: ScriptElementKindModifier.none,
277-
kind: ScriptElementKind.variableElement,
278-
sortText: "0"
279-
});
275+
const name = (<LiteralType>type).text;
276+
if (!uniques.has(name)) {
277+
uniques.set(name, true);
278+
result.push({
279+
name,
280+
kindModifiers: ScriptElementKindModifier.none,
281+
kind: ScriptElementKind.variableElement,
282+
sortText: "0"
283+
});
284+
}
280285
}
281286
}
282287

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
////function foo(x: "bla"): void;
4+
////function foo(x: "bla"): void;
5+
////function foo(x: string) {}
6+
////foo("/**/")
7+
8+
goTo.marker();
9+
verify.completionListContains("bla");
10+
verify.completionListCount(1);

0 commit comments

Comments
 (0)