rust/editors/code/src/config.ts

249 lines
8.4 KiB
TypeScript
Raw Normal View History

import * as os from "os";
2018-10-07 15:59:02 -05:00
import * as vscode from 'vscode';
import { BinarySource, BinarySourceType } from "./installation/interfaces";
2018-10-07 15:59:02 -05:00
const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG;
export interface CargoWatchOptions {
enable: boolean;
arguments: string[];
command: string;
allTargets: boolean;
2019-04-02 01:43:02 -05:00
}
2019-12-13 04:16:34 -06:00
export interface CargoFeatures {
noDefaultFeatures: boolean;
allFeatures: boolean;
features: string[];
}
2018-10-07 15:59:02 -05:00
export class Config {
readonly raLspServerGithubArtifactName = {
linux: "ra_lsp_server-linux",
darwin: "ra_lsp_server-mac",
win32: "ra_lsp_server-windows.exe",
aix: null,
android: null,
freebsd: null,
openbsd: null,
sunos: null,
cygwin: null,
netbsd: null,
}[process.platform];
raLspServerSource!: null | BinarySource;
2019-12-31 10:28:27 -06:00
highlightingOn = true;
rainbowHighlightingOn = false;
enableEnhancedTyping = true;
lruCapacity: null | number = null;
displayInlayHints = true;
maxInlayHintLength: null | number = null;
2020-02-04 16:13:46 -06:00
excludeGlobs: string[] = [];
2019-12-31 10:28:27 -06:00
useClientWatching = true;
2020-02-04 16:13:46 -06:00
featureFlags: Record<string, boolean> = {};
// for internal use
2019-12-31 10:28:27 -06:00
withSysroot: null | boolean = null;
cargoWatchOptions: CargoWatchOptions = {
enable: true,
arguments: [],
command: '',
allTargets: true,
2019-04-02 01:43:02 -05:00
};
2019-12-31 10:28:27 -06:00
cargoFeatures: CargoFeatures = {
2019-12-13 04:16:34 -06:00
noDefaultFeatures: false,
allFeatures: true,
2019-12-13 04:16:34 -06:00
features: [],
};
2018-10-07 15:59:02 -05:00
private prevEnhancedTyping: null | boolean = null;
2019-12-13 04:16:34 -06:00
private prevCargoFeatures: null | CargoFeatures = null;
private prevCargoWatchOptions: null | CargoWatchOptions = null;
2019-12-31 10:34:52 -06:00
constructor(ctx: vscode.ExtensionContext) {
vscode.workspace.onDidChangeConfiguration(_ => this.refresh(ctx), null, ctx.subscriptions);
this.refresh(ctx);
2018-10-08 16:36:47 -05:00
}
2018-10-07 15:59:02 -05:00
private static expandPathResolving(path: string) {
if (path.startsWith('~/')) {
return path.replace('~', os.homedir());
}
return path;
}
// 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) {
2019-01-28 05:43:07 -06:00
const config = vscode.workspace.getConfiguration('rust-analyzer');
2019-12-13 04:16:34 -06:00
let requireReloadMessage = null;
2018-10-08 16:38:33 -05:00
if (config.has('highlightingOn')) {
this.highlightingOn = config.get('highlightingOn') as boolean;
}
2019-05-27 04:26:15 -05:00
if (config.has('rainbowHighlightingOn')) {
this.rainbowHighlightingOn = config.get(
2019-12-09 12:57:55 -06:00
'rainbowHighlightingOn',
2019-05-27 04:26:15 -05:00
) as boolean;
}
if (config.has('enableEnhancedTyping')) {
2019-02-07 04:54:41 -06:00
this.enableEnhancedTyping = config.get(
2019-12-09 12:57:55 -06:00
'enableEnhancedTyping',
2019-02-07 04:54:41 -06:00
) as boolean;
if (this.prevEnhancedTyping === null) {
this.prevEnhancedTyping = this.enableEnhancedTyping;
}
} else if (this.prevEnhancedTyping === null) {
this.prevEnhancedTyping = this.enableEnhancedTyping;
}
if (this.prevEnhancedTyping !== this.enableEnhancedTyping) {
requireReloadMessage =
'Changing enhanced typing setting requires a reload';
this.prevEnhancedTyping = this.enableEnhancedTyping;
}
{
const raLspServerPath = RA_LSP_DEBUG ?? config.get<null | string>("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;
}
}
if (config.has('cargo-watch.enable')) {
this.cargoWatchOptions.enable = config.get<boolean>(
'cargo-watch.enable',
true,
2019-04-02 01:43:02 -05:00
);
}
2019-04-02 00:07:40 -05:00
2019-06-24 05:50:34 -05:00
if (config.has('cargo-watch.arguments')) {
this.cargoWatchOptions.arguments = config.get<string[]>(
2019-06-24 05:50:34 -05:00
'cargo-watch.arguments',
[],
2019-04-02 01:43:02 -05:00
);
}
2019-06-24 05:02:20 -05:00
2019-06-24 05:50:34 -05:00
if (config.has('cargo-watch.command')) {
this.cargoWatchOptions.command = config.get<string>(
2019-06-24 05:50:34 -05:00
'cargo-watch.command',
2019-12-09 12:57:55 -06:00
'',
2019-06-24 05:02:20 -05:00
);
}
if (config.has('cargo-watch.allTargets')) {
this.cargoWatchOptions.allTargets = config.get<boolean>(
'cargo-watch.allTargets',
true,
);
}
2019-06-07 12:49:29 -05:00
if (config.has('lruCapacity')) {
this.lruCapacity = config.get('lruCapacity') as number;
}
2019-07-23 08:38:21 -05:00
if (config.has('displayInlayHints')) {
this.displayInlayHints = config.get('displayInlayHints') as boolean;
}
2019-10-18 06:40:03 -05:00
if (config.has('maxInlayHintLength')) {
this.maxInlayHintLength = config.get(
2019-12-09 12:57:55 -06:00
'maxInlayHintLength',
2019-10-18 06:40:03 -05:00
) as number;
}
if (config.has('excludeGlobs')) {
this.excludeGlobs = config.get('excludeGlobs') || [];
}
2019-09-06 08:25:24 -05:00
if (config.has('useClientWatching')) {
2019-12-17 05:41:44 -06:00
this.useClientWatching = config.get('useClientWatching') || true;
2019-09-06 08:25:24 -05:00
}
2019-08-22 06:44:16 -05:00
if (config.has('featureFlags')) {
this.featureFlags = config.get('featureFlags') || {};
}
if (config.has('withSysroot')) {
this.withSysroot = config.get('withSysroot') || false;
}
2019-12-13 04:16:34 -06:00
if (config.has('cargoFeatures.noDefaultFeatures')) {
this.cargoFeatures.noDefaultFeatures = config.get(
'cargoFeatures.noDefaultFeatures',
false,
);
}
if (config.has('cargoFeatures.allFeatures')) {
this.cargoFeatures.allFeatures = config.get(
'cargoFeatures.allFeatures',
true,
2019-12-13 04:16:34 -06:00
);
}
if (config.has('cargoFeatures.features')) {
this.cargoFeatures.features = config.get(
'cargoFeatures.features',
[],
);
}
if (
this.prevCargoFeatures !== null &&
(this.cargoFeatures.allFeatures !==
this.prevCargoFeatures.allFeatures ||
this.cargoFeatures.noDefaultFeatures !==
2019-12-30 16:30:35 -06:00
this.prevCargoFeatures.noDefaultFeatures ||
this.cargoFeatures.features.length !==
2019-12-30 16:30:35 -06:00
this.prevCargoFeatures.features.length ||
this.cargoFeatures.features.some(
(v, i) => v !== this.prevCargoFeatures!.features[i],
))
) {
2019-12-13 04:16:34 -06:00
requireReloadMessage = 'Changing cargo features requires a reload';
}
this.prevCargoFeatures = { ...this.cargoFeatures };
2020-01-14 21:52:49 -06:00
if (this.prevCargoWatchOptions !== null) {
const changed =
this.cargoWatchOptions.enable !== this.prevCargoWatchOptions.enable ||
this.cargoWatchOptions.command !== this.prevCargoWatchOptions.command ||
this.cargoWatchOptions.allTargets !== this.prevCargoWatchOptions.allTargets ||
this.cargoWatchOptions.arguments.length !== this.prevCargoWatchOptions.arguments.length ||
this.cargoWatchOptions.arguments.some(
(v, i) => v !== this.prevCargoWatchOptions!.arguments[i],
2020-01-14 21:52:49 -06:00
);
if (changed) {
requireReloadMessage = 'Changing cargo-watch options requires a reload';
}
}
this.prevCargoWatchOptions = { ...this.cargoWatchOptions };
2019-12-13 04:16:34 -06:00
if (requireReloadMessage !== null) {
const reloadAction = 'Reload now';
vscode.window
.showInformationMessage(requireReloadMessage, reloadAction)
.then(selectedAction => {
if (selectedAction === reloadAction) {
vscode.commands.executeCommand(
'workbench.action.reloadWindow',
);
}
});
}
2018-10-07 15:59:02 -05:00
}
}