Skip to content

Commit cacc366

Browse files
Avoid unnecessary contextToken checking, addressed CR feedback.
1 parent be73f73 commit cacc366

File tree

1 file changed

+89
-95
lines changed

1 file changed

+89
-95
lines changed

src/services/services.ts

Lines changed: 89 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)