Skip to content

Commit 5284192

Browse files
committed
Support string literal completion in case labels
1 parent 3b1b5e2 commit 5284192

File tree

2 files changed

+25
-17
lines changed

2 files changed

+25
-17
lines changed

src/services/completions.ts

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,16 @@ namespace ts.Completions {
174174
return getStringLiteralCompletionEntriesFromModuleNames(<StringLiteral>node, compilerOptions, host, typeChecker);
175175
}
176176
else if (isEqualityExpression(node.parent)) {
177-
// Get all known external module names or complete a path to a module
177+
// Get completions from the type of the other operand
178+
// i.e. switch (a) {
179+
// case '/*completion position*/'
180+
// }
181+
return getStringLiteralCompletionEntriesFromType(typeChecker.getTypeAtLocation(node.parent.left === node ? node.parent.right : node.parent.left), typeChecker);
182+
}
183+
else if (isCaseOrDefaultClause(node.parent)) {
184+
// Get completions from the type of the switch expression
178185
// i.e. x === '/*completion position'
179-
return getStringLiteralCompletionEntriesFromBinaryExpression(<StringLiteral>node, node.parent, typeChecker);
186+
return getStringLiteralCompletionEntriesFromType(typeChecker.getTypeAtLocation((<SwitchStatement>node.parent.parent.parent).expression), typeChecker);
180187
}
181188
else {
182189
const argumentInfo = SignatureHelp.getImmediatelyContainingArgumentInfo(node, position, sourceFile);
@@ -189,7 +196,7 @@ namespace ts.Completions {
189196

190197
// Get completion for string literal from string literal type
191198
// i.e. var x: "hi" | "hello" = "/*completion position*/"
192-
return getStringLiteralCompletionEntriesFromContextualType(<StringLiteral>node, typeChecker);
199+
return getStringLiteralCompletionEntriesFromType(typeChecker.getContextualType(<StringLiteral>node), typeChecker);
193200
}
194201
}
195202

@@ -233,20 +240,7 @@ namespace ts.Completions {
233240
return undefined;
234241
}
235242

236-
function getStringLiteralCompletionEntriesFromContextualType(node: StringLiteral, typeChecker: TypeChecker): CompletionInfo | undefined {
237-
const type = typeChecker.getContextualType(node);
238-
if (type) {
239-
const entries: CompletionEntry[] = [];
240-
addStringLiteralCompletionsFromType(type, entries, typeChecker);
241-
if (entries.length) {
242-
return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: false, entries };
243-
}
244-
}
245-
return undefined;
246-
}
247-
248-
function getStringLiteralCompletionEntriesFromBinaryExpression(node: StringLiteral, parent: BinaryExpression, typeChecker: TypeChecker): CompletionInfo | undefined {
249-
const type = typeChecker.getTypeAtLocation(parent.left === node ? parent.right : parent.left);
243+
function getStringLiteralCompletionEntriesFromType(type: Type, typeChecker: TypeChecker): CompletionInfo | undefined {
250244
if (type) {
251245
const entries: CompletionEntry[] = [];
252246
addStringLiteralCompletionsFromType(type, entries, typeChecker);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
////type As = 'arf' | 'abacus' | 'abaddon';
4+
////let a: As;
5+
////switch (a) {
6+
//// case '/**/
7+
////}
8+
9+
goTo.marker();
10+
verify.completionListContains("arf");
11+
verify.completionListContains("abacus");
12+
verify.completionListContains("abaddon");
13+
verify.completionListCount(3);
14+

0 commit comments

Comments
 (0)