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);
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> {
if (editor == null) {
return '';
}
- return Server.client.sendRequest<string>(
+ return this.ctx.client.sendRequest<string>(
'rust-analyzer/analyzerStatus',
null,
);
-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';
--- /dev/null
+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)
+ }
+}
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);
}
}
// 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),
);
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();