From 9312aa5fe7110ac18a71d6876ea3c2470c2180ea Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 Aug 2016 14:00:16 +0200 Subject: [PATCH] debt - provideCompletionItems should not return an array --- .../browser/standalone/standaloneLanguages.ts | 6 ++-- src/vs/editor/common/modes.ts | 2 +- .../common/modes/supports/suggestSupport.ts | 16 +++------- .../common/services/editorSimpleWorker.ts | 8 ++--- .../common/services/editorWorkerService.ts | 2 +- .../services/editorWorkerServiceImpl.ts | 4 +-- .../editor/contrib/suggest/common/suggest.ts | 32 ++++++++----------- .../suggest/test/common/suggest.test.ts | 4 +-- .../languages/handlebars/common/handlebars.ts | 2 +- src/vs/languages/html/common/html.ts | 4 +-- src/vs/languages/html/common/htmlWorker.ts | 6 ++-- .../html/test/common/html-worker.test.ts | 2 +- src/vs/languages/razor/common/razor.ts | 2 +- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- .../api/node/extHostLanguageFeatures.ts | 6 ++-- .../api/node/mainThreadLanguageFeatures.ts | 2 +- 16 files changed, 43 insertions(+), 57 deletions(-) diff --git a/src/vs/editor/browser/standalone/standaloneLanguages.ts b/src/vs/editor/browser/standalone/standaloneLanguages.ts index 9a7c52cb2e4..5479f5d0cab 100644 --- a/src/vs/editor/browser/standalone/standaloneLanguages.ts +++ b/src/vs/editor/browser/standalone/standaloneLanguages.ts @@ -197,7 +197,7 @@ export function registerCompletionItemProvider(languageId:string, provider:Compl let adapter = new SuggestAdapter(provider); return modes.SuggestRegistry.register(languageId, { triggerCharacters: provider.triggerCharacters, - provideCompletionItems: (model:editorCommon.IReadOnlyModel, position:Position, token:CancellationToken): Thenable => { + provideCompletionItems: (model:editorCommon.IReadOnlyModel, position:Position, token:CancellationToken): Thenable => { return adapter.provideCompletionItems(model, position, token); }, resolveCompletionItem: (model:editorCommon.IReadOnlyModel, position:Position, suggestion: modes.ISuggestion, token: CancellationToken): Thenable => { @@ -394,7 +394,7 @@ class SuggestAdapter { }; } - provideCompletionItems(model:editorCommon.IReadOnlyModel, position:Position, token:CancellationToken): Thenable { + provideCompletionItems(model:editorCommon.IReadOnlyModel, position:Position, token:CancellationToken): Thenable { return toThenable(this._provider.provideCompletionItems(model, position, token)).then(value => { const result: modes.ISuggestResult = { @@ -457,7 +457,7 @@ class SuggestAdapter { result.suggestions.push(suggestion); } - return [result]; + return result; }); } diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index fe6b158d7d5..80fbfaf89b6 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -399,7 +399,7 @@ export interface ISuggestSupport { filter?: IFilter; - provideCompletionItems(model:editorCommon.IReadOnlyModel, position:Position, token:CancellationToken): ISuggestResult[] | Thenable; + provideCompletionItems(model:editorCommon.IReadOnlyModel, position:Position, token:CancellationToken): ISuggestResult | Thenable; resolveCompletionItem?(model:editorCommon.IReadOnlyModel, position:Position, item: ISuggestion, token: CancellationToken): ISuggestion | Thenable; } diff --git a/src/vs/editor/common/modes/supports/suggestSupport.ts b/src/vs/editor/common/modes/supports/suggestSupport.ts index 9c9c0ae3e05..8319a3ade9f 100644 --- a/src/vs/editor/common/modes/supports/suggestSupport.ts +++ b/src/vs/editor/common/modes/supports/suggestSupport.ts @@ -31,28 +31,22 @@ export class TextualSuggestSupport implements ISuggestSupport { this._configurationService = configurationService; } - public provideCompletionItems(model:IReadOnlyModel, position:Position, token:CancellationToken): ISuggestResult[] | Thenable { + public provideCompletionItems(model:IReadOnlyModel, position:Position, token:CancellationToken): Thenable { let config = this._configurationService.getConfiguration<{ wordBasedSuggestions: boolean }>('editor'); if (!config || config.wordBasedSuggestions) { return wireCancellationToken(token, this._editorWorkerService.textualSuggest(model.uri, position)); } - return []; } } -export function filterSuggestions(value: ISuggestResult): ISuggestResult[] { +export function filterSuggestions(value: ISuggestResult): ISuggestResult { if (!value) { return; } - // filter suggestions - var accept = fuzzyContiguousFilter, - result: ISuggestResult[] = []; - result.push({ + return { currentWord: value.currentWord, - suggestions: value.suggestions.filter((element) => !!accept(value.currentWord, element.label)), + suggestions: value.suggestions.filter((element) => !!fuzzyContiguousFilter(value.currentWord, element.label)), incomplete: value.incomplete - }); - - return result; + }; } diff --git a/src/vs/editor/common/services/editorSimpleWorker.ts b/src/vs/editor/common/services/editorSimpleWorker.ts index a517118a1cf..24c4421ce64 100644 --- a/src/vs/editor/common/services/editorSimpleWorker.ts +++ b/src/vs/editor/common/services/editorSimpleWorker.ts @@ -234,7 +234,7 @@ export abstract class BaseEditorSimpleWorker { // ---- BEGIN suggest -------------------------------------------------------------------------- - public textualSuggest(modelUrl:string, position: editorCommon.IPosition, wordDef:string, wordDefFlags:string): TPromise { + public textualSuggest(modelUrl:string, position: editorCommon.IPosition, wordDef:string, wordDefFlags:string): TPromise { let model = this._getModel(modelUrl); if (!model) { return null; @@ -243,15 +243,15 @@ export abstract class BaseEditorSimpleWorker { return TPromise.as(this._suggestFiltered(model, position, new RegExp(wordDef, wordDefFlags))); } - private _suggestFiltered(model:ICommonModel, position: editorCommon.IPosition, wordDefRegExp: RegExp): ISuggestResult[] { + private _suggestFiltered(model:ICommonModel, position: editorCommon.IPosition, wordDefRegExp: RegExp): ISuggestResult { let value = this._suggestUnfiltered(model, position, wordDefRegExp); // filter suggestions - return [{ + return { currentWord: value.currentWord, suggestions: value.suggestions.filter((element) => !!fuzzyContiguousFilter(value.currentWord, element.label)), incomplete: value.incomplete - }]; + }; } private _suggestUnfiltered(model:ICommonModel, position:editorCommon.IPosition, wordDefRegExp: RegExp): ISuggestResult { diff --git a/src/vs/editor/common/services/editorWorkerService.ts b/src/vs/editor/common/services/editorWorkerService.ts index 6ae27e9af0f..76b818f6d8f 100644 --- a/src/vs/editor/common/services/editorWorkerService.ts +++ b/src/vs/editor/common/services/editorWorkerService.ts @@ -18,6 +18,6 @@ export interface IEditorWorkerService { computeDiff(original:URI, modified:URI, ignoreTrimWhitespace:boolean):TPromise; computeDirtyDiff(original:URI, modified:URI, ignoreTrimWhitespace:boolean):TPromise; - textualSuggest(resource: URI, position: IPosition): TPromise; + textualSuggest(resource: URI, position: IPosition): TPromise; navigateValueSet(resource: URI, range:IRange, up:boolean): TPromise; } diff --git a/src/vs/editor/common/services/editorWorkerServiceImpl.ts b/src/vs/editor/common/services/editorWorkerServiceImpl.ts index 88988dfecef..98fd75e07a7 100644 --- a/src/vs/editor/common/services/editorWorkerServiceImpl.ts +++ b/src/vs/editor/common/services/editorWorkerServiceImpl.ts @@ -58,7 +58,7 @@ export class EditorWorkerServiceImpl implements IEditorWorkerService { return this._workerManager.withWorker().then(client => client.computeDirtyDiff(original, modified, ignoreTrimWhitespace)); } - public textualSuggest(resource: URI, position: editorCommon.IPosition): TPromise { + public textualSuggest(resource: URI, position: editorCommon.IPosition): TPromise { return this._workerManager.withWorker().then(client => client.textualSuggest(resource, position)); } @@ -316,7 +316,7 @@ export class EditorWorkerClient extends Disposable { }); } - public textualSuggest(resource: URI, position: editorCommon.IPosition): TPromise { + public textualSuggest(resource: URI, position: editorCommon.IPosition): TPromise { return this._withSyncedResources([resource]).then(proxy => { let model = this._modelService.getModel(resource); if (!model) { diff --git a/src/vs/editor/contrib/suggest/common/suggest.ts b/src/vs/editor/contrib/suggest/common/suggest.ts index 3c7ecb0e219..8f311d59ec9 100644 --- a/src/vs/editor/contrib/suggest/common/suggest.ts +++ b/src/vs/editor/contrib/suggest/common/suggest.ts @@ -44,11 +44,11 @@ const snippetSuggestSupport: ISuggestSupport = { triggerCharacters: [], - provideCompletionItems(model: IReadOnlyModel, position: Position): ISuggestResult[] { + provideCompletionItems(model: IReadOnlyModel, position: Position): ISuggestResult { // currentWord is irrelevant, all suggestion use overwriteBefore const result: ISuggestResult = { suggestions: [], currentWord: '' }; Registry.as(Extensions.Snippets).getSnippetCompletions(model, position, result.suggestions); - return [result]; + return result; } }; @@ -71,28 +71,22 @@ export function provideSuggestionItems(model: IReadOnlyModel, position: Position return; } // for each support in the group ask for suggestions - return TPromise.join(supports.map(support => asWinJsPromise(token => support.provideCompletionItems(model, position, token)).then(values => { - - if (isFalsyOrEmpty(values)) { - return; - } + return TPromise.join(supports.map(support => asWinJsPromise(token => support.provideCompletionItems(model, position, token)).then(container => { const len = result.length; - for (let container of values) { - if (container && !isFalsyOrEmpty(container.suggestions)) { - for (let suggestion of container.suggestions) { - if (acceptSuggestion(suggestion)) { + if (container && !isFalsyOrEmpty(container.suggestions)) { + for (let suggestion of container.suggestions) { + if (acceptSuggestion(suggestion)) { - fixOverwriteBeforeAfter(suggestion, container); + fixOverwriteBeforeAfter(suggestion, container); - result.push({ - container, - suggestion, - support, - resolve: createSuggestionResolver(support, suggestion, model, position) - }); - } + result.push({ + container, + suggestion, + support, + resolve: createSuggestionResolver(support, suggestion, model, position) + }); } } } diff --git a/src/vs/editor/contrib/suggest/test/common/suggest.test.ts b/src/vs/editor/contrib/suggest/test/common/suggest.test.ts index b0454a1aacd..756514613e9 100644 --- a/src/vs/editor/contrib/suggest/test/common/suggest.test.ts +++ b/src/vs/editor/contrib/suggest/test/common/suggest.test.ts @@ -24,7 +24,7 @@ suite('Suggest', function () { registration = SuggestRegistry.register({ pattern: 'bar/path' }, { triggerCharacters: [], provideCompletionItems() { - return [{ + return { currentWord: '', incomplete: false, suggestions: [{ @@ -40,7 +40,7 @@ suite('Suggest', function () { type: 'property', codeSnippet: 'fff' }] - }]; + }; } }); }); diff --git a/src/vs/languages/handlebars/common/handlebars.ts b/src/vs/languages/handlebars/common/handlebars.ts index 4ba109f6014..5636aa7ee8b 100644 --- a/src/vs/languages/handlebars/common/handlebars.ts +++ b/src/vs/languages/handlebars/common/handlebars.ts @@ -164,7 +164,7 @@ export class HandlebarsMode extends htmlMode.HTMLMode { protected _registerSupports(): void { modes.SuggestRegistry.register(this.getId(), { triggerCharacters: ['.', ':', '<', '"', '=', '/'], - provideCompletionItems: (model, position, token): Thenable => { + provideCompletionItems: (model, position, token): Thenable => { return wireCancellationToken(token, this._provideCompletionItems(model.uri, position)); } }, true); diff --git a/src/vs/languages/html/common/html.ts b/src/vs/languages/html/common/html.ts index 829506daa7c..88dd32d1820 100644 --- a/src/vs/languages/html/common/html.ts +++ b/src/vs/languages/html/common/html.ts @@ -358,7 +358,7 @@ export class HTMLMode extends CompatMode implem modes.SuggestRegistry.register(this.getId(), { triggerCharacters: ['.', ':', '<', '"', '=', '/'], - provideCompletionItems: (model, position, token): Thenable => { + provideCompletionItems: (model, position, token): Thenable => { return wireCancellationToken(token, this._provideCompletionItems(model.uri, position)); } }, true); @@ -486,7 +486,7 @@ export class HTMLMode extends CompatMode implem } static $_provideCompletionItems = CompatWorkerAttr(HTMLMode, HTMLMode.prototype._provideCompletionItems); - protected _provideCompletionItems(resource:URI, position:editorCommon.IPosition):winjs.TPromise { + protected _provideCompletionItems(resource:URI, position:editorCommon.IPosition):winjs.TPromise { return this._worker((w) => w.provideCompletionItems(resource, position)); } diff --git a/src/vs/languages/html/common/htmlWorker.ts b/src/vs/languages/html/common/htmlWorker.ts index bfa9c8cf6cd..33101fba3ba 100644 --- a/src/vs/languages/html/common/htmlWorker.ts +++ b/src/vs/languages/html/common/htmlWorker.ts @@ -267,17 +267,15 @@ export class HTMLWorker { }); } - public provideCompletionItems(resource:URI, position:editorCommon.IPosition):winjs.TPromise { + public provideCompletionItems(resource:URI, position:editorCommon.IPosition):winjs.TPromise { let model = this.resourceService.get(resource); let modeIdAtPosition = model.getModeIdAtPosition(position.lineNumber, position.column); if (modeIdAtPosition === this._modeId) { return this.suggestHTML(resource, position); - } else { - return winjs.TPromise.as([]); } } - private suggestHTML(resource:URI, position:editorCommon.IPosition):winjs.TPromise { + private suggestHTML(resource:URI, position:editorCommon.IPosition):winjs.TPromise { return this.doSuggest(resource, position).then(value => filterSuggestions(value)); } diff --git a/src/vs/languages/html/test/common/html-worker.test.ts b/src/vs/languages/html/test/common/html-worker.test.ts index b9a8c83ad13..fc8bc97633e 100644 --- a/src/vs/languages/html/test/common/html-worker.test.ts +++ b/src/vs/languages/html/test/common/html-worker.test.ts @@ -48,7 +48,7 @@ suite('HTML - worker', () => { var env = mockHtmlWorkerEnv(url, content); var position = env.model.getPositionFromOffset(idx); - return env.worker.provideCompletionItems(url, position).then(result => result[0]); + return env.worker.provideCompletionItems(url, position); }; var assertSuggestion = function(completion: Modes.ISuggestResult, label: string, type?: string, codeSnippet?: string) { diff --git a/src/vs/languages/razor/common/razor.ts b/src/vs/languages/razor/common/razor.ts index e5a84287ec2..b282bf1adbb 100644 --- a/src/vs/languages/razor/common/razor.ts +++ b/src/vs/languages/razor/common/razor.ts @@ -112,7 +112,7 @@ export class RAZORMode extends htmlMode.HTMLMode { protected _registerSupports(): void { modes.SuggestRegistry.register(this.getId(), { triggerCharacters: ['.', ':', '<', '"', '=', '/'], - provideCompletionItems: (model, position, token): Thenable => { + provideCompletionItems: (model, position, token): Thenable => { return wireCancellationToken(token, this._provideCompletionItems(model.uri, position)); } }, true); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 62e8c101536..282ded66c2d 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -266,7 +266,7 @@ export abstract class ExtHostLanguageFeaturesShape { $provideWorkspaceSymbols(handle: number, search: string): TPromise { throw ni(); } $resolveWorkspaceSymbol(handle: number, symbol: IWorkspaceSymbol): TPromise { throw ni(); } $provideRenameEdits(handle: number, resource: URI, position: editorCommon.IPosition, newName: string): TPromise { throw ni(); } - $provideCompletionItems(handle: number, resource: URI, position: editorCommon.IPosition): TPromise { throw ni(); } + $provideCompletionItems(handle: number, resource: URI, position: editorCommon.IPosition): TPromise { throw ni(); } $resolveCompletionItem(handle: number, resource: URI, position: editorCommon.IPosition, suggestion: modes.ISuggestion): TPromise { throw ni(); } $provideSignatureHelp(handle: number, resource: URI, position: editorCommon.IPosition): TPromise { throw ni(); } $provideDocumentLinks(handle: number, resource: URI): TPromise { throw ni(); } diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 5d1522f5671..eef9b5b4f22 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -503,7 +503,7 @@ class SuggestAdapter { this._provider = provider; } - provideCompletionItems(resource: URI, position: IPosition): TPromise { + provideCompletionItems(resource: URI, position: IPosition): TPromise { const doc = this._documents.getDocumentData(resource).document; const pos = TypeConverters.toPosition(position); @@ -574,7 +574,7 @@ class SuggestAdapter { // cache for details call this._cache[key] = list; - return [result]; + return result; }); } @@ -866,7 +866,7 @@ export class ExtHostLanguageFeatures extends ExtHostLanguageFeaturesShape { return this._createDisposable(handle); } - $provideCompletionItems(handle: number, resource: URI, position: IPosition): TPromise { + $provideCompletionItems(handle: number, resource: URI, position: IPosition): TPromise { return this._withAdapter(handle, SuggestAdapter, adapter => adapter.provideCompletionItems(resource, position)); } diff --git a/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts index 9710d5f6401..4df3d0f6dc9 100644 --- a/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts @@ -179,7 +179,7 @@ export class MainThreadLanguageFeatures extends MainThreadLanguageFeaturesShape $registerSuggestSupport(handle: number, selector: vscode.DocumentSelector, triggerCharacters: string[]): TPromise { this._registrations[handle] = modes.SuggestRegistry.register(selector, { triggerCharacters: triggerCharacters, - provideCompletionItems: (model:IReadOnlyModel, position:EditorPosition, token:CancellationToken): Thenable => { + provideCompletionItems: (model:IReadOnlyModel, position:EditorPosition, token:CancellationToken): Thenable => { return wireCancellationToken(token, this._proxy.$provideCompletionItems(handle, model.uri, position)); }, resolveCompletionItem: (model:IReadOnlyModel, position:EditorPosition, suggestion: modes.ISuggestion, token: CancellationToken): Thenable => {