diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 31f8a37aa3c..3518174cc2d 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -408,6 +408,9 @@ namespace Harness.LanguageService { getCompletionEntryDetails(fileName: string, position: number, entryName: string): ts.CompletionEntryDetails { return unwrapJSONCallResult(this.shim.getCompletionEntryDetails(fileName, position, entryName)); } + getCompletionEntrySymbol(fileName: string, position: number, entryName: string): ts.Symbol { + throw new Error("getCompletionEntrySymbol not implemented across the shim layer."); + } getQuickInfoAtPosition(fileName: string, position: number): ts.QuickInfo { return unwrapJSONCallResult(this.shim.getQuickInfoAtPosition(fileName, position)); } diff --git a/src/server/client.ts b/src/server/client.ts index ca2d517701f..8391300d468 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -246,6 +246,10 @@ namespace ts.server { return response.body[0]; } + getCompletionEntrySymbol(fileName: string, position: number, entryName: string): Symbol { + throw new Error("Not Implemented Yet."); + } + getNavigateToItems(searchValue: string): NavigateToItem[] { const args: protocol.NavtoRequestArgs = { searchValue, diff --git a/src/services/completions.ts b/src/services/completions.ts index 5dc15b1cb09..121eaf83442 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -736,6 +736,22 @@ namespace ts.Completions { return undefined; } + export function getCompletionEntrySymbol(typeChecker: TypeChecker, log: (message: string) => void, compilerOptions: CompilerOptions, sourceFile: SourceFile, position: number, entryName: string): Symbol { + // Compute all the completion symbols again. + const completionData = getCompletionData(typeChecker, log, sourceFile, position); + if (completionData) { + const { symbols, location } = completionData; + + // Find the symbol with the matching entry name. + // We don't need to perform character checks here because we're only comparing the + // name against 'entryName' (which is known to be good), not building a new + // completion entry. + return forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(typeChecker, s, compilerOptions.target, /*performCharacterChecks*/ false, location) === entryName ? s : undefined); + } + + return undefined; + } + function getCompletionData(typeChecker: TypeChecker, log: (message: string) => void, sourceFile: SourceFile, position: number) { const isJavaScriptFile = isSourceFileJavaScript(sourceFile); diff --git a/src/services/services.ts b/src/services/services.ts index 5c3f7e7e2d1..bdc6fe62d5d 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1206,6 +1206,11 @@ namespace ts { return Completions.getCompletionEntryDetails(program.getTypeChecker(), log, program.getCompilerOptions(), getValidSourceFile(fileName), position, entryName); } + function getCompletionEntrySymbol(fileName: string, position: number, entryName: string): Symbol { + synchronizeHostData(); + return Completions.getCompletionEntrySymbol(program.getTypeChecker(), log, program.getCompilerOptions(), getValidSourceFile(fileName), position, entryName); + } + function getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { synchronizeHostData(); @@ -1768,6 +1773,7 @@ namespace ts { getEncodedSemanticClassifications, getCompletionsAtPosition, getCompletionEntryDetails, + getCompletionEntrySymbol, getSignatureHelpItems, getQuickInfoAtPosition, getDefinitionAtPosition, diff --git a/src/services/types.ts b/src/services/types.ts index b930a958377..5b0635e706d 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -194,6 +194,7 @@ namespace ts { getCompletionsAtPosition(fileName: string, position: number): CompletionInfo; getCompletionEntryDetails(fileName: string, position: number, entryName: string): CompletionEntryDetails; + getCompletionEntrySymbol(fileName: string, position: number, entryName: string): Symbol; getQuickInfoAtPosition(fileName: string, position: number): QuickInfo;