From fb9cfb1a5327329d0d0969dd694a3b9727713f77 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 1 Dec 2015 14:54:54 +0100 Subject: [PATCH] command: executeCodeActionProvider --- src/vs/editor/common/core/range.ts | 2 +- .../contrib/quickFix/common/quickFix.ts | 23 +++++++++++++++++-- .../common/extHostLanguageFeatureCommands.ts | 18 +++++++++++++-- .../extHostLanguageFeatureCommands.test.ts | 21 +++++++++++++++++ 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/common/core/range.ts b/src/vs/editor/common/core/range.ts index 54978a06bcf..f1625a43a25 100644 --- a/src/vs/editor/common/core/range.ts +++ b/src/vs/editor/common/core/range.ts @@ -90,7 +90,7 @@ export class Range implements EditorCommon.IEditorRange { return new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn); } - public static isIRange(obj: any): boolean { + public static isIRange(obj: any): obj is EditorCommon.IRange { return ( obj && (typeof obj.startLineNumber === 'number') diff --git a/src/vs/editor/contrib/quickFix/common/quickFix.ts b/src/vs/editor/contrib/quickFix/common/quickFix.ts index 4e7e841c8ae..9c4d90c2b43 100644 --- a/src/vs/editor/contrib/quickFix/common/quickFix.ts +++ b/src/vs/editor/contrib/quickFix/common/quickFix.ts @@ -5,10 +5,14 @@ 'use strict'; +import URI from 'vs/base/common/uri'; +import {Range} from 'vs/editor/common/core/range'; import {IModel, IRange} from 'vs/editor/common/editorCommon'; import {TPromise} from 'vs/base/common/winjs.base'; -import {onUnexpectedError} from 'vs/base/common/errors'; +import {onUnexpectedError, illegalArgument} from 'vs/base/common/errors'; import {IQuickFixSupport, IQuickFix} from 'vs/editor/common/modes'; +import {IModelService} from 'vs/editor/common/services/modelService'; +import {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions'; import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry'; export const QuickFixRegistry = new LanguageFeatureRegistry('quickFixSupport'); @@ -40,4 +44,19 @@ export function getQuickFixes(model: IModel, range: IRange): TPromise quickFixes); -} \ No newline at end of file +} + +CommonEditorRegistry.registerLanguageCommand('_executeCodeActionProvider', function(accessor, args) { + + const {resource, range} = args; + if (!URI.isURI(resource) || !Range.isIRange(range)) { + throw illegalArgument(); + } + + const model = accessor.get(IModelService).getModel(resource); + if (!model) { + throw illegalArgument(); + } + + return getQuickFixes(model, range); +}); \ No newline at end of file diff --git a/src/vs/workbench/api/common/extHostLanguageFeatureCommands.ts b/src/vs/workbench/api/common/extHostLanguageFeatureCommands.ts index cd8d0eb77a2..b0c82ee65c3 100644 --- a/src/vs/workbench/api/common/extHostLanguageFeatureCommands.ts +++ b/src/vs/workbench/api/common/extHostLanguageFeatureCommands.ts @@ -28,7 +28,7 @@ import {DeclarationRegistry} from 'vs/editor/contrib/goToDeclaration/common/goTo import {ExtraInfoRegistry} from 'vs/editor/contrib/hover/common/hover'; import {OccurrencesRegistry} from 'vs/editor/contrib/wordHighlighter/common/wordHighlighter'; import {ReferenceRegistry} from 'vs/editor/contrib/referenceSearch/common/referenceSearch'; -import {QuickFixRegistry} from 'vs/editor/contrib/quickFix/common/quickFix'; +import {IQuickFix2, QuickFixRegistry, getQuickFixes} from 'vs/editor/contrib/quickFix/common/quickFix'; import {IOutline} from 'vs/editor/contrib/quickOpen/common/quickOpen'; import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry'; import {NavigateTypesSupportRegistry, INavigateTypesSupport, ITypeBearing} from 'vs/workbench/parts/search/common/search' @@ -47,8 +47,8 @@ import {SuggestRegistry} from 'vs/editor/contrib/suggest/common/suggest'; // vscode.executeSignatureHelpProvider // vscode.executeDocumentSymbolProvider // vscode.executeCompletionItemProvider - // vscode.executeCodeActionProvider + // vscode.executeCodeLensProvider // vscode.executeFormatDocumentProvider // vscode.executeFormatRangeProvider @@ -71,6 +71,7 @@ export class ExtHostLanguageFeatureCommands { this._register('vscode.executeSignatureHelpProvider', this._executeSignatureHelpProvider); this._register('vscode.executeDocumentSymbolProvider', this._executeDocumentSymbolProvider); this._register('vscode.executeCompletionItemProvider', this._executeCompletionItemProvider); + this._register('vscode.executeCodeActionProvider', this._executeCodeActionProvider); } private _register(id: string, callback: (...args: any[]) => any): void { @@ -201,4 +202,17 @@ export class ExtHostLanguageFeatureCommands { } }); } + + private _executeCodeActionProvider(resource: URI, range: types.Range): Thenable { + const args = { + resource, + range: typeConverters.fromRange(range) + }; + return this._commands.executeCommand('_executeCodeActionProvider', args).then(value => { + if (Array.isArray(value)) { + // TODO@joh this isn't proper! + return value.map(quickFix => ({ title: quickFix.label })); + } + }); + } } \ No newline at end of file diff --git a/src/vs/workbench/test/common/api/extHostLanguageFeatureCommands.test.ts b/src/vs/workbench/test/common/api/extHostLanguageFeatureCommands.test.ts index e50bede365c..38083ec3ab4 100644 --- a/src/vs/workbench/test/common/api/extHostLanguageFeatureCommands.test.ts +++ b/src/vs/workbench/test/common/api/extHostLanguageFeatureCommands.test.ts @@ -255,4 +255,25 @@ suite('ExtHostLanguageFeatureCommands', function() { }); }); }); + + // --- quickfix + + test('QuickFix, back and forth', function(done) { + disposables.push(extHost.registerCodeActionProvider(defaultSelector, { + provideCodeActions(): any { + return [{ command: 'testing', title: 'Title', arguments: [1, 2, true] }]; + } + })); + + threadService.sync().then(() => { + commands.executeCommand('vscode.executeCodeActionProvider', model.getAssociatedResource(), new types.Range(0, 0, 1, 1)).then(value => { + assert.equal(value.length, 1); + let [first] = value; + assert.equal(first.title, 'Title'); + // assert.equal(first.command, 'testing'); + // assert.deepEqual(first.arguments, [1, 2, true]); + done(); + }); + }); + }); }); \ No newline at end of file -- GitLab