Skip to content

Commit d4d947e

Browse files
author
Andy
authored
Fix bug: Allow completions after '@' with no contextToken (#27325)
1 parent 1a63c67 commit d4d947e

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

src/services/completions.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ namespace ts.Completions {
4343
}
4444

4545
const contextToken = findPrecedingToken(position, sourceFile);
46-
if (triggerCharacter && (!contextToken || !isValidTrigger(sourceFile, triggerCharacter, contextToken, position))) return undefined;
46+
if (triggerCharacter && !isValidTrigger(sourceFile, triggerCharacter, contextToken, position)) return undefined;
4747

4848
if (isInString(sourceFile, position, contextToken)) {
4949
return !contextToken || !isStringLiteralLike(contextToken)
@@ -2272,7 +2272,7 @@ namespace ts.Completions {
22722272
return !!type.getStringIndexType() || !!type.getNumberIndexType();
22732273
}
22742274

2275-
function isValidTrigger(sourceFile: SourceFile, triggerCharacter: CompletionsTriggerCharacter, contextToken: Node, position: number): boolean {
2275+
function isValidTrigger(sourceFile: SourceFile, triggerCharacter: CompletionsTriggerCharacter, contextToken: Node | undefined, position: number): boolean {
22762276
switch (triggerCharacter) {
22772277
case ".":
22782278
case "@":
@@ -2281,14 +2281,14 @@ namespace ts.Completions {
22812281
case "'":
22822282
case "`":
22832283
// Only automatically bring up completions if this is an opening quote.
2284-
return isStringLiteralOrTemplate(contextToken) && position === contextToken.getStart(sourceFile) + 1;
2284+
return !!contextToken && isStringLiteralOrTemplate(contextToken) && position === contextToken.getStart(sourceFile) + 1;
22852285
case "<":
22862286
// Opening JSX tag
2287-
return contextToken.kind === SyntaxKind.LessThanToken && (!isBinaryExpression(contextToken.parent) || binaryExpressionMayBeOpenTag(contextToken.parent));
2287+
return !!contextToken && contextToken.kind === SyntaxKind.LessThanToken && (!isBinaryExpression(contextToken.parent) || binaryExpressionMayBeOpenTag(contextToken.parent));
22882288
case "/":
2289-
return isStringLiteralLike(contextToken)
2289+
return !!contextToken && (isStringLiteralLike(contextToken)
22902290
? !!tryGetImportFromModuleSpecifier(contextToken)
2291-
: contextToken.kind === SyntaxKind.SlashToken && isJsxClosingElement(contextToken.parent);
2291+
: contextToken.kind === SyntaxKind.SlashToken && isJsxClosingElement(contextToken.parent));
22922292
default:
22932293
return Debug.assertNever(triggerCharacter);
22942294
}

tests/cases/fourslash/completionsTriggerCharacter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
// @jsx: preserve
44

5+
/////** @/*tag*/ */
56
//////</*comment*/
67
////const x: "a" | "b" = "/*openQuote*/"/*closeQuote*/;
78
////const y: 'a' | 'b' = '/*openSingleQuote*/'/*closeSingleQuote*/;
@@ -29,6 +30,7 @@
2930
////const divide = 1 //*divide*/
3031

3132
verify.completions(
33+
{ marker: "tag", includes: ["param"], triggerCharacter: "@" },
3234
{ marker: "comment", exact: undefined, triggerCharacter: "<" },
3335

3436
{ marker: "openQuote", exact: ["a", "b"], triggerCharacter: '"' },

0 commit comments

Comments
 (0)