diff --git a/docs/user/manual.adoc b/docs/user/manual.adoc index 4fbe2379c3..cfcad7c66b 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 ec3c10e025..09dc27056b 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 58947118c9..cb0868db59 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 a06fc09fc8..e2a9c4c737 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 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); }