@@ -174,9 +174,16 @@ namespace ts.Completions {
174
174
return getStringLiteralCompletionEntriesFromModuleNames ( < StringLiteral > node , compilerOptions , host , typeChecker ) ;
175
175
}
176
176
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
178
185
// 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 ) ;
180
187
}
181
188
else {
182
189
const argumentInfo = SignatureHelp . getImmediatelyContainingArgumentInfo ( node , position , sourceFile ) ;
@@ -189,7 +196,7 @@ namespace ts.Completions {
189
196
190
197
// Get completion for string literal from string literal type
191
198
// i.e. var x: "hi" | "hello" = "/*completion position*/"
192
- return getStringLiteralCompletionEntriesFromContextualType ( < StringLiteral > node , typeChecker ) ;
199
+ return getStringLiteralCompletionEntriesFromType ( typeChecker . getContextualType ( < StringLiteral > node ) , typeChecker ) ;
193
200
}
194
201
}
195
202
@@ -233,20 +240,7 @@ namespace ts.Completions {
233
240
return undefined ;
234
241
}
235
242
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 {
250
244
if ( type ) {
251
245
const entries : CompletionEntry [ ] = [ ] ;
252
246
addStringLiteralCompletionsFromType ( type , entries , typeChecker ) ;
0 commit comments