From 71fe8f66f20263a00907b6c1816e08addd9bc309 Mon Sep 17 00:00:00 2001 From: Nathan Gaberel Date: Sat, 9 Jun 2018 14:13:14 +0100 Subject: [PATCH 1/4] Add CodeAction provider. --- src/client/providers/codeActionsProvider.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/client/providers/codeActionsProvider.ts diff --git a/src/client/providers/codeActionsProvider.ts b/src/client/providers/codeActionsProvider.ts new file mode 100644 index 000000000000..5bc2975f5670 --- /dev/null +++ b/src/client/providers/codeActionsProvider.ts @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import * as vscode from 'vscode'; + +export class PythonCodeActionProvider implements vscode.CodeActionProvider { + public provideCodeActions(document: vscode.TextDocument, range: vscode.Range, context: vscode.CodeActionContext, token: vscode.CancellationToken): vscode.ProviderResult { + const sortImports = new vscode.CodeAction( + 'Sort imports on save', + vscode.CodeActionKind.SourceOrganizeImports + ); + sortImports.command = { + title: 'Sort imports', + command: 'python.sortImports' + }; + + return [sortImports]; + } +} From 2e9f73b54d9565dde894781bfe62d45445108756 Mon Sep 17 00:00:00 2001 From: Nathan Gaberel Date: Sat, 9 Jun 2018 14:14:09 +0100 Subject: [PATCH 2/4] Register PythonCodeActionProvider. --- src/client/extension.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/client/extension.ts b/src/client/extension.ts index 2228cca81495..3e59f8ae408f 100644 --- a/src/client/extension.ts +++ b/src/client/extension.ts @@ -40,6 +40,7 @@ import { IServiceContainer, IServiceManager } from './ioc/types'; import { LinterCommands } from './linters/linterCommands'; import { registerTypes as lintersRegisterTypes } from './linters/serviceRegistry'; import { ILintingEngine } from './linters/types'; +import { PythonCodeActionProvider } from './providers/codeActionsProvider'; import { PythonFormattingEditProvider } from './providers/formatProvider'; import { LinterProvider } from './providers/linterProvider'; import { PythonRenameProvider } from './providers/renameProvider'; @@ -145,6 +146,8 @@ export async function activate(context: ExtensionContext) { context.subscriptions.push(new TerminalProvider(serviceContainer)); context.subscriptions.push(new WorkspaceSymbols(serviceContainer)); + context.subscriptions.push(languages.registerCodeActionsProvider(PYTHON, new PythonCodeActionProvider())); + type ConfigurationProvider = BaseConfigurationProvider; serviceContainer.getAll(IDebugConfigurationProvider).forEach(debugConfig => { context.subscriptions.push(debug.registerDebugConfigurationProvider(debugConfig.debugType, debugConfig)); From 39dcf5b7cae5ff29bf36d8b0f1d5df45b61fedcf Mon Sep 17 00:00:00 2001 From: Nathan Gaberel Date: Sat, 9 Jun 2018 16:22:08 +0100 Subject: [PATCH 3/4] Add unit test. --- .../providers/codeActionsProvider.test.ts | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/test/providers/codeActionsProvider.test.ts diff --git a/src/test/providers/codeActionsProvider.test.ts b/src/test/providers/codeActionsProvider.test.ts new file mode 100644 index 000000000000..8147063d649e --- /dev/null +++ b/src/test/providers/codeActionsProvider.test.ts @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import { expect } from 'chai'; +import * as TypeMoq from 'typemoq'; +import { CancellationToken, CodeActionContext, CodeActionKind, Range, TextDocument } from 'vscode'; +import { PythonCodeActionProvider } from '../../client/providers/codeActionsProvider'; + +suite('CodeAction Provider', () => { + let codeActionsProvider: PythonCodeActionProvider; + let document: TypeMoq.IMock; + let range: TypeMoq.IMock; + let context: TypeMoq.IMock; + let token: TypeMoq.IMock; + + setup(() => { + codeActionsProvider = new PythonCodeActionProvider(); + document = TypeMoq.Mock.ofType(); + range = TypeMoq.Mock.ofType(); + context = TypeMoq.Mock.ofType(); + token = TypeMoq.Mock.ofType(); + }); + + test('Ensure it always returns a source.organizeImports CodeAction', async () => { + const codeActions = await codeActionsProvider.provideCodeActions( + document.object, + range.object, + context.object, + token.object + ); + + if (!codeActions) { + throw Error(`codeActionsProvider.provideCodeActions did not return an array (it returned ${codeActions})`); + } + + const organizeImportsCodeAction = codeActions.filter( + codeAction => codeAction.kind === CodeActionKind.SourceOrganizeImports + ); + expect(organizeImportsCodeAction).to.have.length(1); + expect(organizeImportsCodeAction[0].kind).to.eq(CodeActionKind.SourceOrganizeImports); + }); +}); From de1007381b9605ebf556014e0d0967833e702ada Mon Sep 17 00:00:00 2001 From: Nathan Gaberel Date: Sun, 10 Jun 2018 00:06:16 +0100 Subject: [PATCH 4/4] Add news entry. --- news/1 Enhancements/156.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/1 Enhancements/156.md diff --git a/news/1 Enhancements/156.md b/news/1 Enhancements/156.md new file mode 100644 index 000000000000..da404f67686e --- /dev/null +++ b/news/1 Enhancements/156.md @@ -0,0 +1 @@ +Add support for the `editor.codeActionsOnSave.source.organizeImports` setting (thanks [Nathan Gaberel](https://github.com/n6g7)).