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/src/commands/syntaxTree.ts | 44 ++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 9 deletions(-) (limited to 'editors/code/src/commands/syntaxTree.ts') 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 + ); + }; } -- cgit v1.2.3 From 1b4e0ec1c868c7f2a0eef1e59bfa382db85a6900 Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sun, 3 Mar 2019 21:54:51 +0200 Subject: Rename syntaxtree text provider to SyntaxTreeContentProvider --- editors/code/src/commands/syntaxTree.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'editors/code/src/commands/syntaxTree.ts') diff --git a/editors/code/src/commands/syntaxTree.ts b/editors/code/src/commands/syntaxTree.ts index 7200ae823..2f50fe14b 100644 --- a/editors/code/src/commands/syntaxTree.ts +++ b/editors/code/src/commands/syntaxTree.ts @@ -5,7 +5,7 @@ import { Server } from '../server'; export const syntaxTreeUri = vscode.Uri.parse('rust-analyzer://syntaxtree'); -export class TextDocumentContentProvider +export class SyntaxTreeContentProvider implements vscode.TextDocumentContentProvider { public eventEmitter = new vscode.EventEmitter(); public syntaxTree: string = 'Not available'; @@ -54,7 +54,7 @@ type SyntaxTreeResult = string; // Opens the virtual file that will show the syntax tree // // The contents of the file come from the `TextDocumentContentProvider` -export function createHandle(provider: TextDocumentContentProvider) { +export function createHandle(provider: SyntaxTreeContentProvider) { return async () => { const editor = vscode.window.activeTextEditor; const rangeEnabled = !!(editor && !editor.selection.isEmpty); -- cgit v1.2.3