about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-04-22 14:42:25 +0000
committerbors <bors@rust-lang.org>2022-04-22 14:42:25 +0000
commitb6b5214c666b64cf9125bebc39d6a8ad08262870 (patch)
tree8457b2b26355314199cafa40473d2fad5c56f7fc
parent1db66b96c897f45f67e24081dbe726ddc536388c (diff)
parentd607c1b558b434d60846ce3052da0058e761a530 (diff)
downloadrust-b6b5214c666b64cf9125bebc39d6a8ad08262870.tar.gz
rust-b6b5214c666b64cf9125bebc39d6a8ad08262870.zip
Auto merge of #12053 - willcrichton:master, r=jonas-schievink
Export lc.LanguageClient from VSCode extension

As described in [this Zulip thread](https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer/topic/Use.20Rust.20Analyzer.20in.20another.20VSCode.20extension), I would like to experiment with using Rust Analyzer's language server inside another VSCode extension, [Flowistry](https://github.com/willcrichton/flowistry). My current use case is to use one of Rust Analyzer's assists (extract function).

This PR would enable that experimentation by exporting the `lc.LanguageClient` from the `activate` function, which [allows other extensions to access it](https://code.visualstudio.com/api/references/vscode-api#extensions). This PR does **not** commit RA to any stability guarantees about the language client, similar to how rustc exports an unstable API.
-rw-r--r--editors/code/src/main.ts15
1 files changed, 12 insertions, 3 deletions
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 0451e4c3d6e..7591865390b 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -1,4 +1,5 @@
 import * as vscode from 'vscode';
+import * as lc from 'vscode-languageclient/node';
 import * as os from "os";
 
 import * as commands from './commands';
@@ -14,16 +15,20 @@ let ctx: Ctx | undefined;
 
 const RUST_PROJECT_CONTEXT_NAME = "inRustProject";
 
-export async function activate(context: vscode.ExtensionContext) {
+export interface RustAnalyzerExtensionApi {
+    client: lc.LanguageClient;
+}
+
+export async function activate(context: vscode.ExtensionContext): Promise<RustAnalyzerExtensionApi> {
     // VS Code doesn't show a notification when an extension fails to activate
     // so we do it ourselves.
-    await tryActivate(context).catch(err => {
+    return await tryActivate(context).catch(err => {
         void vscode.window.showErrorMessage(`Cannot activate rust-analyzer: ${err.message}`);
         throw err;
     });
 }
 
-async function tryActivate(context: vscode.ExtensionContext) {
+async function tryActivate(context: vscode.ExtensionContext): Promise<RustAnalyzerExtensionApi> {
     const config = new Config(context);
     const state = new PersistentState(context.globalState);
     const serverPath = await bootstrap(context, config, state).catch(err => {
@@ -62,6 +67,10 @@ async function tryActivate(context: vscode.ExtensionContext) {
         null,
         ctx.subscriptions,
     );
+
+    return {
+        client: ctx.client
+    };
 }
 
 async function initCommonContext(context: vscode.ExtensionContext, ctx: Ctx) {