From 539daf4454e3f11424a469e8fba26cacb325176a Mon Sep 17 00:00:00 2001 From: Veetaha Date: Sun, 9 Feb 2020 00:27:04 +0200 Subject: vscode: refactor platform artifact name query to switch statement, move BinarySource union variants into a namespace --- editors/code/src/client.ts | 2 +- editors/code/src/config.ts | 89 ++++++++++++++---------- editors/code/src/installation/interfaces.ts | 58 +++++++-------- editors/code/src/installation/language_server.ts | 10 +-- 4 files changed, 89 insertions(+), 70 deletions(-) (limited to 'editors') 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("raLspServerPath"); + + if (raLspServerPath) { + return { + type: BinarySource.Type.ExplicitPath, + path: Config.expandPathResolving(raLspServerPath) + }; + } + + const prebuiltBinaryName = Config.prebuiltLangServerFileName(process.platform); + + return !prebuiltBinaryName ? null : { + type: BinarySource.Type.GithubRelease, + dir: ctx.globalStoragePath, + file: prebuiltBinaryName, + repo: { + name: "rust-analyzer", + owner: "rust-analyzer", + } + }; + } + + // FIXME: revisit the logic for `if (.has(...)) config.get(...)` set default // values only in one place (i.e. remove default values from non-readonly members declarations) private refresh(ctx: vscode.ExtensionContext) { @@ -107,27 +144,7 @@ export class Config { this.prevEnhancedTyping = this.enableEnhancedTyping; } - { - const raLspServerPath = RA_LSP_DEBUG ?? config.get("raLspServerPath"); - if (raLspServerPath) { - this.raLspServerSource = { - type: BinarySourceType.ExplicitPath, - path: Config.expandPathResolving(raLspServerPath) - }; - } else if (this.raLspServerGithubArtifactName) { - this.raLspServerSource = { - type: BinarySourceType.GithubBinary, - dir: ctx.globalStoragePath, - file: this.raLspServerGithubArtifactName, - repo: { - name: "rust-analyzer", - owner: "rust-analyzer", - } - }; - } else { - this.raLspServerSource = null; - } - } + this.langServerSource = Config.langServerBinarySource(ctx, config); if (config.has('cargo-watch.enable')) { this.cargoWatchOptions.enable = config.get( 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 @@ -11,43 +11,45 @@ export interface ArtifactMetadata { downloadUrl: string; } -/** - * Type tag for `BinarySource` discriminated union. - */ -export enum BinarySourceType { ExplicitPath, GithubBinary } - /** * Represents the source of a binary artifact which is either specified by the user * explicitly, or bundled by this extension from GitHub releases. */ -export type BinarySource = ExplicitPathSource | GithubBinarySource; - - -export interface ExplicitPathSource { - type: BinarySourceType.ExplicitPath; +export type BinarySource = BinarySource.ExplicitPath | BinarySource.GithubRelease; +export namespace BinarySource { /** - * Filesystem path to the binary specified by the user explicitly. + * Type tag for `BinarySource` discriminated union. */ - path: string; -} + export const enum Type { ExplicitPath, GithubRelease } -export interface GithubBinarySource { - type: BinarySourceType.GithubBinary; + export interface ExplicitPath { + type: Type.ExplicitPath; - /** - * Repository where the binary is stored. - */ - repo: GithubRepo; + /** + * Filesystem path to the binary specified by the user explicitly. + */ + path: string; + } - /** - * Directory on the filesystem where the bundled binary is stored. - */ - dir: string; + export interface GithubRelease { + type: Type.GithubRelease; + + /** + * Repository where the binary is stored. + */ + repo: GithubRepo; + + /** + * Directory on the filesystem where the bundled binary is stored. + */ + dir: string; + + /** + * Name of the binary file. It is stored under the same name on GitHub releases + * and in local `.dir`. + */ + file: string; + } - /** - * Name of the binary file. It is stored under the same name on GitHub releases - * and in local `.dir`. - */ - file: string; } 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"; import { strict as assert } from "assert"; import { promises as fs } from "fs"; -import { BinarySource, BinarySourceType, GithubBinarySource } from "./interfaces"; +import { BinarySource } from "./interfaces"; import { fetchLatestArtifactMetadata } from "./fetch_latest_artifact_metadata"; import { downloadFile } from "./download_file"; export async function downloadLatestLanguageServer( - {file: artifactFileName, dir: installationDir, repo}: GithubBinarySource + {file: artifactFileName, dir: installationDir, repo}: BinarySource.GithubRelease ) { const binaryMetadata = await fetchLatestArtifactMetadata(repo, artifactFileName); @@ -67,7 +67,7 @@ export async function ensureLanguageServerBinary( } switch (langServerSource.type) { - case BinarySourceType.ExplicitPath: { + case BinarySource.Type.ExplicitPath: { if (isBinaryAvailable(langServerSource.path)) { return langServerSource.path; } @@ -78,7 +78,7 @@ export async function ensureLanguageServerBinary( ); return null; } - case BinarySourceType.GithubBinary: { + case BinarySource.Type.GithubRelease: { const bundledBinaryPath = path.join(langServerSource.dir, langServerSource.file); if (!isBinaryAvailable(bundledBinaryPath)) { @@ -106,7 +106,7 @@ export async function ensureLanguageServerBinary( ); vscode.window.showInformationMessage( - "Rust analyzer language server was successfully installed" + "Rust analyzer language server was successfully installed 🦀" ); } return bundledBinaryPath; -- cgit v1.2.3