From 2b956fd3a83313cee37ff179eae843bc88dd572a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 9 Oct 2018 16:00:20 +0300 Subject: Add on-enter handler Now, typing doc comments is much more pleasant --- editors/code/src/commands/index.ts | 4 +++- editors/code/src/commands/on_enter.ts | 29 +++++++++++++++++++++++++++++ editors/code/src/extension.ts | 20 +++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 editors/code/src/commands/on_enter.ts (limited to 'editors/code/src') diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts index 2496c7ff8..d78a64c3e 100644 --- a/editors/code/src/commands/index.ts +++ b/editors/code/src/commands/index.ts @@ -2,6 +2,7 @@ import * as applySourceChange from './apply_source_change'; import * as extendSelection from './extend_selection'; import * as joinLines from './join_lines'; import * as matchingBrace from './matching_brace'; +import * as on_enter from './on_enter'; import * as parentModule from './parent_module'; import * as runnables from './runnables'; import * as syntaxTree from './syntaxTree'; @@ -13,5 +14,6 @@ export { matchingBrace, parentModule, runnables, - syntaxTree + syntaxTree, + on_enter, }; diff --git a/editors/code/src/commands/on_enter.ts b/editors/code/src/commands/on_enter.ts new file mode 100644 index 000000000..2666797fe --- /dev/null +++ b/editors/code/src/commands/on_enter.ts @@ -0,0 +1,29 @@ +import * as vscode from 'vscode'; +import * as lc from 'vscode-languageclient'; +import { Server } from '../server'; +import { handle as applySourceChange, SourceChange } from './apply_source_change'; + +interface OnEnterParams { + textDocument: lc.TextDocumentIdentifier; + position: lc.Position; +} + +export async function handle(event: { text: string }): Promise { + const editor = vscode.window.activeTextEditor; + if (editor == null || editor.document.languageId !== 'rust' || event.text !== '\n') { + return false; + } + const request: OnEnterParams = { + textDocument: { uri: editor.document.uri.toString() }, + position: Server.client.code2ProtocolConverter.asPosition(editor.selection.active), + }; + const change = await Server.client.sendRequest( + 'm/onEnter', + request + ); + if (!change) { + return false; + } + await applySourceChange(change); + return true +} diff --git a/editors/code/src/extension.ts b/editors/code/src/extension.ts index 81e1107a0..3e5767535 100644 --- a/editors/code/src/extension.ts +++ b/editors/code/src/extension.ts @@ -15,6 +15,23 @@ export function activate(context: vscode.ExtensionContext) { function registerCommand(name: string, f: any) { disposeOnDeactivation(vscode.commands.registerCommand(name, f)); } + function overrideCommand( + + name: string, + f: (...args: any[]) => Promise, + ) { + const defaultCmd = `default:${name}`; + const original = async (...args: any[]) => await vscode.commands.executeCommand(defaultCmd, ...args); + registerCommand(name, async (...args: any[]) => { + const editor = vscode.window.activeTextEditor; + if (!editor || !editor.document || editor.document.languageId !== 'rust') { + return await original(...args); + } + if (!await f(...args)) { + return await original(...args); + } + }) + } // Commands are requests from vscode to the language server registerCommand('ra-lsp.syntaxTree', commands.syntaxTree.handle); @@ -27,11 +44,12 @@ export function activate(context: vscode.ExtensionContext) { 'ra-lsp.applySourceChange', commands.applySourceChange.handle ); + overrideCommand('type', commands.on_enter.handle) // Notifications are events triggered by the language server const allNotifications: Iterable< [string, lc.GenericNotificationHandler] - > = [['m/publishDecorations', notifications.publishDecorations.handle]]; + > = [['m/publishDecorations', notifications.publishDecorations.handle]]; // The events below are plain old javascript events, triggered and handled by vscode vscode.window.onDidChangeActiveTextEditor( -- cgit v1.2.3