aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/code/src/client.ts2
-rw-r--r--editors/code/src/config.ts89
-rw-r--r--editors/code/src/installation/interfaces.ts58
-rw-r--r--editors/code/src/installation/language_server.ts10
4 files changed, 89 insertions, 70 deletions
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts
index 7639ed44b..2e3d4aba2 100644
--- a/editors/code/src/client.ts
+++ b/editors/code/src/client.ts
@@ -10,7 +10,7 @@ export async function createClient(config: Config): Promise<null | lc.LanguageCl
10 // It might be a good idea to test if the uri points to a file. 10 // It might be a good idea to test if the uri points to a file.
11 const workspaceFolderPath = workspace.workspaceFolders?.[0]?.uri.fsPath ?? '.'; 11 const workspaceFolderPath = workspace.workspaceFolders?.[0]?.uri.fsPath ?? '.';
12 12
13 const raLspServerPath = await ensureLanguageServerBinary(config.raLspServerSource); 13 const raLspServerPath = await ensureLanguageServerBinary(config.langServerSource);
14 if (!raLspServerPath) return null; 14 if (!raLspServerPath) return null;
15 15
16 const run: lc.Executable = { 16 const run: lc.Executable = {
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index aca5dab5a..f216ab461 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, BinarySourceType } from "./installation/interfaces"; 3import { BinarySource } from "./installation/interfaces";
4 4
5const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG; 5const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG;
6 6
@@ -18,20 +18,7 @@ export interface CargoFeatures {
18} 18}
19 19
20export class Config { 20export class Config {
21 readonly raLspServerGithubArtifactName = { 21 langServerSource!: null | BinarySource;
22 linux: "ra_lsp_server-linux",
23 darwin: "ra_lsp_server-mac",
24 win32: "ra_lsp_server-windows.exe",
25 aix: null,
26 android: null,
27 freebsd: null,
28 openbsd: null,
29 sunos: null,
30 cygwin: null,
31 netbsd: null,
32 }[process.platform];
33
34 raLspServerSource!: null | BinarySource;
35 22
36 highlightingOn = true; 23 highlightingOn = true;
37 rainbowHighlightingOn = false; 24 rainbowHighlightingOn = false;
@@ -72,6 +59,56 @@ export class Config {
72 return path; 59 return path;
73 } 60 }
74 61
62 /**
63 * Name of the binary artifact for `ra_lsp_server` that is published for
64 * `platform` on GitHub releases. (It is also stored under the same name when
65 * downloaded by the extension).
66 */
67 private static prebuiltLangServerFileName(platform: NodeJS.Platform): null | string {
68 switch (platform) {
69 case "linux": return "ra_lsp_server-linux";
70 case "darwin": return "ra_lsp_server-mac";
71 case "win32": return "ra_lsp_server-windows.exe";
72
73 // Users on these platforms yet need to manually build from sources
74 case "aix":
75 case "android":
76 case "freebsd":
77 case "openbsd":
78 case "sunos":
79 case "cygwin":
80 case "netbsd": return null;
81 // The list of platforms is exhaustive see (`NodeJS.Platform` type definition)
82 }
83 }
84
85 private static langServerBinarySource(
86 ctx: vscode.ExtensionContext,
87 config: vscode.WorkspaceConfiguration
88 ): null | BinarySource {
89 const raLspServerPath = RA_LSP_DEBUG ?? config.get<null | string>("raLspServerPath");
90
91 if (raLspServerPath) {
92 return {
93 type: BinarySource.Type.ExplicitPath,
94 path: Config.expandPathResolving(raLspServerPath)
95 };
96 }
97
98 const prebuiltBinaryName = Config.prebuiltLangServerFileName(process.platform);
99
100 return !prebuiltBinaryName ? null : {
101 type: BinarySource.Type.GithubRelease,
102 dir: ctx.globalStoragePath,
103 file: prebuiltBinaryName,
104 repo: {
105 name: "rust-analyzer",
106 owner: "rust-analyzer",
107 }
108 };
109 }
110
111
75 // FIXME: revisit the logic for `if (.has(...)) config.get(...)` set default 112 // FIXME: revisit the logic for `if (.has(...)) config.get(...)` set default
76 // values only in one place (i.e. remove default values from non-readonly members declarations) 113 // values only in one place (i.e. remove default values from non-readonly members declarations)
77 private refresh(ctx: vscode.ExtensionContext) { 114 private refresh(ctx: vscode.ExtensionContext) {
@@ -107,27 +144,7 @@ export class Config {
107 this.prevEnhancedTyping = this.enableEnhancedTyping; 144 this.prevEnhancedTyping = this.enableEnhancedTyping;
108 } 145 }
109 146
110 { 147 this.langServerSource = Config.langServerBinarySource(ctx, config);
111 const raLspServerPath = RA_LSP_DEBUG ?? config.get<null | string>("raLspServerPath");
112 if (raLspServerPath) {
113 this.raLspServerSource = {
114 type: BinarySourceType.ExplicitPath,
115 path: Config.expandPathResolving(raLspServerPath)
116 };
117 } else if (this.raLspServerGithubArtifactName) {
118 this.raLspServerSource = {
119 type: BinarySourceType.GithubBinary,
120 dir: ctx.globalStoragePath,
121 file: this.raLspServerGithubArtifactName,
122 repo: {
123 name: "rust-analyzer",
124 owner: "rust-analyzer",
125 }
126 };
127 } else {
128 this.raLspServerSource = null;
129 }
130 }
131 148
132 if (config.has('cargo-watch.enable')) { 149 if (config.has('cargo-watch.enable')) {
133 this.cargoWatchOptions.enable = config.get<boolean>( 150 this.cargoWatchOptions.enable = config.get<boolean>(
diff --git a/editors/code/src/installation/interfaces.ts b/editors/code/src/installation/interfaces.ts
index 03eac5b79..8039d0b90 100644
--- a/editors/code/src/installation/interfaces.ts
+++ b/editors/code/src/installation/interfaces.ts
@@ -12,42 +12,44 @@ export interface ArtifactMetadata {
12} 12}
13 13
14/** 14/**
15 * Type tag for `BinarySource` discriminated union.
16 */
17export enum BinarySourceType { ExplicitPath, GithubBinary }
18
19/**
20 * Represents the source of a binary artifact which is either specified by the user 15 * Represents the source of a binary artifact which is either specified by the user
21 * explicitly, or bundled by this extension from GitHub releases. 16 * explicitly, or bundled by this extension from GitHub releases.
22 */ 17 */
23export type BinarySource = ExplicitPathSource | GithubBinarySource; 18export type BinarySource = BinarySource.ExplicitPath | BinarySource.GithubRelease;
24
25
26export interface ExplicitPathSource {
27 type: BinarySourceType.ExplicitPath;
28 19
20export namespace BinarySource {
29 /** 21 /**
30 * Filesystem path to the binary specified by the user explicitly. 22 * Type tag for `BinarySource` discriminated union.
31 */ 23 */
32 path: string; 24 export const enum Type { ExplicitPath, GithubRelease }
33}
34 25
35export interface GithubBinarySource { 26 export interface ExplicitPath {
36 type: BinarySourceType.GithubBinary; 27 type: Type.ExplicitPath;
37 28
38 /** 29 /**
39 * Repository where the binary is stored. 30 * Filesystem path to the binary specified by the user explicitly.
40 */ 31 */
41 repo: GithubRepo; 32 path: string;
33 }
42 34
43 /** 35 export interface GithubRelease {
44 * Directory on the filesystem where the bundled binary is stored. 36 type: Type.GithubRelease;
45 */ 37
46 dir: string; 38 /**
39 * Repository where the binary is stored.
40 */
41 repo: GithubRepo;
42
43 /**
44 * Directory on the filesystem where the bundled binary is stored.
45 */
46 dir: string;
47
48 /**
49 * Name of the binary file. It is stored under the same name on GitHub releases
50 * and in local `.dir`.
51 */
52 file: string;
53 }
47 54
48 /**
49 * Name of the binary file. It is stored under the same name on GitHub releases
50 * and in local `.dir`.
51 */
52 file: string;
53} 55}
diff --git a/editors/code/src/installation/language_server.ts b/editors/code/src/installation/language_server.ts
index b75d3a00a..522d59eb5 100644
--- a/editors/code/src/installation/language_server.ts
+++ b/editors/code/src/installation/language_server.ts
@@ -5,12 +5,12 @@ import * as path from "path";
5import { strict as assert } from "assert"; 5import { strict as assert } from "assert";
6import { promises as fs } from "fs"; 6import { promises as fs } from "fs";
7 7
8import { BinarySource, BinarySourceType, GithubBinarySource } from "./interfaces"; 8import { BinarySource } from "./interfaces";
9import { fetchLatestArtifactMetadata } from "./fetch_latest_artifact_metadata"; 9import { fetchLatestArtifactMetadata } from "./fetch_latest_artifact_metadata";
10import { downloadFile } from "./download_file"; 10import { downloadFile } from "./download_file";
11 11
12export async function downloadLatestLanguageServer( 12export async function downloadLatestLanguageServer(
13 {file: artifactFileName, dir: installationDir, repo}: GithubBinarySource 13 {file: artifactFileName, dir: installationDir, repo}: BinarySource.GithubRelease
14) { 14) {
15 const binaryMetadata = await fetchLatestArtifactMetadata(repo, artifactFileName); 15 const binaryMetadata = await fetchLatestArtifactMetadata(repo, artifactFileName);
16 16
@@ -67,7 +67,7 @@ export async function ensureLanguageServerBinary(
67 } 67 }
68 68
69 switch (langServerSource.type) { 69 switch (langServerSource.type) {
70 case BinarySourceType.ExplicitPath: { 70 case BinarySource.Type.ExplicitPath: {
71 if (isBinaryAvailable(langServerSource.path)) { 71 if (isBinaryAvailable(langServerSource.path)) {
72 return langServerSource.path; 72 return langServerSource.path;
73 } 73 }
@@ -78,7 +78,7 @@ export async function ensureLanguageServerBinary(
78 ); 78 );
79 return null; 79 return null;
80 } 80 }
81 case BinarySourceType.GithubBinary: { 81 case BinarySource.Type.GithubRelease: {
82 const bundledBinaryPath = path.join(langServerSource.dir, langServerSource.file); 82 const bundledBinaryPath = path.join(langServerSource.dir, langServerSource.file);
83 83
84 if (!isBinaryAvailable(bundledBinaryPath)) { 84 if (!isBinaryAvailable(bundledBinaryPath)) {
@@ -106,7 +106,7 @@ export async function ensureLanguageServerBinary(
106 ); 106 );
107 107
108 vscode.window.showInformationMessage( 108 vscode.window.showInformationMessage(
109 "Rust analyzer language server was successfully installed" 109 "Rust analyzer language server was successfully installed 🦀"
110 ); 110 );
111 } 111 }
112 return bundledBinaryPath; 112 return bundledBinaryPath;