Start new ctx module

This commit is contained in:
Aleksey Kladov 2019-12-30 14:42:59 +01:00
parent 9cad88dd95
commit e53ccb6e99
4 changed files with 63 additions and 20 deletions

View file

@ -1,19 +1,19 @@
import * as vscode from 'vscode';
import { Server } from '../server';
import { Ctx } from '../ctx';
// Shows status of rust-analyzer (for debugging)
export function makeCommand(context: vscode.ExtensionContext) {
export function analyzerStatus(ctx: Ctx) {
let poller: NodeJS.Timer | null = null;
const tdcp = new TextDocumentContentProvider();
const tdcp = new TextDocumentContentProvider(ctx);
context.subscriptions.push(
ctx.pushCleanup(
vscode.workspace.registerTextDocumentContentProvider(
'rust-analyzer-status',
tdcp,
),
);
context.subscriptions.push({
ctx.pushCleanup({
dispose() {
if (poller != null) {
clearInterval(poller);
@ -39,9 +39,16 @@ export function makeCommand(context: vscode.ExtensionContext) {
class TextDocumentContentProvider
implements vscode.TextDocumentContentProvider {
uri = vscode.Uri.parse('rust-analyzer-status://status');
eventEmitter = new vscode.EventEmitter<vscode.Uri>();
ctx: Ctx
constructor(ctx: Ctx) {
this.ctx = ctx
}
provideTextDocumentContent(
_uri: vscode.Uri,
): vscode.ProviderResult<string> {
@ -49,7 +56,7 @@ class TextDocumentContentProvider
if (editor == null) {
return '';
}
return Server.client.sendRequest<string>(
return this.ctx.client.sendRequest<string>(
'rust-analyzer/analyzerStatus',
null,
);

View file

@ -1,4 +1,4 @@
import * as analyzerStatus from './analyzer_status';
import { analyzerStatus } from './analyzer_status';
import * as applySourceChange from './apply_source_change';
import * as expandMacro from './expand_macro';
import * as inlayHints from './inlay_hints';

30
editors/code/src/ctx.ts Normal file
View file

@ -0,0 +1,30 @@
import * as vscode from 'vscode';
import * as lc from 'vscode-languageclient';
import { Server } from './server';
export class Ctx {
private extCtx: vscode.ExtensionContext
constructor(extCtx: vscode.ExtensionContext) {
this.extCtx = extCtx
}
get client(): lc.LanguageClient {
return Server.client
}
registerCommand(
name: string,
factory: (ctx: Ctx) => () => Promise<vscode.TextEditor>,
) {
const fullName = `rust-analyzer.${name}`
const cmd = factory(this);
const d = vscode.commands.registerCommand(fullName, cmd);
this.pushCleanup(d);
}
pushCleanup(d: { dispose(): any }) {
this.extCtx.subscriptions.push(d)
}
}

View file

@ -9,8 +9,18 @@ import { StatusDisplay } from './commands/watch_status';
import * as events from './events';
import * as notifications from './notifications';
import { Server } from './server';
import { Ctx } from './ctx'
let ctx!: Ctx;
export async function activate(context: vscode.ExtensionContext) {
ctx = new Ctx(context);
ctx.registerCommand(
'analyzerStatus',
commands.analyzerStatus
);
function disposeOnDeactivation(disposable: vscode.Disposable) {
context.subscriptions.push(disposable);
}
@ -48,10 +58,6 @@ export async function activate(context: vscode.ExtensionContext) {
}
// Commands are requests from vscode to the language server
registerCommand(
'rust-analyzer.analyzerStatus',
commands.analyzerStatus.makeCommand(context),
);
registerCommand('rust-analyzer.collectGarbage', () =>
Server.client.sendRequest<null>('rust-analyzer/collectGarbage', null),
);
@ -94,15 +100,15 @@ export async function activate(context: vscode.ExtensionContext) {
string,
lc.GenericNotificationHandler,
]> = [
[
'rust-analyzer/publishDecorations',
notifications.publishDecorations.handle,
],
[
'$/progress',
params => watchStatus.handleProgressNotification(params),
],
];
[
'rust-analyzer/publishDecorations',
notifications.publishDecorations.handle,
],
[
'$/progress',
params => watchStatus.handleProgressNotification(params),
],
];
const syntaxTreeContentProvider = new SyntaxTreeContentProvider();
const expandMacroContentProvider = new ExpandMacroContentProvider();