@@ -2892,16 +2892,6 @@ namespace ts {
2892
2892
log ( "getCompletionData: Get previous token 2: " + ( new Date ( ) . getTime ( ) - start ) ) ;
2893
2893
}
2894
2894
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
-
2905
2895
// Find the node where completion is requested on.
2906
2896
// Also determine whether we are trying to complete with members of that node
2907
2897
// or attributes of a JSX tag.
@@ -2911,6 +2901,12 @@ namespace ts {
2911
2901
2912
2902
let location = getTouchingPropertyName ( sourceFile , position ) ;
2913
2903
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
+
2914
2910
let { parent, kind } = contextToken ;
2915
2911
if ( kind === SyntaxKind . DotToken ) {
2916
2912
if ( parent . kind === SyntaxKind . PropertyAccessExpression ) {
@@ -3146,7 +3142,7 @@ namespace ts {
3146
3142
let start = new Date ( ) . getTime ( ) ;
3147
3143
let result = isInStringOrRegularExpressionOrTemplateLiteral ( contextToken ) ||
3148
3144
isIdentifierDefinitionLocation ( contextToken ) ||
3149
- isRightOfIllegalDot ( contextToken ) ;
3145
+ isDotOfNumericLiteral ( contextToken ) ;
3150
3146
log ( "getCompletionsAtPosition: isCompletionListBlocker: " + ( new Date ( ) . getTime ( ) - start ) ) ;
3151
3147
return result ;
3152
3148
}
@@ -3241,8 +3237,8 @@ namespace ts {
3241
3237
}
3242
3238
3243
3239
if ( position === end ) {
3244
- return ! ! ( < LiteralExpression > contextToken ) . isUnterminated ||
3245
- contextToken . kind === SyntaxKind . RegularExpressionLiteral ;
3240
+ return ! ! ( < LiteralExpression > contextToken ) . isUnterminated
3241
+ || contextToken . kind === SyntaxKind . RegularExpressionLiteral ;
3246
3242
}
3247
3243
}
3248
3244
@@ -3317,98 +3313,96 @@ namespace ts {
3317
3313
}
3318
3314
3319
3315
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|
3333
3328
3334
- case SyntaxKind . DotToken :
3335
- return containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [.|
3329
+ case SyntaxKind . DotToken :
3330
+ return containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [.|
3336
3331
3337
- case SyntaxKind . ColonToken :
3338
- return containingNodeKind === SyntaxKind . BindingElement ; // var {x :html|
3332
+ case SyntaxKind . ColonToken :
3333
+ return containingNodeKind === SyntaxKind . BindingElement ; // var {x :html|
3339
3334
3340
- case SyntaxKind . OpenBracketToken :
3341
- return containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [x|
3335
+ case SyntaxKind . OpenBracketToken :
3336
+ return containingNodeKind === SyntaxKind . ArrayBindingPattern ; // var [x|
3342
3337
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
+ }
3391
3386
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 ;
3405
3399
}
3406
3400
3407
3401
return false ;
3408
3402
}
3409
3403
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 ) {
3412
3406
let text = contextToken . getFullText ( ) ;
3413
3407
return text . charAt ( text . length - 1 ) === "." ;
3414
3408
}
0 commit comments