From a87512d21bbcd97e9a637b9722c7f485013a6c25 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 27 Jan 2020 14:25:20 -0800 Subject: [PATCH] Add # to completion trigger character, (#36462) Handle private identifiers little better by creating token for private identifier when its just # Report same error as invalid character but from language service we can now provide completions for this.# Fixes #36367, #36250 --- src/compiler/scanner.ts | 9 +++++---- src/server/protocol.ts | 2 +- src/services/completions.ts | 2 ++ src/services/types.ts | 2 +- .../baselines/reference/api/tsserverlibrary.d.ts | 4 ++-- tests/baselines/reference/api/typescript.d.ts | 2 +- ...mpletionsECMAPrivateMemberTriggerCharacter.ts | 16 ++++++++++++++++ 7 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 tests/cases/fourslash/completionsECMAPrivateMemberTriggerCharacter.ts diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 2ccc8ef270d..1026b02a68c 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -1907,11 +1907,12 @@ namespace ts { if (ch === CharacterCodes.backslash) { tokenValue += scanIdentifierParts(); } - return token = SyntaxKind.PrivateIdentifier; } - error(Diagnostics.Invalid_character); - // no `pos++` because already advanced past the '#' - return token = SyntaxKind.Unknown; + else { + tokenValue = "#"; + error(Diagnostics.Invalid_character); + } + return token = SyntaxKind.PrivateIdentifier; default: if (isIdentifierStart(ch, languageVersion)) { pos += charSize(ch); diff --git a/src/server/protocol.ts b/src/server/protocol.ts index e4317934f08..e44472ed3f0 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -1972,7 +1972,7 @@ namespace ts.server.protocol { arguments: FormatOnKeyRequestArgs; } - export type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<"; + export type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#"; /** * Arguments for completions messages. diff --git a/src/services/completions.ts b/src/services/completions.ts index 8b8f1d1e140..db1b1ba5510 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -2654,6 +2654,8 @@ namespace ts.Completions { case "`": // Only automatically bring up completions if this is an opening quote. return !!contextToken && isStringLiteralOrTemplate(contextToken) && position === contextToken.getStart(sourceFile) + 1; + case "#": + return !!contextToken && isPrivateIdentifier(contextToken) && !!getContainingClass(contextToken); case "<": // Opening JSX tag return !!contextToken && contextToken.kind === SyntaxKind.LessThanToken && (!isBinaryExpression(contextToken.parent) || binaryExpressionMayBeOpenTag(contextToken.parent)); diff --git a/src/services/types.ts b/src/services/types.ts index 3a1627c247f..d1e1629a4b8 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -418,7 +418,7 @@ namespace ts { export type OrganizeImportsScope = CombinedCodeFixScope; - export type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<"; + export type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#"; export interface GetCompletionsAtPositionOptions extends UserPreferences { /** diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 9b5b4ace8a1..9a542d064b0 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -5198,7 +5198,7 @@ declare namespace ts { fileName: string; } type OrganizeImportsScope = CombinedCodeFixScope; - type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<"; + type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#"; interface GetCompletionsAtPositionOptions extends UserPreferences { /** * If the editor is asking for completions because a certain character was typed @@ -7541,7 +7541,7 @@ declare namespace ts.server.protocol { command: CommandTypes.Formatonkey; arguments: FormatOnKeyRequestArgs; } - type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<"; + type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#"; /** * Arguments for completions messages. */ diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 63b85fa177f..86978589be6 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -5198,7 +5198,7 @@ declare namespace ts { fileName: string; } type OrganizeImportsScope = CombinedCodeFixScope; - type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<"; + type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#"; interface GetCompletionsAtPositionOptions extends UserPreferences { /** * If the editor is asking for completions because a certain character was typed diff --git a/tests/cases/fourslash/completionsECMAPrivateMemberTriggerCharacter.ts b/tests/cases/fourslash/completionsECMAPrivateMemberTriggerCharacter.ts new file mode 100644 index 00000000000..299e8e4e6ee --- /dev/null +++ b/tests/cases/fourslash/completionsECMAPrivateMemberTriggerCharacter.ts @@ -0,0 +1,16 @@ +/// + +// @target: esnext + +////class K { +//// #value: number; +//// +//// foo() { +//// this.#/**/ +//// } +////} + +verify.completions( + { marker: "", exact: ["#value", "foo"] }, + { marker: "", exact: ["#value", "foo"], triggerCharacter: "#" }, +); \ No newline at end of file