From f9a00e23f5e340e4c5b458f1fcb7cb9fd23b6dea Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 17 Dec 2022 21:35:52 +0300 Subject: [PATCH 01/11] is that simple? --- src/services/completions.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/services/completions.ts b/src/services/completions.ts index 4193e651a037f..9322be1047778 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -1492,6 +1492,8 @@ function createCompletionEntry( isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, isImportStatementCompletion: !!importStatementCompletion || undefined, data, + //@ts-expect-error for plugins API + symbol }; } From 96898d4f2df7c16b52a99f9219cb5681262e4fb3 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 2 Feb 2023 07:16:26 +0300 Subject: [PATCH 02/11] poc --- src/services/completions.ts | 17 ++++++++++++----- src/services/services.ts | 3 ++- src/services/types.ts | 10 ++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 9322be1047778..1c7e4df01188b 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -362,6 +362,8 @@ import { UserPreferences, VariableDeclaration, walkUpParenthesizedExpressions, + CompletionEntryWithApiData, + CompletionInfoWithApiData, } from "./_namespaces/ts"; import { StringCompletions } from "./_namespaces/ts.Completions"; @@ -646,6 +648,7 @@ export function getCompletionsAtPosition( completionKind: CompletionTriggerKind | undefined, cancellationToken: CancellationToken, formatContext?: formatting.FormatContext, + includeApiData = false ): CompletionInfo | undefined { const { previousToken } = getRelevantTokens(position, sourceFile); if (triggerCharacter && !isInString(sourceFile, position, previousToken) && !isValidTrigger(sourceFile, triggerCharacter, previousToken, position)) { @@ -693,6 +696,11 @@ export function getCompletionsAtPosition( switch (completionData.kind) { case CompletionDataKind.Data: const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext, position); + if (response && !includeApiData) { + for (const entry of response.entries) { + delete entry.symbol + } + } if (response?.isIncomplete) { incompleteCompletionsCache?.set(response); } @@ -867,7 +875,7 @@ function completionInfoFromData( preferences: UserPreferences, formatContext: formatting.FormatContext | undefined, position: number -): CompletionInfo | undefined { +): CompletionInfoWithApiData | undefined { const { symbols, contextToken, @@ -920,7 +928,7 @@ function completionInfoFromData( }); } - const entries = createSortedArray(); + const entries = createSortedArray(); const isChecked = isCheckedFile(sourceFile, compilerOptions); if (isChecked && !isNewIdentifierLocation && (!symbols || symbols.length === 0) && keywordFilters === KeywordCompletionFilters.None) { return undefined; @@ -1339,7 +1347,7 @@ function createCompletionEntry( formatContext: formatting.FormatContext | undefined, isJsxIdentifierExpected: boolean | undefined, isRightOfOpenTag: boolean | undefined, -): CompletionEntry | undefined { +): CompletionEntryWithApiData | undefined { let insertText: string | undefined; let replacementSpan = getReplacementSpanForContextToken(replacementToken); let data: CompletionEntryData | undefined; @@ -1492,7 +1500,6 @@ function createCompletionEntry( isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, isImportStatementCompletion: !!importStatementCompletion || undefined, data, - //@ts-expect-error for plugins API symbol }; } @@ -2097,7 +2104,7 @@ function getSourceFromOrigin(origin: SymbolOriginInfo | undefined): string | und /** @internal */ export function getCompletionEntriesFromSymbols( symbols: readonly Symbol[], - entries: SortedArray, + entries: SortedArray, replacementToken: Node | undefined, contextToken: Node | undefined, location: Node, diff --git a/src/services/services.ts b/src/services/services.ts index f6e5fccfe06c6..07d9e6761e459 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1990,7 +1990,8 @@ export function createLanguageService( options.triggerCharacter, options.triggerKind, cancellationToken, - formattingSettings && formatting.getFormatContext(formattingSettings, host)); + formattingSettings && formatting.getFormatContext(formattingSettings, host), + options.includeApiProperties); } function getCompletionEntryDetails(fileName: string, position: number, name: string, formattingOptions: FormatCodeSettings | undefined, source: string | undefined, preferences: UserPreferences = emptyOptions, data?: CompletionEntryData): CompletionEntryDetails | undefined { diff --git a/src/services/types.ts b/src/services/types.ts index 11f22f4fc9472..975ddf434acc2 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -700,6 +700,8 @@ export interface GetCompletionsAtPositionOptions extends UserPreferences { */ triggerCharacter?: CompletionsTriggerCharacter; triggerKind?: CompletionTriggerKind; + /** @default false */ + includeApiProperties?: boolean /** @deprecated Use includeCompletionsForModuleExports */ includeExternalModuleExports?: boolean; /** @deprecated Use includeCompletionsWithInsertText */ @@ -1331,6 +1333,10 @@ export interface CompletionInfo { entries: CompletionEntry[]; } +export interface CompletionInfoWithApiData extends CompletionInfo { + entries: CompletionEntryWithApiData[] +} + export interface CompletionEntryDataAutoImport { /** * The name of the property or export in the module's symbol table. Differs from the completion name @@ -1390,6 +1396,10 @@ export interface CompletionEntry { data?: CompletionEntryData; } +export interface CompletionEntryWithApiData extends CompletionEntry { + symbol?: Symbol +} + export interface CompletionEntryLabelDetails { detail?: string; description?: string; From 99c7458724f3c35ad71dad7038d75ed562b0fba7 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 2 Feb 2023 08:51:18 +0300 Subject: [PATCH 03/11] fix eslint --- src/services/completions.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 1c7e4df01188b..fe9a5b8f65ad6 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -26,8 +26,10 @@ import { CompletionEntryDataUnresolved, CompletionEntryDetails, CompletionEntryLabelDetails, + CompletionEntryWithApiData, CompletionInfo, CompletionInfoFlags, + CompletionInfoWithApiData, CompletionsTriggerCharacter, CompletionTriggerKind, concatenate, @@ -362,8 +364,6 @@ import { UserPreferences, VariableDeclaration, walkUpParenthesizedExpressions, - CompletionEntryWithApiData, - CompletionInfoWithApiData, } from "./_namespaces/ts"; import { StringCompletions } from "./_namespaces/ts.Completions"; @@ -698,7 +698,7 @@ export function getCompletionsAtPosition( const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext, position); if (response && !includeApiData) { for (const entry of response.entries) { - delete entry.symbol + delete entry.symbol; } } if (response?.isIncomplete) { From 92dcef7c4de31c142949ee366be610989dc1ad0a Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 3 Feb 2023 11:45:49 +0300 Subject: [PATCH 04/11] rename public option + add jsdoc, add ls overload --- src/services/services.ts | 2 +- src/services/types.ts | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 07d9e6761e459..b9140d384eda1 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1991,7 +1991,7 @@ export function createLanguageService( options.triggerKind, cancellationToken, formattingSettings && formatting.getFormatContext(formattingSettings, host), - options.includeApiProperties); + options.includeApiData); } function getCompletionEntryDetails(fileName: string, position: number, name: string, formattingOptions: FormatCodeSettings | undefined, source: string | undefined, preferences: UserPreferences = emptyOptions, data?: CompletionEntryData): CompletionEntryDetails | undefined { diff --git a/src/services/types.ts b/src/services/types.ts index 975ddf434acc2..2602e44ad33c4 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -518,6 +518,7 @@ export interface LanguageService { * of code actions can be returned with the completions. * @param formattingSettings settings needed for calling formatting functions. */ + getCompletionsAtPosition(fileName: string, position: number, options: { includeApiData: true } & GetCompletionsAtPositionOptions, formattingSettings?: FormatCodeSettings): WithMetadata | undefined; getCompletionsAtPosition(fileName: string, position: number, options: GetCompletionsAtPositionOptions | undefined, formattingSettings?: FormatCodeSettings): WithMetadata | undefined; /** @@ -700,8 +701,13 @@ export interface GetCompletionsAtPositionOptions extends UserPreferences { */ triggerCharacter?: CompletionsTriggerCharacter; triggerKind?: CompletionTriggerKind; - /** @default false */ - includeApiProperties?: boolean + /** + * Include `symbol` with each completion entry. + * Caveats: + * - The `symbol` of completions may retain a whole `TypeChecker` in it, so don’t store it longer than you need it!) + * @default false + */ + includeApiData?: boolean /** @deprecated Use includeCompletionsForModuleExports */ includeExternalModuleExports?: boolean; /** @deprecated Use includeCompletionsWithInsertText */ From 941c080540f6e1f07571d97c051333520a3365ee Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 3 Feb 2023 12:07:11 +0300 Subject: [PATCH 05/11] add symbol conditionally pass includeApiData to createCompletionEntry --- src/services/completions.ts | 18 +++++++++--------- src/services/stringCompletions.ts | 17 +++++++++++++++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index fe9a5b8f65ad6..a3a5ceede9421 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -678,7 +678,7 @@ export function getCompletionsAtPosition( incompleteCompletionsCache?.clear(); } - const stringCompletions = StringCompletions.getStringLiteralCompletions(sourceFile, position, previousToken, compilerOptions, host, program, log, preferences); + const stringCompletions = StringCompletions.getStringLiteralCompletions(sourceFile, position, previousToken, compilerOptions, host, program, log, preferences, includeApiData); if (stringCompletions) { return stringCompletions; } @@ -695,12 +695,7 @@ export function getCompletionsAtPosition( switch (completionData.kind) { case CompletionDataKind.Data: - const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext, position); - if (response && !includeApiData) { - for (const entry of response.entries) { - delete entry.symbol; - } - } + const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext, position, includeApiData); if (response?.isIncomplete) { incompleteCompletionsCache?.set(response); } @@ -874,7 +869,8 @@ function completionInfoFromData( completionData: CompletionData, preferences: UserPreferences, formatContext: formatting.FormatContext | undefined, - position: number + position: number, + includeApiData: boolean | undefined, ): CompletionInfoWithApiData | undefined { const { symbols, @@ -959,6 +955,7 @@ function completionInfoFromData( symbolToSortTextMap, isJsxIdentifierExpected, isRightOfOpenTag, + includeApiData ); if (keywordFilters !== KeywordCompletionFilters.None) { @@ -1347,6 +1344,7 @@ function createCompletionEntry( formatContext: formatting.FormatContext | undefined, isJsxIdentifierExpected: boolean | undefined, isRightOfOpenTag: boolean | undefined, + includeApiData: boolean ): CompletionEntryWithApiData | undefined { let insertText: string | undefined; let replacementSpan = getReplacementSpanForContextToken(replacementToken); @@ -1500,7 +1498,7 @@ function createCompletionEntry( isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, isImportStatementCompletion: !!importStatementCompletion || undefined, data, - symbol + ...includeApiData ? { symbol } : {} }; } @@ -2128,6 +2126,7 @@ export function getCompletionEntriesFromSymbols( symbolToSortTextMap?: SymbolSortTextMap, isJsxIdentifierExpected?: boolean, isRightOfOpenTag?: boolean, + includeApiData = false ): UniqueNameSet { const start = timestamp(); const variableDeclaration = getVariableDeclaration(location); @@ -2173,6 +2172,7 @@ export function getCompletionEntriesFromSymbols( formatContext, isJsxIdentifierExpected, isRightOfOpenTag, + includeApiData ); if (!entry) { continue; diff --git a/src/services/stringCompletions.ts b/src/services/stringCompletions.ts index 205bbfc5d66d3..08614977b3648 100644 --- a/src/services/stringCompletions.ts +++ b/src/services/stringCompletions.ts @@ -190,7 +190,8 @@ export function getStringLiteralCompletions( host: LanguageServiceHost, program: Program, log: Log, - preferences: UserPreferences): CompletionInfo | undefined { + preferences: UserPreferences, + includeApiData: boolean): CompletionInfo | undefined { if (isInReferenceComment(sourceFile, position)) { const entries = getTripleSlashReferenceCompletion(sourceFile, position, options, host); return entries && convertPathCompletions(entries); @@ -198,7 +199,7 @@ export function getStringLiteralCompletions( if (isInString(sourceFile, position, contextToken)) { if (!contextToken || !isStringLiteralLike(contextToken)) return undefined; const entries = getStringLiteralCompletionEntries(sourceFile, contextToken, position, program.getTypeChecker(), options, host, preferences); - return convertStringLiteralCompletions(entries, contextToken, sourceFile, host, program, log, options, preferences, position); + return convertStringLiteralCompletions(entries, contextToken, sourceFile, host, program, log, options, preferences, position, includeApiData); } } @@ -212,6 +213,7 @@ function convertStringLiteralCompletions( options: CompilerOptions, preferences: UserPreferences, position: number, + includeApiData: boolean, ): CompletionInfo | undefined { if (completion === undefined) { return undefined; @@ -239,6 +241,17 @@ function convertStringLiteralCompletions( preferences, options, /*formatContext*/ undefined, + /*isTypeOnlyLocation */ undefined, + /*propertyAccessToConvert*/ undefined, + /*jsxIdentifierExpected*/ undefined, + /*isJsxInitializer*/ undefined, + /*importStatementCompletion*/ undefined, + /*recommendedCompletion*/ undefined, + /*symbolToOriginInfoMap*/ undefined, + /*symbolToSortTextMap*/ undefined, + /*isJsxIdentifierExpected*/ undefined, + /*isRightOfOpenTag*/ undefined, + includeApiData ); // Target will not be used, so arbitrary return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: completion.hasIndexSignature, optionalReplacementSpan, entries }; } From ae2a1415b21809d741db38d39bdc3ca1a20fe194 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Fri, 3 Feb 2023 20:48:50 +0300 Subject: [PATCH 06/11] up longer syntax Co-authored-by: Andrew Branch --- src/services/completions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index a3a5ceede9421..8f84677f573d4 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -1498,7 +1498,7 @@ function createCompletionEntry( isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, isImportStatementCompletion: !!importStatementCompletion || undefined, data, - ...includeApiData ? { symbol } : {} + ...includeApiData ? { symbol } : undefined }; } From 6818e41ed83d383aeb691156890e0ff181e60f66 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Thu, 16 Feb 2023 11:02:06 +0300 Subject: [PATCH 07/11] Update src/services/types.ts Co-authored-by: Andrew Branch --- src/services/types.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/types.ts b/src/services/types.ts index 2602e44ad33c4..de19102b51510 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -702,9 +702,9 @@ export interface GetCompletionsAtPositionOptions extends UserPreferences { triggerCharacter?: CompletionsTriggerCharacter; triggerKind?: CompletionTriggerKind; /** - * Include `symbol` with each completion entry. - * Caveats: - * - The `symbol` of completions may retain a whole `TypeChecker` in it, so don’t store it longer than you need it!) + * Include a `symbol` property on each completion entry object. + * Symbols reference cyclic data structures and sometimes an entire TypeChecker instance, + * so use caution when serializing or retaining completion entries retrieved with this option. * @default false */ includeApiData?: boolean From 601a6102140123dcdd0e8d04cd6a35b143193a22 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 16 Feb 2023 11:06:29 +0300 Subject: [PATCH 08/11] remove added interface, remove overload --- src/services/completions.ts | 10 ++++------ src/services/types.ts | 10 +--------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 8f84677f573d4..148fd6c6b0607 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -26,10 +26,8 @@ import { CompletionEntryDataUnresolved, CompletionEntryDetails, CompletionEntryLabelDetails, - CompletionEntryWithApiData, CompletionInfo, CompletionInfoFlags, - CompletionInfoWithApiData, CompletionsTriggerCharacter, CompletionTriggerKind, concatenate, @@ -871,7 +869,7 @@ function completionInfoFromData( formatContext: formatting.FormatContext | undefined, position: number, includeApiData: boolean | undefined, -): CompletionInfoWithApiData | undefined { +): CompletionInfo | undefined { const { symbols, contextToken, @@ -924,7 +922,7 @@ function completionInfoFromData( }); } - const entries = createSortedArray(); + const entries = createSortedArray(); const isChecked = isCheckedFile(sourceFile, compilerOptions); if (isChecked && !isNewIdentifierLocation && (!symbols || symbols.length === 0) && keywordFilters === KeywordCompletionFilters.None) { return undefined; @@ -1345,7 +1343,7 @@ function createCompletionEntry( isJsxIdentifierExpected: boolean | undefined, isRightOfOpenTag: boolean | undefined, includeApiData: boolean -): CompletionEntryWithApiData | undefined { +): CompletionEntry | undefined { let insertText: string | undefined; let replacementSpan = getReplacementSpanForContextToken(replacementToken); let data: CompletionEntryData | undefined; @@ -2102,7 +2100,7 @@ function getSourceFromOrigin(origin: SymbolOriginInfo | undefined): string | und /** @internal */ export function getCompletionEntriesFromSymbols( symbols: readonly Symbol[], - entries: SortedArray, + entries: SortedArray, replacementToken: Node | undefined, contextToken: Node | undefined, location: Node, diff --git a/src/services/types.ts b/src/services/types.ts index de19102b51510..6dc84a78aa1ed 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -518,7 +518,6 @@ export interface LanguageService { * of code actions can be returned with the completions. * @param formattingSettings settings needed for calling formatting functions. */ - getCompletionsAtPosition(fileName: string, position: number, options: { includeApiData: true } & GetCompletionsAtPositionOptions, formattingSettings?: FormatCodeSettings): WithMetadata | undefined; getCompletionsAtPosition(fileName: string, position: number, options: GetCompletionsAtPositionOptions | undefined, formattingSettings?: FormatCodeSettings): WithMetadata | undefined; /** @@ -1339,10 +1338,6 @@ export interface CompletionInfo { entries: CompletionEntry[]; } -export interface CompletionInfoWithApiData extends CompletionInfo { - entries: CompletionEntryWithApiData[] -} - export interface CompletionEntryDataAutoImport { /** * The name of the property or export in the module's symbol table. Differs from the completion name @@ -1391,6 +1386,7 @@ export interface CompletionEntry { isFromUncheckedFile?: true; isPackageJsonImport?: true; isImportStatementCompletion?: true; + symbol?: Symbol /** * A property to be sent back to TS Server in the CompletionDetailsRequest, along with `name`, * that allows TS Server to look up the symbol represented by the completion item, disambiguating @@ -1402,10 +1398,6 @@ export interface CompletionEntry { data?: CompletionEntryData; } -export interface CompletionEntryWithApiData extends CompletionEntry { - symbol?: Symbol -} - export interface CompletionEntryLabelDetails { detail?: string; description?: string; From 2259d1a0be54e1e705eeca720571338a492f2a1f Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 16 Feb 2023 11:08:05 +0300 Subject: [PATCH 09/11] rename all includeApiData -> includeSymbol --- src/services/completions.ts | 18 +++++++++--------- src/services/services.ts | 2 +- src/services/stringCompletions.ts | 8 ++++---- src/services/types.ts | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 148fd6c6b0607..2553465616bcf 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -646,7 +646,7 @@ export function getCompletionsAtPosition( completionKind: CompletionTriggerKind | undefined, cancellationToken: CancellationToken, formatContext?: formatting.FormatContext, - includeApiData = false + includeSymbol = false ): CompletionInfo | undefined { const { previousToken } = getRelevantTokens(position, sourceFile); if (triggerCharacter && !isInString(sourceFile, position, previousToken) && !isValidTrigger(sourceFile, triggerCharacter, previousToken, position)) { @@ -676,7 +676,7 @@ export function getCompletionsAtPosition( incompleteCompletionsCache?.clear(); } - const stringCompletions = StringCompletions.getStringLiteralCompletions(sourceFile, position, previousToken, compilerOptions, host, program, log, preferences, includeApiData); + const stringCompletions = StringCompletions.getStringLiteralCompletions(sourceFile, position, previousToken, compilerOptions, host, program, log, preferences, includeSymbol); if (stringCompletions) { return stringCompletions; } @@ -693,7 +693,7 @@ export function getCompletionsAtPosition( switch (completionData.kind) { case CompletionDataKind.Data: - const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext, position, includeApiData); + const response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences, formatContext, position, includeSymbol); if (response?.isIncomplete) { incompleteCompletionsCache?.set(response); } @@ -868,7 +868,7 @@ function completionInfoFromData( preferences: UserPreferences, formatContext: formatting.FormatContext | undefined, position: number, - includeApiData: boolean | undefined, + includeSymbol: boolean | undefined, ): CompletionInfo | undefined { const { symbols, @@ -953,7 +953,7 @@ function completionInfoFromData( symbolToSortTextMap, isJsxIdentifierExpected, isRightOfOpenTag, - includeApiData + includeSymbol ); if (keywordFilters !== KeywordCompletionFilters.None) { @@ -1342,7 +1342,7 @@ function createCompletionEntry( formatContext: formatting.FormatContext | undefined, isJsxIdentifierExpected: boolean | undefined, isRightOfOpenTag: boolean | undefined, - includeApiData: boolean + includeSymbol: boolean ): CompletionEntry | undefined { let insertText: string | undefined; let replacementSpan = getReplacementSpanForContextToken(replacementToken); @@ -1496,7 +1496,7 @@ function createCompletionEntry( isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, isImportStatementCompletion: !!importStatementCompletion || undefined, data, - ...includeApiData ? { symbol } : undefined + ...includeSymbol ? { symbol } : undefined }; } @@ -2124,7 +2124,7 @@ export function getCompletionEntriesFromSymbols( symbolToSortTextMap?: SymbolSortTextMap, isJsxIdentifierExpected?: boolean, isRightOfOpenTag?: boolean, - includeApiData = false + includeSymbol = false ): UniqueNameSet { const start = timestamp(); const variableDeclaration = getVariableDeclaration(location); @@ -2170,7 +2170,7 @@ export function getCompletionEntriesFromSymbols( formatContext, isJsxIdentifierExpected, isRightOfOpenTag, - includeApiData + includeSymbol ); if (!entry) { continue; diff --git a/src/services/services.ts b/src/services/services.ts index b9140d384eda1..fb665bdf61c3a 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1991,7 +1991,7 @@ export function createLanguageService( options.triggerKind, cancellationToken, formattingSettings && formatting.getFormatContext(formattingSettings, host), - options.includeApiData); + options.includeSymbol); } function getCompletionEntryDetails(fileName: string, position: number, name: string, formattingOptions: FormatCodeSettings | undefined, source: string | undefined, preferences: UserPreferences = emptyOptions, data?: CompletionEntryData): CompletionEntryDetails | undefined { diff --git a/src/services/stringCompletions.ts b/src/services/stringCompletions.ts index 08614977b3648..af460d88ee690 100644 --- a/src/services/stringCompletions.ts +++ b/src/services/stringCompletions.ts @@ -191,7 +191,7 @@ export function getStringLiteralCompletions( program: Program, log: Log, preferences: UserPreferences, - includeApiData: boolean): CompletionInfo | undefined { + includeSymbol: boolean): CompletionInfo | undefined { if (isInReferenceComment(sourceFile, position)) { const entries = getTripleSlashReferenceCompletion(sourceFile, position, options, host); return entries && convertPathCompletions(entries); @@ -199,7 +199,7 @@ export function getStringLiteralCompletions( if (isInString(sourceFile, position, contextToken)) { if (!contextToken || !isStringLiteralLike(contextToken)) return undefined; const entries = getStringLiteralCompletionEntries(sourceFile, contextToken, position, program.getTypeChecker(), options, host, preferences); - return convertStringLiteralCompletions(entries, contextToken, sourceFile, host, program, log, options, preferences, position, includeApiData); + return convertStringLiteralCompletions(entries, contextToken, sourceFile, host, program, log, options, preferences, position, includeSymbol); } } @@ -213,7 +213,7 @@ function convertStringLiteralCompletions( options: CompilerOptions, preferences: UserPreferences, position: number, - includeApiData: boolean, + includeSymbol: boolean, ): CompletionInfo | undefined { if (completion === undefined) { return undefined; @@ -251,7 +251,7 @@ function convertStringLiteralCompletions( /*symbolToSortTextMap*/ undefined, /*isJsxIdentifierExpected*/ undefined, /*isRightOfOpenTag*/ undefined, - includeApiData + includeSymbol ); // Target will not be used, so arbitrary return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: completion.hasIndexSignature, optionalReplacementSpan, entries }; } diff --git a/src/services/types.ts b/src/services/types.ts index 6dc84a78aa1ed..bae74703f99d4 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -706,7 +706,7 @@ export interface GetCompletionsAtPositionOptions extends UserPreferences { * so use caution when serializing or retaining completion entries retrieved with this option. * @default false */ - includeApiData?: boolean + includeSymbol?: boolean /** @deprecated Use includeCompletionsForModuleExports */ includeExternalModuleExports?: boolean; /** @deprecated Use includeCompletionsWithInsertText */ From 5073d8e799b3e18fa0b43cfc3ddface8f3ecaed9 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 16 Feb 2023 11:15:22 +0300 Subject: [PATCH 10/11] add jsdoc describing `symbol` Why? Its always undefined by default and someone might not know about added option --- src/services/types.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/services/types.ts b/src/services/types.ts index bae74703f99d4..983aa7bbbb5f0 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -1386,6 +1386,11 @@ export interface CompletionEntry { isFromUncheckedFile?: true; isPackageJsonImport?: true; isImportStatementCompletion?: true; + /** + * For API purposes. + * Included for non-string completions only when `includeSymbol: true` option is passed to `getCompletionsAtPosition`. + * @example Get declaration of completion: `symbol.valueDeclaration` + */ symbol?: Symbol /** * A property to be sent back to TS Server in the CompletionDetailsRequest, along with `name`, From d886f8cd1ba2f5bd99ffcad52568d0d15682de92 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 16 Feb 2023 20:44:36 +0300 Subject: [PATCH 11/11] pnpm hereby baseline-accept --- tests/baselines/reference/api/tsserverlibrary.d.ts | 13 +++++++++++++ tests/baselines/reference/api/typescript.d.ts | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 035abc4d7ff10..dd488ea21b4c1 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -10072,6 +10072,13 @@ declare namespace ts { */ triggerCharacter?: CompletionsTriggerCharacter; triggerKind?: CompletionTriggerKind; + /** + * Include a `symbol` property on each completion entry object. + * Symbols reference cyclic data structures and sometimes an entire TypeChecker instance, + * so use caution when serializing or retaining completion entries retrieved with this option. + * @default false + */ + includeSymbol?: boolean; /** @deprecated Use includeCompletionsForModuleExports */ includeExternalModuleExports?: boolean; /** @deprecated Use includeCompletionsWithInsertText */ @@ -10629,6 +10636,12 @@ declare namespace ts { isFromUncheckedFile?: true; isPackageJsonImport?: true; isImportStatementCompletion?: true; + /** + * For API purposes. + * Included for non-string completions only when `includeSymbol: true` option is passed to `getCompletionsAtPosition`. + * @example Get declaration of completion: `symbol.valueDeclaration` + */ + symbol?: Symbol; /** * A property to be sent back to TS Server in the CompletionDetailsRequest, along with `name`, * that allows TS Server to look up the symbol represented by the completion item, disambiguating diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index a8a5c3bb97f1b..a355db267c1ba 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -6170,6 +6170,13 @@ declare namespace ts { */ triggerCharacter?: CompletionsTriggerCharacter; triggerKind?: CompletionTriggerKind; + /** + * Include a `symbol` property on each completion entry object. + * Symbols reference cyclic data structures and sometimes an entire TypeChecker instance, + * so use caution when serializing or retaining completion entries retrieved with this option. + * @default false + */ + includeSymbol?: boolean; /** @deprecated Use includeCompletionsForModuleExports */ includeExternalModuleExports?: boolean; /** @deprecated Use includeCompletionsWithInsertText */ @@ -6727,6 +6734,12 @@ declare namespace ts { isFromUncheckedFile?: true; isPackageJsonImport?: true; isImportStatementCompletion?: true; + /** + * For API purposes. + * Included for non-string completions only when `includeSymbol: true` option is passed to `getCompletionsAtPosition`. + * @example Get declaration of completion: `symbol.valueDeclaration` + */ + symbol?: Symbol; /** * A property to be sent back to TS Server in the CompletionDetailsRequest, along with `name`, * that allows TS Server to look up the symbol represented by the completion item, disambiguating