aboutsummaryrefslogtreecommitdiff
path: root/editors/code
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code')
-rw-r--r--editors/code/package.json23
-rw-r--r--editors/code/src/config.ts11
-rw-r--r--editors/code/src/installation/interfaces.ts15
-rw-r--r--editors/code/src/installation/server.ts28
4 files changed, 45 insertions, 32 deletions
diff --git a/editors/code/package.json b/editors/code/package.json
index 225739328..7a4a93e30 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -191,7 +191,7 @@
191 "properties": { 191 "properties": {
192 "lsp.diagnostics": { 192 "lsp.diagnostics": {
193 "type": "boolean", 193 "type": "boolean",
194 "description": "Whether to show diagnostics from `cargo check`" 194 "markdownDescription": "Whether to show diagnostics from `cargo check`"
195 }, 195 },
196 "completion.insertion.add-call-parenthesis": { 196 "completion.insertion.add-call-parenthesis": {
197 "type": "boolean", 197 "type": "boolean",
@@ -203,7 +203,7 @@
203 }, 203 },
204 "completion.enable-postfix": { 204 "completion.enable-postfix": {
205 "type": "boolean", 205 "type": "boolean",
206 "description": "Whether to show postfix snippets like `dbg`, `if`, `not`, etc." 206 "markdownDescription": "Whether to show postfix snippets like `dbg`, `if`, `not`, etc."
207 }, 207 },
208 "call-info.full": { 208 "call-info.full": {
209 "type": "boolean", 209 "type": "boolean",
@@ -211,14 +211,19 @@
211 }, 211 },
212 "notifications.workspace-loaded": { 212 "notifications.workspace-loaded": {
213 "type": "boolean", 213 "type": "boolean",
214 "description": "Whether to show `workspace loaded` message" 214 "markdownDescription": "Whether to show `workspace loaded` message"
215 }, 215 },
216 "notifications.cargo-toml-not-found": { 216 "notifications.cargo-toml-not-found": {
217 "type": "boolean", 217 "type": "boolean",
218 "description": "Whether to show `can't find Cargo.toml` error message" 218 "markdownDescription": "Whether to show `can't find Cargo.toml` error message"
219 } 219 }
220 } 220 }
221 }, 221 },
222 "rust-analyzer.updates.askBeforeDownload": {
223 "type": "boolean",
224 "default": true,
225 "description": "Whether to ask for permission before downloading any files from the Internet"
226 },
222 "rust-analyzer.serverPath": { 227 "rust-analyzer.serverPath": {
223 "type": [ 228 "type": [
224 "null", 229 "null",
@@ -251,24 +256,24 @@
251 "rust-analyzer.cargo-watch.enable": { 256 "rust-analyzer.cargo-watch.enable": {
252 "type": "boolean", 257 "type": "boolean",
253 "default": true, 258 "default": true,
254 "description": "Run `cargo check` for diagnostics on save" 259 "markdownDescription": "Run `cargo check` for diagnostics on save"
255 }, 260 },
256 "rust-analyzer.cargo-watch.arguments": { 261 "rust-analyzer.cargo-watch.arguments": {
257 "type": "array", 262 "type": "array",
258 "items": { 263 "items": {
259 "type": "string" 264 "type": "string"
260 }, 265 },
261 "description": "`cargo-watch` arguments. (e.g: `--features=\"shumway,pdf\"` will run as `cargo watch -x \"check --features=\"shumway,pdf\"\"` )", 266 "markdownDescription": "`cargo-watch` arguments. (e.g: `--features=\"shumway,pdf\"` will run as `cargo watch -x \"check --features=\"shumway,pdf\"\"` )",
262 "default": [] 267 "default": []
263 }, 268 },
264 "rust-analyzer.cargo-watch.command": { 269 "rust-analyzer.cargo-watch.command": {
265 "type": "string", 270 "type": "string",
266 "description": "`cargo-watch` command. (e.g: `clippy` will run as `cargo watch -x clippy` )", 271 "markdownDescription": "`cargo-watch` command. (e.g: `clippy` will run as `cargo watch -x clippy` )",
267 "default": "check" 272 "default": "check"
268 }, 273 },
269 "rust-analyzer.cargo-watch.allTargets": { 274 "rust-analyzer.cargo-watch.allTargets": {
270 "type": "boolean", 275 "type": "boolean",
271 "description": "Check all targets and tests (will be passed as `--all-targets`)", 276 "markdownDescription": "Check all targets and tests (will be passed as `--all-targets`)",
272 "default": true 277 "default": true
273 }, 278 },
274 "rust-analyzer.trace.server": { 279 "rust-analyzer.trace.server": {
@@ -320,7 +325,7 @@
320 "rust-analyzer.cargoFeatures.noDefaultFeatures": { 325 "rust-analyzer.cargoFeatures.noDefaultFeatures": {
321 "type": "boolean", 326 "type": "boolean",
322 "default": false, 327 "default": false,
323 "description": "Do not activate the `default` feature" 328 "markdownDescription": "Do not activate the `default` feature"
324 }, 329 },
325 "rust-analyzer.cargoFeatures.allFeatures": { 330 "rust-analyzer.cargoFeatures.allFeatures": {
326 "type": "boolean", 331 "type": "boolean",
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index bf915102c..b72206d3c 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -1,6 +1,6 @@
1import * as os from "os"; 1import * as os from "os";
2import * as vscode from 'vscode'; 2import * as vscode from 'vscode';
3import { BinarySource } from "./installation/interfaces"; 3import { ArtifactSource } from "./installation/interfaces";
4import { log } from "./util"; 4import { log } from "./util";
5 5
6const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG; 6const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG;
@@ -114,12 +114,12 @@ export class Config {
114 } 114 }
115 } 115 }
116 116
117 get serverSource(): null | BinarySource { 117 get serverSource(): null | ArtifactSource {
118 const serverPath = RA_LSP_DEBUG ?? this.cfg.get<null | string>("serverPath"); 118 const serverPath = RA_LSP_DEBUG ?? this.cfg.get<null | string>("serverPath");
119 119
120 if (serverPath) { 120 if (serverPath) {
121 return { 121 return {
122 type: BinarySource.Type.ExplicitPath, 122 type: ArtifactSource.Type.ExplicitPath,
123 path: Config.replaceTildeWithHomeDir(serverPath) 123 path: Config.replaceTildeWithHomeDir(serverPath)
124 }; 124 };
125 } 125 }
@@ -129,11 +129,12 @@ export class Config {
129 if (!prebuiltBinaryName) return null; 129 if (!prebuiltBinaryName) return null;
130 130
131 return { 131 return {
132 type: BinarySource.Type.GithubRelease, 132 type: ArtifactSource.Type.GithubRelease,
133 dir: this.ctx.globalStoragePath, 133 dir: this.ctx.globalStoragePath,
134 file: prebuiltBinaryName, 134 file: prebuiltBinaryName,
135 storage: this.ctx.globalState, 135 storage: this.ctx.globalState,
136 version: Config.extensionVersion, 136 tag: Config.extensionVersion,
137 askBeforeDownload: this.cfg.get("updates.askBeforeDownload") as boolean,
137 repo: { 138 repo: {
138 name: "rust-analyzer", 139 name: "rust-analyzer",
139 owner: "rust-analyzer", 140 owner: "rust-analyzer",
diff --git a/editors/code/src/installation/interfaces.ts b/editors/code/src/installation/interfaces.ts
index e40839e4b..50b635921 100644
--- a/editors/code/src/installation/interfaces.ts
+++ b/editors/code/src/installation/interfaces.ts
@@ -14,14 +14,14 @@ export interface ArtifactReleaseInfo {
14} 14}
15 15
16/** 16/**
17 * Represents the source of a binary artifact which is either specified by the user 17 * Represents the source of a an artifact which is either specified by the user
18 * explicitly, or bundled by this extension from GitHub releases. 18 * explicitly, or bundled by this extension from GitHub releases.
19 */ 19 */
20export type BinarySource = BinarySource.ExplicitPath | BinarySource.GithubRelease; 20export type ArtifactSource = ArtifactSource.ExplicitPath | ArtifactSource.GithubRelease;
21 21
22export namespace BinarySource { 22export namespace ArtifactSource {
23 /** 23 /**
24 * Type tag for `BinarySource` discriminated union. 24 * Type tag for `ArtifactSource` discriminated union.
25 */ 25 */
26 export const enum Type { ExplicitPath, GithubRelease } 26 export const enum Type { ExplicitPath, GithubRelease }
27 27
@@ -56,13 +56,18 @@ export namespace BinarySource {
56 /** 56 /**
57 * Tag of github release that denotes a version required by this extension. 57 * Tag of github release that denotes a version required by this extension.
58 */ 58 */
59 version: string; 59 tag: string;
60 60
61 /** 61 /**
62 * Object that provides `get()/update()` operations to store metadata 62 * Object that provides `get()/update()` operations to store metadata
63 * about the actual binary, e.g. its actual version. 63 * about the actual binary, e.g. its actual version.
64 */ 64 */
65 storage: vscode.Memento; 65 storage: vscode.Memento;
66
67 /**
68 * Ask for the user permission before downloading the artifact.
69 */
70 askBeforeDownload: boolean;
66 } 71 }
67 72
68} 73}
diff --git a/editors/code/src/installation/server.ts b/editors/code/src/installation/server.ts
index 6a6cf4f8c..ef1c45ff6 100644
--- a/editors/code/src/installation/server.ts
+++ b/editors/code/src/installation/server.ts
@@ -3,12 +3,12 @@ import * as path from "path";
3import { promises as dns } from "dns"; 3import { promises as dns } from "dns";
4import { spawnSync } from "child_process"; 4import { spawnSync } from "child_process";
5 5
6import { BinarySource } from "./interfaces"; 6import { ArtifactSource } from "./interfaces";
7import { fetchArtifactReleaseInfo } from "./fetch_artifact_release_info"; 7import { fetchArtifactReleaseInfo } from "./fetch_artifact_release_info";
8import { downloadArtifact } from "./download_artifact"; 8import { downloadArtifact } from "./download_artifact";
9import { log, assert } from "../util"; 9import { log, assert } from "../util";
10 10
11export async function ensureServerBinary(source: null | BinarySource): Promise<null | string> { 11export async function ensureServerBinary(source: null | ArtifactSource): Promise<null | string> {
12 if (!source) { 12 if (!source) {
13 vscode.window.showErrorMessage( 13 vscode.window.showErrorMessage(
14 "Unfortunately we don't ship binaries for your platform yet. " + 14 "Unfortunately we don't ship binaries for your platform yet. " +
@@ -22,7 +22,7 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
22 } 22 }
23 23
24 switch (source.type) { 24 switch (source.type) {
25 case BinarySource.Type.ExplicitPath: { 25 case ArtifactSource.Type.ExplicitPath: {
26 if (isBinaryAvailable(source.path)) { 26 if (isBinaryAvailable(source.path)) {
27 return source.path; 27 return source.path;
28 } 28 }
@@ -34,11 +34,11 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
34 ); 34 );
35 return null; 35 return null;
36 } 36 }
37 case BinarySource.Type.GithubRelease: { 37 case ArtifactSource.Type.GithubRelease: {
38 const prebuiltBinaryPath = path.join(source.dir, source.file); 38 const prebuiltBinaryPath = path.join(source.dir, source.file);
39 39
40 const installedVersion: null | string = getServerVersion(source.storage); 40 const installedVersion: null | string = getServerVersion(source.storage);
41 const requiredVersion: string = source.version; 41 const requiredVersion: string = source.tag;
42 42
43 log.debug("Installed version:", installedVersion, "required:", requiredVersion); 43 log.debug("Installed version:", installedVersion, "required:", requiredVersion);
44 44
@@ -46,12 +46,14 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
46 return prebuiltBinaryPath; 46 return prebuiltBinaryPath;
47 } 47 }
48 48
49 const userResponse = await vscode.window.showInformationMessage( 49 if (source.askBeforeDownload) {
50 `Language server version ${source.version} for rust-analyzer is not installed. ` + 50 const userResponse = await vscode.window.showInformationMessage(
51 "Do you want to download it now?", 51 `Language server version ${source.tag} for rust-analyzer is not installed. ` +
52 "Download now", "Cancel" 52 "Do you want to download it now?",
53 ); 53 "Download now", "Cancel"
54 if (userResponse !== "Download now") return null; 54 );
55 if (userResponse !== "Download now") return null;
56 }
55 57
56 if (!await downloadServer(source)) return null; 58 if (!await downloadServer(source)) return null;
57 59
@@ -60,9 +62,9 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
60 } 62 }
61} 63}
62 64
63async function downloadServer(source: BinarySource.GithubRelease): Promise<boolean> { 65async function downloadServer(source: ArtifactSource.GithubRelease): Promise<boolean> {
64 try { 66 try {
65 const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.version); 67 const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.tag);
66 68
67 await downloadArtifact(releaseInfo, source.file, source.dir, "language server"); 69 await downloadArtifact(releaseInfo, source.file, source.dir, "language server");
68 await setServerVersion(source.storage, releaseInfo.releaseName); 70 await setServerVersion(source.storage, releaseInfo.releaseName);