@@ -2892,16 +2892,6 @@ namespace ts {
28922892 log ( "getCompletionData: Get previous token 2: " + ( new Date ( ) . getTime ( ) - start ) ) ;
28932893 }
28942894
2895- // Check if this is a valid completion location
2896- if ( contextToken && isCompletionListBlocker ( contextToken ) ) {
2897- log ( "Returning an empty list because completion was requested in an invalid position." ) ;
2898- return undefined ;
2899- }
2900-
2901- let options = program . getCompilerOptions ( ) ;
2902- let jsx = options . jsx !== JsxEmit . None ;
2903- let target = options . target ;
2904-
29052895 // Find the node where completion is requested on.
29062896 // Also determine whether we are trying to complete with members of that node
29072897 // or attributes of a JSX tag.
@@ -2911,6 +2901,12 @@ namespace ts {
29112901
29122902 let location = getTouchingPropertyName ( sourceFile , position ) ;
29132903 if ( contextToken ) {
2904+ // Bail out if this is a known invalid completion location
2905+ if ( isCompletionListBlocker ( contextToken ) ) {
2906+ log ( "Returning an empty list because completion was requested in an invalid position." ) ;
2907+ return undefined ;
2908+ }
2909+
29142910 let { parent, kind } = contextToken ;
29152911 if ( kind === SyntaxKind . DotToken ) {
29162912 if ( parent . kind === SyntaxKind . PropertyAccessExpression ) {
@@ -3146,7 +3142,7 @@ namespace ts {
31463142 let start = new Date ( ) . getTime ( ) ;
31473143 let result = isInStringOrRegularExpressionOrTemplateLiteral ( contextToken ) ||
31483144 isIdentifierDefinitionLocation ( contextToken ) ||
3149- isRightOfIllegalDot ( contextToken ) ;
3145+ isDotOfNumericLiteral ( contextToken ) ;
31503146 log ( "getCompletionsAtPosition: isCompletionListBlocker: " + ( new Date ( ) . getTime ( ) - start ) ) ;
31513147 return result ;
31523148 }
@@ -3241,8 +3237,8 @@ namespace ts {
32413237 }
32423238
32433239 if ( position === end ) {
3244- return ! ! ( < LiteralExpression > contextToken ) . isUnterminated ||
3245- contextToken . kind === SyntaxKind . RegularExpressionLiteral ;
3240+ return ! ! ( < LiteralExpression > contextToken ) . isUnterminated
3241+ || contextToken . kind === SyntaxKind . RegularExpressionLiteral ;
32463242 }
32473243 }
32483244
@@ -3317,98 +3313,96 @@ namespace ts {
33173313 }
33183314
33193315 function isIdentifierDefinitionLocation ( contextToken : Node ) : boolean {
3320- if ( contextToken ) {
3321- let containingNodeKind = contextToken . parent . kind ;
3322- switch ( contextToken . kind ) {
3323- case SyntaxKind . CommaToken :
3324- return containingNodeKind === SyntaxKind . VariableDeclaration ||
3325- containingNodeKind === SyntaxKind . VariableDeclarationList ||
3326- containingNodeKind === SyntaxKind . VariableStatement ||
3327- containingNodeKind === SyntaxKind . EnumDeclaration || // enum a { foo, |
3328- isFunction ( containingNodeKind ) ||
3329- containingNodeKind === SyntaxKind . ClassDeclaration || // class A<T, |
3330- containingNodeKind === SyntaxKind . FunctionDeclaration || // function A<T, |
3331- containingNodeKind === SyntaxKind . InterfaceDeclaration || // interface A<T, |
3332- containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [x, y|
3316+ let containingNodeKind = contextToken . parent . kind ;
3317+ switch ( contextToken . kind ) {
3318+ case SyntaxKind . CommaToken :
3319+ return containingNodeKind === SyntaxKind . VariableDeclaration ||
3320+ containingNodeKind === SyntaxKind . VariableDeclarationList ||
3321+ containingNodeKind === SyntaxKind . VariableStatement ||
3322+ containingNodeKind === SyntaxKind . EnumDeclaration || // enum a { foo, |
3323+ isFunction ( containingNodeKind ) ||
3324+ containingNodeKind === SyntaxKind . ClassDeclaration || // class A<T, |
3325+ containingNodeKind === SyntaxKind . FunctionDeclaration || // function A<T, |
3326+ containingNodeKind === SyntaxKind . InterfaceDeclaration || // interface A<T, |
3327+ containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [x, y|
33333328
3334- case SyntaxKind . DotToken :
3335- return containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [.|
3329+ case SyntaxKind . DotToken :
3330+ return containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [.|
33363331
3337- case SyntaxKind . ColonToken :
3338- return containingNodeKind === SyntaxKind . BindingElement ; // var {x :html|
3332+ case SyntaxKind . ColonToken :
3333+ return containingNodeKind === SyntaxKind . BindingElement ; // var {x :html|
33393334
3340- case SyntaxKind . OpenBracketToken :
3341- return containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [x|
3335+ case SyntaxKind . OpenBracketToken :
3336+ return containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [x|
33423337
3343- case SyntaxKind . OpenParenToken :
3344- return containingNodeKind === SyntaxKind . CatchClause ||
3345- isFunction ( containingNodeKind ) ;
3346-
3347- case SyntaxKind . OpenBraceToken :
3348- return containingNodeKind === SyntaxKind . EnumDeclaration || // enum a { |
3349- containingNodeKind === SyntaxKind . InterfaceDeclaration || // interface a { |
3350- containingNodeKind === SyntaxKind . TypeLiteral ; // let x : { |
3351-
3352- case SyntaxKind . SemicolonToken :
3353- return containingNodeKind === SyntaxKind . PropertySignature &&
3354- contextToken . parent && contextToken . parent . parent &&
3355- ( contextToken . parent . parent . kind === SyntaxKind . InterfaceDeclaration || // interface a { f; |
3356- contextToken . parent . parent . kind === SyntaxKind . TypeLiteral ) ; // let x : { a; |
3357-
3358- case SyntaxKind . LessThanToken :
3359- return containingNodeKind === SyntaxKind . ClassDeclaration || // class A< |
3360- containingNodeKind === SyntaxKind . FunctionDeclaration || // function A< |
3361- containingNodeKind === SyntaxKind . InterfaceDeclaration || // interface A< |
3362- isFunction ( containingNodeKind ) ;
3363-
3364- case SyntaxKind . StaticKeyword :
3365- return containingNodeKind === SyntaxKind . PropertyDeclaration ;
3366-
3367- case SyntaxKind . DotDotDotToken :
3368- return containingNodeKind === SyntaxKind . Parameter ||
3369- ( contextToken . parent && contextToken . parent . parent &&
3370- contextToken . parent . parent . kind === SyntaxKind . ArrayBindingPattern ) ; // var [...z|
3371-
3372- case SyntaxKind . PublicKeyword :
3373- case SyntaxKind . PrivateKeyword :
3374- case SyntaxKind . ProtectedKeyword :
3375- return containingNodeKind === SyntaxKind . Parameter ;
3376-
3377- case SyntaxKind . ClassKeyword :
3378- case SyntaxKind . EnumKeyword :
3379- case SyntaxKind . InterfaceKeyword :
3380- case SyntaxKind . FunctionKeyword :
3381- case SyntaxKind . VarKeyword :
3382- case SyntaxKind . GetKeyword :
3383- case SyntaxKind . SetKeyword :
3384- case SyntaxKind . ImportKeyword :
3385- case SyntaxKind . LetKeyword :
3386- case SyntaxKind . ConstKeyword :
3387- case SyntaxKind . YieldKeyword :
3388- case SyntaxKind . TypeKeyword : // type htm|
3389- return true ;
3390- }
3338+ case SyntaxKind . OpenParenToken :
3339+ return containingNodeKind === SyntaxKind . CatchClause ||
3340+ isFunction ( containingNodeKind ) ;
3341+
3342+ case SyntaxKind . OpenBraceToken :
3343+ return containingNodeKind === SyntaxKind . EnumDeclaration || // enum a { |
3344+ containingNodeKind === SyntaxKind . InterfaceDeclaration || // interface a { |
3345+ containingNodeKind === SyntaxKind . TypeLiteral ; // let x : { |
3346+
3347+ case SyntaxKind . SemicolonToken :
3348+ return containingNodeKind === SyntaxKind . PropertySignature &&
3349+ contextToken . parent && contextToken . parent . parent &&
3350+ ( contextToken . parent . parent . kind === SyntaxKind . InterfaceDeclaration || // interface a { f; |
3351+ contextToken . parent . parent . kind === SyntaxKind . TypeLiteral ) ; // let x : { a; |
3352+
3353+ case SyntaxKind . LessThanToken :
3354+ return containingNodeKind === SyntaxKind . ClassDeclaration || // class A< |
3355+ containingNodeKind === SyntaxKind . FunctionDeclaration || // function A< |
3356+ containingNodeKind === SyntaxKind . InterfaceDeclaration || // interface A< |
3357+ isFunction ( containingNodeKind ) ;
3358+
3359+ case SyntaxKind . StaticKeyword :
3360+ return containingNodeKind === SyntaxKind . PropertyDeclaration ;
3361+
3362+ case SyntaxKind . DotDotDotToken :
3363+ return containingNodeKind === SyntaxKind . Parameter ||
3364+ ( contextToken . parent && contextToken . parent . parent &&
3365+ contextToken . parent . parent . kind === SyntaxKind . ArrayBindingPattern ) ; // var [...z|
3366+
3367+ case SyntaxKind . PublicKeyword :
3368+ case SyntaxKind . PrivateKeyword :
3369+ case SyntaxKind . ProtectedKeyword :
3370+ return containingNodeKind === SyntaxKind . Parameter ;
3371+
3372+ case SyntaxKind . ClassKeyword :
3373+ case SyntaxKind . EnumKeyword :
3374+ case SyntaxKind . InterfaceKeyword :
3375+ case SyntaxKind . FunctionKeyword :
3376+ case SyntaxKind . VarKeyword :
3377+ case SyntaxKind . GetKeyword :
3378+ case SyntaxKind . SetKeyword :
3379+ case SyntaxKind . ImportKeyword :
3380+ case SyntaxKind . LetKeyword :
3381+ case SyntaxKind . ConstKeyword :
3382+ case SyntaxKind . YieldKeyword :
3383+ case SyntaxKind . TypeKeyword : // type htm|
3384+ return true ;
3385+ }
33913386
3392- // Previous token may have been a keyword that was converted to an identifier.
3393- switch ( contextToken . getText ( ) ) {
3394- case "class" :
3395- case "interface" :
3396- case "enum" :
3397- case "function" :
3398- case "var" :
3399- case "static" :
3400- case "let" :
3401- case "const" :
3402- case "yield" :
3403- return true ;
3404- }
3387+ // Previous token may have been a keyword that was converted to an identifier.
3388+ switch ( contextToken . getText ( ) ) {
3389+ case "class" :
3390+ case "interface" :
3391+ case "enum" :
3392+ case "function" :
3393+ case "var" :
3394+ case "static" :
3395+ case "let" :
3396+ case "const" :
3397+ case "yield" :
3398+ return true ;
34053399 }
34063400
34073401 return false ;
34083402 }
34093403
3410- function isRightOfIllegalDot ( contextToken : Node ) : boolean {
3411- if ( contextToken && contextToken . kind === SyntaxKind . NumericLiteral ) {
3404+ function isDotOfNumericLiteral ( contextToken : Node ) : boolean {
3405+ if ( contextToken . kind === SyntaxKind . NumericLiteral ) {
34123406 let text = contextToken . getFullText ( ) ;
34133407 return text . charAt ( text . length - 1 ) === "." ;
34143408 }
0 commit comments