From c2d3203d0c708dc2ccb7c0d017ae876180c0e5a8 Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sun, 3 Mar 2019 21:21:40 +0200 Subject: Add vscode support for range in SyntaxTreeParams This enables the client to use a command to either show the live-updating version of the syntax tree for the current file. Or optionally when a selected range is provided, we then provide a snapshot of the syntax tree for the range. --- editors/code/package.json | 2 +- editors/code/src/commands/syntaxTree.ts | 44 ++++++++++++++++++++++++++------- editors/code/src/extension.ts | 6 ++++- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/editors/code/package.json b/editors/code/package.json index d4ce2ae2c..fda411810 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -75,7 +75,7 @@ "commands": [ { "command": "rust-analyzer.syntaxTree", - "title": "Show syntax tree for current file", + "title": "Show Syntax Tree", "category": "Rust Analyzer" }, { diff --git a/editors/code/src/commands/syntaxTree.ts b/editors/code/src/commands/syntaxTree.ts index c0baf08c5..7200ae823 100644 --- a/editors/code/src/commands/syntaxTree.ts +++ b/editors/code/src/commands/syntaxTree.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode'; -import { TextDocumentIdentifier } from 'vscode-languageclient'; +import { Range, TextDocumentIdentifier } from 'vscode-languageclient'; import { Server } from '../server'; @@ -17,8 +17,21 @@ export class TextDocumentContentProvider if (editor == null) { return ''; } + + let range: Range | undefined; + + // When the range based query is enabled we take the range of the selection + if (uri.query === 'range=true') { + range = editor.selection.isEmpty + ? undefined + : Server.client.code2ProtocolConverter.asRange( + editor.selection + ); + } + const request: SyntaxTreeParams = { - textDocument: { uri: editor.document.uri.toString() } + textDocument: { uri: editor.document.uri.toString() }, + range }; return Server.client.sendRequest( 'rust-analyzer/syntaxTree', @@ -33,6 +46,7 @@ export class TextDocumentContentProvider interface SyntaxTreeParams { textDocument: TextDocumentIdentifier; + range?: Range; } type SyntaxTreeResult = string; @@ -40,11 +54,23 @@ type SyntaxTreeResult = string; // Opens the virtual file that will show the syntax tree // // The contents of the file come from the `TextDocumentContentProvider` -export async function handle() { - const document = await vscode.workspace.openTextDocument(syntaxTreeUri); - return vscode.window.showTextDocument( - document, - vscode.ViewColumn.Two, - true - ); +export function createHandle(provider: TextDocumentContentProvider) { + return async () => { + const editor = vscode.window.activeTextEditor; + const rangeEnabled = !!(editor && !editor.selection.isEmpty); + + const uri = rangeEnabled + ? vscode.Uri.parse(`${syntaxTreeUri.toString()}?range=true`) + : syntaxTreeUri; + + const document = await vscode.workspace.openTextDocument(uri); + + provider.eventEmitter.fire(uri); + + return vscode.window.showTextDocument( + document, + vscode.ViewColumn.Two, + true + ); + }; } diff --git a/editors/code/src/extension.ts b/editors/code/src/extension.ts index 8b332eeb2..5134bb258 100644 --- a/editors/code/src/extension.ts +++ b/editors/code/src/extension.ts @@ -52,7 +52,6 @@ export function activate(context: vscode.ExtensionContext) { registerCommand('rust-analyzer.collectGarbage', () => Server.client.sendRequest('rust-analyzer/collectGarbage', null) ); - registerCommand('rust-analyzer.syntaxTree', commands.syntaxTree.handle); registerCommand( 'rust-analyzer.extendSelection', commands.extendSelection.handle @@ -109,6 +108,11 @@ export function activate(context: vscode.ExtensionContext) { ) ); + registerCommand( + 'rust-analyzer.syntaxTree', + commands.syntaxTree.createHandle(textDocumentContentProvider) + ); + vscode.workspace.onDidChangeTextDocument( events.changeTextDocument.createHandler(textDocumentContentProvider), null, -- cgit v1.2.3