2692: Move expand macro to the new context r=matklad a=matklad



Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2019-12-30 18:36:34 +00:00 committed by GitHub
commit 237abb85c4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 60 additions and 82 deletions

View file

@ -1,8 +1,8 @@
import * as vscode from 'vscode';
import { Ctx, Cmd } from '../ctx';
// Shows status of rust-analyzer (for debugging)
// Shows status of rust-analyzer (for debugging)
export function analyzerStatus(ctx: Ctx): Cmd {
let poller: NodeJS.Timer | null = null;
const tdcp = new TextDocumentContentProvider(ctx);
@ -37,7 +37,7 @@ export function analyzerStatus(ctx: Ctx): Cmd {
class TextDocumentContentProvider
implements vscode.TextDocumentContentProvider {
ctx: Ctx;
private ctx: Ctx;
uri = vscode.Uri.parse('rust-analyzer-status://status');
eventEmitter = new vscode.EventEmitter<vscode.Uri>();

View file

@ -1,60 +1,23 @@
import * as vscode from 'vscode';
import { Position, TextDocumentIdentifier } from 'vscode-languageclient';
import { Server } from '../server';
import * as lc from 'vscode-languageclient';
export const expandMacroUri = vscode.Uri.parse(
'rust-analyzer://expandMacro/[EXPANSION].rs',
);
export class ExpandMacroContentProvider
implements vscode.TextDocumentContentProvider {
public eventEmitter = new vscode.EventEmitter<vscode.Uri>();
public provideTextDocumentContent(
_uri: vscode.Uri,
): vscode.ProviderResult<string> {
async function handle() {
const editor = vscode.window.activeTextEditor;
if (editor == null) {
return '';
}
const position = editor.selection.active;
const request: MacroExpandParams = {
textDocument: { uri: editor.document.uri.toString() },
position,
};
const expanded = await Server.client.sendRequest<ExpandedMacro>(
'rust-analyzer/expandMacro',
request,
);
if (expanded == null) {
return 'Not available';
}
return code_format(expanded);
}
return handle();
}
get onDidChange(): vscode.Event<vscode.Uri> {
return this.eventEmitter.event;
}
}
import { Ctx, Cmd } from '../ctx';
// Opens the virtual file that will show the syntax tree
//
// The contents of the file come from the `TextDocumentContentProvider`
export function createHandle(provider: ExpandMacroContentProvider) {
export function expandMacro(ctx: Ctx): Cmd {
const tdcp = new TextDocumentContentProvider(ctx);
ctx.pushCleanup(
vscode.workspace.registerTextDocumentContentProvider(
'rust-analyzer',
tdcp,
),
);
return async () => {
const uri = expandMacroUri;
const document = await vscode.workspace.openTextDocument(uri);
provider.eventEmitter.fire(uri);
const document = await vscode.workspace.openTextDocument(tdcp.uri);
tdcp.eventEmitter.fire(tdcp.uri);
return vscode.window.showTextDocument(
document,
vscode.ViewColumn.Two,
@ -63,11 +26,6 @@ export function createHandle(provider: ExpandMacroContentProvider) {
};
}
interface MacroExpandParams {
textDocument: TextDocumentIdentifier;
position: Position;
}
interface ExpandedMacro {
name: string;
expansion: string;
@ -81,3 +39,37 @@ function code_format(expanded: ExpandedMacro): string {
return result;
}
class TextDocumentContentProvider
implements vscode.TextDocumentContentProvider {
private ctx: Ctx;
uri = vscode.Uri.parse('rust-analyzer://expandMacro/[EXPANSION].rs');
eventEmitter = new vscode.EventEmitter<vscode.Uri>();
constructor(ctx: Ctx) {
this.ctx = ctx;
}
async provideTextDocumentContent(_uri: vscode.Uri): Promise<string> {
const editor = vscode.window.activeTextEditor;
if (editor == null) return '';
const position = editor.selection.active;
const request: lc.TextDocumentPositionParams = {
textDocument: { uri: editor.document.uri.toString() },
position,
};
const expanded = await this.ctx.client.sendRequest<ExpandedMacro>(
'rust-analyzer/expandMacro',
request,
);
if (expanded == null) return 'Not available';
return code_format(expanded);
}
get onDidChange(): vscode.Event<vscode.Uri> {
return this.eventEmitter.event;
}
}

View file

@ -6,7 +6,7 @@ import { joinLines } from './join_lines';
import { onEnter } from './on_enter';
import { parentModule } from './parent_module';
import { syntaxTree } from './syntax_tree';
import * as expandMacro from './expand_macro';
import { expandMacro } from './expand_macro';
import * as inlayHints from './inlay_hints';
import * as runnables from './runnables';

View file

@ -7,12 +7,12 @@ import { Ctx, Cmd } from '../ctx';
//
// The contents of the file come from the `TextDocumentContentProvider`
export function syntaxTree(ctx: Ctx): Cmd {
const stcp = new SyntaxTreeContentProvider(ctx);
const tdcp = new TextDocumentContentProvider(ctx);
ctx.pushCleanup(
vscode.workspace.registerTextDocumentContentProvider(
'rust-analyzer',
stcp,
tdcp,
),
);
@ -20,7 +20,7 @@ export function syntaxTree(ctx: Ctx): Cmd {
(event: vscode.TextDocumentChangeEvent) => {
const doc = event.document;
if (doc.languageId !== 'rust') return;
afterLs(() => stcp.eventEmitter.fire(stcp.uri));
afterLs(() => tdcp.eventEmitter.fire(tdcp.uri));
},
ctx.subscriptions,
);
@ -28,7 +28,7 @@ export function syntaxTree(ctx: Ctx): Cmd {
vscode.window.onDidChangeActiveTextEditor(
(editor: vscode.TextEditor | undefined) => {
if (!editor || editor.document.languageId !== 'rust') return;
stcp.eventEmitter.fire(stcp.uri);
tdcp.eventEmitter.fire(tdcp.uri);
},
ctx.subscriptions,
);
@ -38,12 +38,12 @@ export function syntaxTree(ctx: Ctx): Cmd {
const rangeEnabled = !!(editor && !editor.selection.isEmpty);
const uri = rangeEnabled
? vscode.Uri.parse(`${stcp.uri.toString()}?range=true`)
: stcp.uri;
? vscode.Uri.parse(`${tdcp.uri.toString()}?range=true`)
: tdcp.uri;
const document = await vscode.workspace.openTextDocument(uri);
stcp.eventEmitter.fire(uri);
tdcp.eventEmitter.fire(uri);
return vscode.window.showTextDocument(
document,
@ -64,12 +64,11 @@ interface SyntaxTreeParams {
range?: lc.Range;
}
export class SyntaxTreeContentProvider
class TextDocumentContentProvider
implements vscode.TextDocumentContentProvider {
ctx: Ctx;
private ctx: Ctx;
uri = vscode.Uri.parse('rust-analyzer://syntaxtree');
eventEmitter = new vscode.EventEmitter<vscode.Uri>();
syntaxTree: string = 'Not available';
constructor(ctx: Ctx) {
this.ctx = ctx;

View file

@ -2,7 +2,6 @@ import * as vscode from 'vscode';
import * as lc from 'vscode-languageclient';
import * as commands from './commands';
import { ExpandMacroContentProvider } from './commands/expand_macro';
import { HintsUpdater } from './commands/inlay_hints';
import { StatusDisplay } from './commands/watch_status';
import * as events from './events';
@ -20,6 +19,7 @@ export async function activate(context: vscode.ExtensionContext) {
ctx.registerCommand('joinLines', commands.joinLines);
ctx.registerCommand('parentModule', commands.parentModule);
ctx.registerCommand('syntaxTree', commands.syntaxTree);
ctx.registerCommand('expandMacro', commands.expandMacro);
function disposeOnDeactivation(disposable: vscode.Disposable) {
context.subscriptions.push(disposable);
@ -65,25 +65,12 @@ export async function activate(context: vscode.ExtensionContext) {
params => watchStatus.handleProgressNotification(params),
],
];
const expandMacroContentProvider = new ExpandMacroContentProvider();
// The events below are plain old javascript events, triggered and handled by vscode
vscode.window.onDidChangeActiveTextEditor(
events.changeActiveTextEditor.makeHandler(),
);
disposeOnDeactivation(
vscode.workspace.registerTextDocumentContentProvider(
'rust-analyzer',
expandMacroContentProvider,
),
);
registerCommand(
'rust-analyzer.expandMacro',
commands.expandMacro.createHandle(expandMacroContentProvider),
);
const startServer = () => Server.start(allNotifications);
const reloadCommand = () => reloadServer(startServer);