about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--docs/user/manual.adoc2
-rw-r--r--editors/code/.vscodeignore1
-rw-r--r--editors/code/src/config.ts2
-rw-r--r--editors/code/src/main.ts15
4 files changed, 19 insertions, 1 deletions
diff --git a/docs/user/manual.adoc b/docs/user/manual.adoc
index 4fbe2379c3d..cfcad7c66b7 100644
--- a/docs/user/manual.adoc
+++ b/docs/user/manual.adoc
@@ -74,6 +74,8 @@ The server binary is stored in:
 * macOS: `~/Library/Application\ Support/Code/User/globalStorage/matklad.rust-analyzer`
 * Windows: `%APPDATA%\Code\User\globalStorage\matklad.rust-analyzer`
 
+However, if you are using a version of the extension with a bundled server binary and you are not running NixOS, the server binary might be instead running from: `~/.vscode/extensions/matklad.rust-analyzer-VERSION`.
+
 Note that we only support two most recent versions of VS Code.
 
 ==== Updates
diff --git a/editors/code/.vscodeignore b/editors/code/.vscodeignore
index ec3c10e0258..09dc27056b3 100644
--- a/editors/code/.vscodeignore
+++ b/editors/code/.vscodeignore
@@ -10,4 +10,5 @@
 !package-lock.json
 !package.json
 !ra_syntax_tree.tmGrammar.json
+!server
 !README.md
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index 58947118c92..cb0868db597 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -36,9 +36,11 @@ export class Config {
     } = vscode.extensions.getExtension(this.extensionId)!.packageJSON;
 
     readonly globalStorageUri: vscode.Uri;
+    readonly installUri: vscode.Uri;
 
     constructor(ctx: vscode.ExtensionContext) {
         this.globalStorageUri = ctx.globalStorageUri;
+        this.installUri = ctx.extensionUri;
         vscode.workspace.onDidChangeConfiguration(this.onDidChangeConfiguration, this, ctx.subscriptions);
         this.refreshLogging();
     }
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index a06fc09fc8e..e2a9c4c737d 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -345,7 +345,20 @@ async function getServer(config: Config, state: PersistentState): Promise<string
     }
     const ext = platform.indexOf("-windows-") !== -1 ? ".exe" : "";
     const dest = vscode.Uri.joinPath(config.globalStorageUri, `rust-analyzer-${platform}${ext}`);
-    const exists = await vscode.workspace.fs.stat(dest).then(() => true, () => false);
+    const bundled = vscode.Uri.joinPath(config.installUri, "server", `rust-analyzer${ext}`);
+    const bundledExists = await vscode.workspace.fs.stat(bundled).then(() => true, () => false);
+    let exists = await vscode.workspace.fs.stat(dest).then(() => true, () => false);
+    if (bundledExists) {
+        await state.updateServerVersion(config.package.version);
+        if (!await isNixOs()) {
+            return bundled.fsPath;
+        }
+        if (!exists) {
+            await vscode.workspace.fs.copy(bundled, dest);
+            await patchelf(dest);
+            exists = true;
+        }
+    }
     if (!exists) {
         await state.updateServerVersion(undefined);
     }