diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 2ccc8ef270d0f..1026b02a68c2a 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 e4317934f08ef..e44472ed3f0e2 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 181128fbaf496..b09e135adc15e 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -2651,6 +2651,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 3a1627c247fe2..d1e1629a4b8a8 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 9b5b4ace8a1f4..9a542d064b0d9 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 63b85fa177f6e..86978589be6a2 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 0000000000000..299e8e4e6eede --- /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