Skip to content

Commit ddf20ec

Browse files
author
Andy
authored
Support '.' as a trigger character (#23890)
* Support '.' as a trigger character * Add a CompletionsTriggerCharacter type * Add more trigger characters * Add another type CompletionsTriggerCharacter * Update API baselines
1 parent f35a20e commit ddf20ec

File tree

6 files changed

+30
-12
lines changed

6 files changed

+30
-12
lines changed

src/harness/fourslash.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -957,7 +957,14 @@ namespace FourSlash {
957957
}
958958

959959
public verifyCompletionsAt(markerName: string | ReadonlyArray<string>, expected: ReadonlyArray<FourSlashInterface.ExpectedCompletionEntry>, options?: FourSlashInterface.CompletionsAtOptions) {
960-
this.verifyCompletions({ marker: markerName, exact: expected, isNewIdentifierLocation: options && options.isNewIdentifierLocation, preferences: options, triggerCharacter: options && options.triggerCharacter });
960+
this.verifyCompletions({
961+
marker: markerName,
962+
exact: expected,
963+
isNewIdentifierLocation: options && options.isNewIdentifierLocation,
964+
preferences: options,
965+
// TODO: GH#20090
966+
triggerCharacter: (options && options.triggerCharacter) as ts.CompletionsTriggerCharacter | undefined,
967+
});
961968
}
962969

963970
public verifyCompletionListContains(entryId: ts.Completions.CompletionEntryIdentifier, text?: string, documentation?: string, kind?: string | { kind?: string, kindModifiers?: string }, spanIndex?: number, hasAction?: boolean, options?: FourSlashInterface.VerifyCompletionListContainsOptions) {
@@ -4719,7 +4726,7 @@ namespace FourSlashInterface {
47194726
readonly sourceDisplay?: string;
47204727
};
47214728
export interface CompletionsAtOptions extends Partial<ts.UserPreferences> {
4722-
triggerCharacter?: string;
4729+
triggerCharacter?: ts.CompletionsTriggerCharacter;
47234730
isNewIdentifierLocation?: boolean;
47244731
}
47254732

@@ -4730,13 +4737,13 @@ namespace FourSlashInterface {
47304737
readonly includes?: Many<ExpectedCompletionEntry>;
47314738
readonly excludes?: Many<string | { readonly name: string, readonly source: string }>;
47324739
readonly preferences: ts.UserPreferences;
4733-
readonly triggerCharacter?: string;
4740+
readonly triggerCharacter?: ts.CompletionsTriggerCharacter;
47344741
}
47354742

47364743
export type Many<T> = T | ReadonlyArray<T>;
47374744

47384745
export interface VerifyCompletionListContainsOptions extends ts.UserPreferences {
4739-
triggerCharacter?: string;
4746+
triggerCharacter?: ts.CompletionsTriggerCharacter;
47404747
sourceDisplay: string;
47414748
isRecommended?: true;
47424749
insertText?: string;

src/server/protocol.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1765,6 +1765,8 @@ namespace ts.server.protocol {
17651765
arguments: FormatOnKeyRequestArgs;
17661766
}
17671767

1768+
export type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<";
1769+
17681770
/**
17691771
* Arguments for completions messages.
17701772
*/
@@ -1773,7 +1775,7 @@ namespace ts.server.protocol {
17731775
* Optional prefix to apply to possible completions.
17741776
*/
17751777
prefix?: string;
1776-
triggerCharacter?: string;
1778+
triggerCharacter?: CompletionsTriggerCharacter;
17771779
/**
17781780
* @deprecated Use UserPreferences.includeCompletionsForModuleExports
17791781
*/

src/services/completions.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace ts.Completions {
2525

2626
const enum GlobalsSearch { Continue, Success, Fail }
2727

28-
export function getCompletionsAtPosition(host: LanguageServiceHost, program: Program, log: Log, sourceFile: SourceFile, position: number, preferences: UserPreferences, triggerCharacter: string | undefined): CompletionInfo | undefined {
28+
export function getCompletionsAtPosition(host: LanguageServiceHost, program: Program, log: Log, sourceFile: SourceFile, position: number, preferences: UserPreferences, triggerCharacter: CompletionsTriggerCharacter | undefined): CompletionInfo | undefined {
2929
const typeChecker = program.getTypeChecker();
3030
const compilerOptions = program.getCompilerOptions();
3131
if (isInReferenceComment(sourceFile, position)) {
@@ -2208,8 +2208,12 @@ namespace ts.Completions {
22082208
return !!type.getStringIndexType() || !!type.getNumberIndexType();
22092209
}
22102210

2211-
function isValidTrigger(sourceFile: SourceFile, triggerCharacter: string, contextToken: Node, position: number): boolean {
2211+
function isValidTrigger(sourceFile: SourceFile, triggerCharacter: CompletionsTriggerCharacter, contextToken: Node, position: number): boolean {
22122212
switch (triggerCharacter) {
2213+
case ".":
2214+
case "/":
2215+
case "@":
2216+
return true;
22132217
case '"':
22142218
case "'":
22152219
case "`":
@@ -2219,7 +2223,7 @@ namespace ts.Completions {
22192223
// Opening JSX tag
22202224
return contextToken.kind === SyntaxKind.LessThanToken && contextToken.parent.kind !== SyntaxKind.BinaryExpression;
22212225
default:
2222-
return Debug.fail(triggerCharacter);
2226+
return Debug.assertNever(triggerCharacter);
22232227
}
22242228
}
22252229

src/services/types.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,11 @@ namespace ts {
358358

359359
export type OrganizeImportsScope = CombinedCodeFixScope;
360360

361+
export type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<";
362+
361363
export interface GetCompletionsAtPositionOptions extends UserPreferences {
362364
/** If the editor is asking for completions because a certain character was typed, and not because the user explicitly requested them, this should be set. */
363-
triggerCharacter?: string;
365+
triggerCharacter?: CompletionsTriggerCharacter;
364366
/** @deprecated Use includeCompletionsForModuleExports */
365367
includeExternalModuleExports?: boolean;
366368
/** @deprecated Use includeCompletionsWithInsertText */

tests/baselines/reference/api/tsserverlibrary.d.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -4539,9 +4539,10 @@ declare namespace ts {
45394539
fileName: string;
45404540
}
45414541
type OrganizeImportsScope = CombinedCodeFixScope;
4542+
type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<";
45424543
interface GetCompletionsAtPositionOptions extends UserPreferences {
45434544
/** If the editor is asking for completions because a certain character was typed, and not because the user explicitly requested them, this should be set. */
4544-
triggerCharacter?: string;
4545+
triggerCharacter?: CompletionsTriggerCharacter;
45454546
/** @deprecated Use includeCompletionsForModuleExports */
45464547
includeExternalModuleExports?: boolean;
45474548
/** @deprecated Use includeCompletionsWithInsertText */
@@ -6777,6 +6778,7 @@ declare namespace ts.server.protocol {
67776778
command: CommandTypes.Formatonkey;
67786779
arguments: FormatOnKeyRequestArgs;
67796780
}
6781+
type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<";
67806782
/**
67816783
* Arguments for completions messages.
67826784
*/
@@ -6785,7 +6787,7 @@ declare namespace ts.server.protocol {
67856787
* Optional prefix to apply to possible completions.
67866788
*/
67876789
prefix?: string;
6788-
triggerCharacter?: string;
6790+
triggerCharacter?: CompletionsTriggerCharacter;
67896791
/**
67906792
* @deprecated Use UserPreferences.includeCompletionsForModuleExports
67916793
*/

tests/baselines/reference/api/typescript.d.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -4539,9 +4539,10 @@ declare namespace ts {
45394539
fileName: string;
45404540
}
45414541
type OrganizeImportsScope = CombinedCodeFixScope;
4542+
type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<";
45424543
interface GetCompletionsAtPositionOptions extends UserPreferences {
45434544
/** If the editor is asking for completions because a certain character was typed, and not because the user explicitly requested them, this should be set. */
4544-
triggerCharacter?: string;
4545+
triggerCharacter?: CompletionsTriggerCharacter;
45454546
/** @deprecated Use includeCompletionsForModuleExports */
45464547
includeExternalModuleExports?: boolean;
45474548
/** @deprecated Use includeCompletionsWithInsertText */

0 commit comments

Comments
 (0)