From 790af0acf6912be44894b10d4c426695bfb0be52 Mon Sep 17 00:00:00 2001 From: Sam El-Husseini Date: Fri, 9 Sep 2016 09:25:36 -0700 Subject: [PATCH 1/6] Surfacing method to get Completion Symbol instead of details for better extensibility --- src/services/completions.ts | 20 ++++++++++++++++++++ src/services/services.ts | 5 +++++ src/services/types.ts | 1 + 3 files changed, 26 insertions(+) diff --git a/src/services/completions.ts b/src/services/completions.ts index 5dc15b1cb09..e9ec9f7479e 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -735,6 +735,26 @@ 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. + const symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(typeChecker, s, compilerOptions.target, /*performCharacterChecks*/ false, location) === entryName ? s : undefined); + + if (symbol) { + return symbol; + } + } + + 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 084b372516d..22d40e9a2eb 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1351,6 +1351,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(); diff --git a/src/services/types.ts b/src/services/types.ts index b8c9122fb90..c1aebeb8500 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; From 1021e80a5b46f8434c705262d6a8516406a35aa8 Mon Sep 17 00:00:00 2001 From: Sam El-Husseini Date: Fri, 9 Sep 2016 09:30:41 -0700 Subject: [PATCH 2/6] Surfacing function in services.ts --- src/services/services.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/services.ts b/src/services/services.ts index 22d40e9a2eb..ec157a95642 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1918,6 +1918,7 @@ namespace ts { getEncodedSemanticClassifications, getCompletionsAtPosition, getCompletionEntryDetails, + getCompletionEntrySymbol, getSignatureHelpItems, getQuickInfoAtPosition, getDefinitionAtPosition, From d31f867f57193f9eb1bfb3091b80ee90bf57b63a Mon Sep 17 00:00:00 2001 From: Sam El-Husseini Date: Fri, 9 Sep 2016 12:54:50 -0700 Subject: [PATCH 3/6] Adding method stub for the LanguageServiceShimProxy implementation --- src/harness/harnessLanguageService.ts | 3 +++ 1 file changed, 3 insertions(+) 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)); } From f9492d0e734e7884fca667a7d244b86822c85696 Mon Sep 17 00:00:00 2001 From: Sam El-Husseini Date: Fri, 9 Sep 2016 13:07:31 -0700 Subject: [PATCH 4/6] method stub throwing an error for SessionClient --- src/server/client.ts | 4 ++++ 1 file changed, 4 insertions(+) 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, From 72c5c2b088535052e7e1697eed46ad1236e65807 Mon Sep 17 00:00:00 2001 From: Sam El-Husseini Date: Fri, 9 Sep 2016 13:34:30 -0700 Subject: [PATCH 5/6] lint: remove trailing whitespace in completions.ts --- 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 e9ec9f7479e..9669f34eedd 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -735,7 +735,7 @@ 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); From f8b11fb48731d2da855ae8904df1707f5faa0585 Mon Sep 17 00:00:00 2001 From: Sam El-Husseini Date: Fri, 9 Sep 2016 15:17:54 -0700 Subject: [PATCH 6/6] minor changes from PR feedback --- src/services/completions.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index 9669f34eedd..121eaf83442 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -746,11 +746,7 @@ namespace ts.Completions { // 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. - const symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(typeChecker, s, compilerOptions.target, /*performCharacterChecks*/ false, location) === entryName ? s : undefined); - - if (symbol) { - return symbol; - } + return forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(typeChecker, s, compilerOptions.target, /*performCharacterChecks*/ false, location) === entryName ? s : undefined); } return undefined;