From 3a055d616ac8047e1411912ba2eff73f1ec3fce8 Mon Sep 17 00:00:00 2001 From: Heyward Fann Date: Thu, 2 Jul 2020 22:08:54 +0800 Subject: [PATCH] feat: lsp_ext statusNotification --- src/client.ts | 1 + src/ctx.ts | 15 +++++++++++++-- src/lsp_ext.ts | 3 +++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/client.ts b/src/client.ts index 11ef24a9..02f94bc1 100644 --- a/src/client.ts +++ b/src/client.ts @@ -7,6 +7,7 @@ class ExperimentalFeatures implements StaticFeature { const caps: any = capabilities.experimental ?? {}; caps.snippetTextEdit = true; caps.resolveCodeAction = true; + caps.statusNotification = true; capabilities.experimental = caps; } initialize(): void {} diff --git a/src/ctx.ts b/src/ctx.ts index 588db7b0..ecc9b821 100644 --- a/src/ctx.ts +++ b/src/ctx.ts @@ -1,4 +1,4 @@ -import { commands, ExtensionContext, LanguageClient, services, workspace } from 'coc.nvim'; +import { commands, ExtensionContext, LanguageClient, services, StatusBarItem, workspace } from 'coc.nvim'; import executable from 'executable'; import { existsSync } from 'fs'; import { homedir } from 'os'; @@ -8,6 +8,7 @@ import which from 'which'; import { createClient } from './client'; import { Config } from './config'; import { downloadServer, getLatestRelease } from './downloader'; +import * as ra from './lsp_ext'; export type RustDocument = TextDocument & { languageId: 'rust' }; export function isRustDocument(document: TextDocument): document is RustDocument { @@ -18,8 +19,13 @@ export type Cmd = (...args: any[]) => unknown; export class Ctx { client!: LanguageClient; + private statusBar: StatusBarItem; - constructor(private readonly extCtx: ExtensionContext, readonly config: Config) {} + constructor(private readonly extCtx: ExtensionContext, readonly config: Config) { + this.statusBar = workspace.createStatusBarItem(10); + this.statusBar.text = 'rust-analyzer'; + this.extCtx.subscriptions.push(this.statusBar); + } registerCommand(name: string, factory: (ctx: Ctx) => Cmd) { const fullName = `rust-analyzer.${name}`; @@ -38,6 +44,11 @@ export class Ctx { this.extCtx.subscriptions.push(services.registLanguageClient(client)); await client.onReady(); + client.onNotification(ra.status, (status) => { + this.statusBar.text = `rust-analyzer ${status}`; + this.statusBar.show(); + }); + this.client = client; } diff --git a/src/lsp_ext.ts b/src/lsp_ext.ts index e8a62319..0f9ea0f1 100644 --- a/src/lsp_ext.ts +++ b/src/lsp_ext.ts @@ -6,6 +6,9 @@ import * as lc from 'vscode-languageserver-protocol'; export const analyzerStatus = new lc.RequestType('rust-analyzer/analyzerStatus'); +export type Status = 'loading' | 'ready' | 'invalid' | 'needsReload'; +export const status = new lc.NotificationType('rust-analyzer/status'); + export const reloadWorkspace = new lc.RequestType('rust-analyzer/reloadWorkspace'); export interface SyntaxTreeParams {