From 04292e8376ba083484d337d46ed023da3785a284 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 29 Mar 2016 16:51:06 +0200 Subject: [PATCH] parameter hints --- .../typescript/common/languageFeatures.ts | 68 +++++++++++++++++-- .../typescript/common/worker/worker.ts | 4 ++ .../typescript/common/worker/workerImpl.ts | 4 ++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/vs/languages/typescript/common/languageFeatures.ts b/src/vs/languages/typescript/common/languageFeatures.ts index 961525db874..92ee233d806 100644 --- a/src/vs/languages/typescript/common/languageFeatures.ts +++ b/src/vs/languages/typescript/common/languageFeatures.ts @@ -13,6 +13,7 @@ import * as ts from 'vs/languages/typescript/common/lib/typescriptServices'; import AbstractWorker from './worker/worker'; import {IModelService} from 'vs/editor/common/services/modelService'; import {SuggestRegistry} from 'vs/editor/contrib/suggest/common/suggest'; +import {ParameterHintsRegistry} from 'vs/editor/contrib/parameterHints/common/parameterHints'; import {OccurrencesRegistry} from 'vs/editor/contrib/wordHighlighter/common/wordHighlighter'; import {ExtraInfoRegistry} from 'vs/editor/contrib/hover/common/hover'; import {ReferenceRegistry} from 'vs/editor/contrib/referenceSearch/common/referenceSearch'; @@ -21,6 +22,7 @@ import {DeclarationRegistry} from 'vs/editor/contrib/goToDeclaration/common/goTo export default function registerLanguageFeatures(selector: string, modelService: IModelService, worker: () => TPromise): lifecycle.IDisposable { const disposables: lifecycle.IDisposable[] = []; disposables.push(SuggestRegistry.register(selector, new SuggestAdapter(modelService, worker))); + disposables.push(ParameterHintsRegistry.register(selector, new ParameterHintsAdapter(modelService, worker))); disposables.push(ExtraInfoRegistry.register(selector, new QuickInfoAdapter(modelService, worker))); disposables.push(OccurrencesRegistry.register(selector, new OccurrencesAdapter(modelService, worker))); disposables.push(DeclarationRegistry.register(selector, new DeclarationAdapter(modelService, worker))); @@ -79,7 +81,9 @@ class SuggestAdapter extends Adapter implements modes.ISuggestSupport { return this._worker().then(worker => { return worker.getCompletionsAtPosition(resource.toString(), offset); }).then(info => { - + if (!info) { + return; + } let suggestions = info.entries.map(entry => { return { label: entry.name, @@ -103,6 +107,9 @@ class SuggestAdapter extends Adapter implements modes.ISuggestSupport { suggestion.label); }).then(details => { + if (!details) { + return suggestion; + } return { label: details.name, codeSnippet: details.name, @@ -130,6 +137,59 @@ class SuggestAdapter extends Adapter implements modes.ISuggestSupport { } } +class ParameterHintsAdapter extends Adapter implements modes.IParameterHintsSupport { + getParameterHintsTriggerCharacters(): string[] { + return ['(', ',']; + } + shouldTriggerParameterHints(context: modes.ILineContext, offset: number): boolean { + return true; + } + getParameterHints(resource: URI, position: editor.IPosition, triggerCharacter?: string): TPromise { + return this._worker().then(worker => worker.getSignatureHelpItems(resource.toString(), this._positionToOffset(resource, position))).then(info => { + + if (!info) { + return; + } + + let ret = { + currentSignature: info.selectedItemIndex, + currentParameter: info.argumentIndex, + signatures: [] + }; + + info.items.forEach(item => { + + let signature = { + label: '', + documentation: null, + parameters: [] + }; + + signature.label += ts.displayPartsToString(item.prefixDisplayParts); + item.parameters.forEach((p, i, a) => { + let label = ts.displayPartsToString(p.displayParts); + let parameter = { + label: label, + documentation: ts.displayPartsToString(p.documentation), + signatureLabelOffset: signature.label.length, + signatureLabelEnd: signature.label.length + label.length + }; + signature.label += label; + signature.parameters.push(parameter); + if (i < a.length - 1) { + signature.label += ts.displayPartsToString(item.separatorDisplayParts); + } + }); + signature.label += ts.displayPartsToString(item.suffixDisplayParts); + ret.signatures.push(signature); + }); + + return ret; + + }); + } +} + // --- hover ------ class QuickInfoAdapter extends Adapter implements modes.IExtraInfoSupport { @@ -153,7 +213,7 @@ class QuickInfoAdapter extends Adapter implements modes.IExtraInfoSupport { class OccurrencesAdapter extends Adapter implements modes.IOccurrencesSupport { - findOccurrences(resource: URI, position: editor.IPosition, strict?: boolean): TPromise{ + findOccurrences(resource: URI, position: editor.IPosition, strict?: boolean): TPromise { return this._worker().then(worker => { return worker.getOccurrencesAtPosition(resource.toString(), this._positionToOffset(resource, position)); }).then(entries => { @@ -174,7 +234,7 @@ class OccurrencesAdapter extends Adapter implements modes.IOccurrencesSupport { class DeclarationAdapter extends Adapter implements modes.IDeclarationSupport { - canFindDeclaration(context: modes.ILineContext, offset: number): boolean{ + canFindDeclaration(context: modes.ILineContext, offset: number): boolean { return true; } @@ -212,7 +272,7 @@ class ReferenceAdapter extends Adapter implements modes.IReferenceSupport { * @returns a list of reference of the symbol at the position in the * given resource. */ - findReferences(resource: URI, position: editor.IPosition, includeDeclaration: boolean): TPromise{ + findReferences(resource: URI, position: editor.IPosition, includeDeclaration: boolean): TPromise { return this._worker().then(worker => { return worker.getReferencesAtPosition(resource.toString(), this._positionToOffset(resource, position)); }).then(entries => { diff --git a/src/vs/languages/typescript/common/worker/worker.ts b/src/vs/languages/typescript/common/worker/worker.ts index e90c1c8df32..ef569d21acb 100644 --- a/src/vs/languages/typescript/common/worker/worker.ts +++ b/src/vs/languages/typescript/common/worker/worker.ts @@ -45,6 +45,10 @@ abstract class AbstractWorker implements IRequestHandler { throw notImplemented(); } + getSignatureHelpItems(fileName: string, position:number): TPromise { + throw notImplemented(); + } + getQuickInfoAtPosition(fileName: string, position: number): TPromise { throw notImplemented(); } diff --git a/src/vs/languages/typescript/common/worker/workerImpl.ts b/src/vs/languages/typescript/common/worker/workerImpl.ts index 632526431c5..913857568de 100644 --- a/src/vs/languages/typescript/common/worker/workerImpl.ts +++ b/src/vs/languages/typescript/common/worker/workerImpl.ts @@ -85,6 +85,10 @@ class TypeScriptWorker extends AbstractWorker implements ts.LanguageServiceHost return TPromise.as(this._languageService.getCompletionEntryDetails(fileName, position, entry)); } + getSignatureHelpItems(fileName: string, position:number): TPromise { + return TPromise.as(this._languageService.getSignatureHelpItems(fileName, position)); + } + getQuickInfoAtPosition(fileName: string, position: number): TPromise { return TPromise.as(this._languageService.getQuickInfoAtPosition(fileName, position)); } -- GitLab