@@ -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 ) ;
0 commit comments