Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'editors/code/src/config.ts')
-rw-r--r--editors/code/src/config.ts210
1 files changed, 122 insertions, 88 deletions
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index 9837fd16f5..592ebe0ce3 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -1,13 +1,16 @@
-import path = require('path');
-import * as vscode from 'vscode';
-import { Env } from './client';
+import path = require("path");
+import * as vscode from "vscode";
+import { Env } from "./client";
import { log } from "./util";
export type UpdatesChannel = "stable" | "nightly";
const NIGHTLY_TAG = "nightly";
-export type RunnableEnvCfg = undefined | Record<string, string> | { mask?: string; env: Record<string, string> }[];
+export type RunnableEnvCfg =
+ | undefined
+ | Record<string, string>
+ | { mask?: string; env: Record<string, string> }[];
export class Config {
readonly extensionId = "rust-lang.rust-analyzer";
@@ -20,8 +23,7 @@ export class Config {
"procMacro",
"files",
"lens", // works as lens.*
- ]
- .map(opt => `${this.rootSection}.${opt}`);
+ ].map((opt) => `${this.rootSection}.${opt}`);
readonly package: {
version: string;
@@ -33,7 +35,11 @@ export class Config {
constructor(ctx: vscode.ExtensionContext) {
this.globalStorageUri = ctx.globalStorageUri;
- vscode.workspace.onDidChangeConfiguration(this.onDidChangeConfiguration, this, ctx.subscriptions);
+ vscode.workspace.onDidChangeConfiguration(
+ this.onDidChangeConfiguration,
+ this,
+ ctx.subscriptions
+ );
this.refreshLogging();
}
@@ -48,8 +54,8 @@ export class Config {
private async onDidChangeConfiguration(event: vscode.ConfigurationChangeEvent) {
this.refreshLogging();
- const requiresReloadOpt = this.requiresReloadOpts.find(
- opt => event.affectsConfiguration(opt)
+ const requiresReloadOpt = this.requiresReloadOpts.find((opt) =>
+ event.affectsConfiguration(opt)
);
if (!requiresReloadOpt) return;
@@ -94,8 +100,12 @@ export class Config {
get serverPath() {
return this.get<null | string>("server.path") ?? this.get<null | string>("serverPath");
}
- get serverExtraEnv() { return this.get<Env | null>("server.extraEnv") ?? {}; }
- get traceExtension() { return this.get<boolean>("trace.extension"); }
+ get serverExtraEnv() {
+ return this.get<Env | null>("server.extraEnv") ?? {};
+ }
+ get traceExtension() {
+ return this.get<boolean>("trace.extension");
+ }
get cargoRunner() {
return this.get<string | undefined>("cargoRunner");
@@ -109,7 +119,8 @@ export class Config {
let sourceFileMap = this.get<Record<string, string> | "auto">("debug.sourceFileMap");
if (sourceFileMap !== "auto") {
// "/rustc/<id>" used by suggestions only.
- const { ["/rustc/<id>"]: _, ...trimmed } = this.get<Record<string, string>>("debug.sourceFileMap");
+ const { ["/rustc/<id>"]: _, ...trimmed } =
+ this.get<Record<string, string>>("debug.sourceFileMap");
sourceFileMap = trimmed;
}
@@ -117,7 +128,7 @@ export class Config {
engine: this.get<string>("debug.engine"),
engineSettings: this.get<object>("debug.engineSettings"),
openDebugPane: this.get<boolean>("debug.openDebugPane"),
- sourceFileMap: sourceFileMap
+ sourceFileMap: sourceFileMap,
};
}
@@ -139,57 +150,69 @@ export class Config {
export async function updateConfig(config: vscode.WorkspaceConfiguration) {
const renames = [
- ["assist.allowMergingIntoGlobImports", "imports.merge.glob",],
- ["assist.exprFillDefault", "assist.expressionFillDefault",],
- ["assist.importEnforceGranularity", "imports.granularity.enforce",],
- ["assist.importGranularity", "imports.granularity.group",],
- ["assist.importMergeBehavior", "imports.granularity.group",],
- ["assist.importMergeBehaviour", "imports.granularity.group",],
- ["assist.importGroup", "imports.group.enable",],
- ["assist.importPrefix", "imports.prefix",],
- ["primeCaches.enable", "cachePriming.enable",],
- ["cache.warmup", "cachePriming.enable",],
- ["cargo.loadOutDirsFromCheck", "cargo.buildScripts.enable",],
- ["cargo.runBuildScripts", "cargo.buildScripts.enable",],
- ["cargo.runBuildScriptsCommand", "cargo.buildScripts.overrideCommand",],
- ["cargo.useRustcWrapperForBuildScripts", "cargo.buildScripts.useRustcWrapper",],
- ["completion.snippets", "completion.snippets.custom",],
- ["diagnostics.enableExperimental", "diagnostics.experimental.enable",],
- ["experimental.procAttrMacros", "procMacro.attributes.enable",],
- ["highlighting.strings", "semanticHighlighting.strings.enable",],
- ["highlightRelated.breakPoints", "highlightRelated.breakPoints.enable",],
- ["highlightRelated.exitPoints", "highlightRelated.exitPoints.enable",],
- ["highlightRelated.yieldPoints", "highlightRelated.yieldPoints.enable",],
- ["highlightRelated.references", "highlightRelated.references.enable",],
- ["hover.documentation", "hover.documentation.enable",],
- ["hover.linksInHover", "hover.links.enable",],
- ["hoverActions.linksInHover", "hover.links.enable",],
- ["hoverActions.debug", "hover.actions.debug.enable",],
- ["hoverActions.enable", "hover.actions.enable.enable",],
- ["hoverActions.gotoTypeDef", "hover.actions.gotoTypeDef.enable",],
- ["hoverActions.implementations", "hover.actions.implementations.enable",],
- ["hoverActions.references", "hover.actions.references.enable",],
- ["hoverActions.run", "hover.actions.run.enable",],
- ["inlayHints.chainingHints", "inlayHints.chainingHints.enable",],
- ["inlayHints.closureReturnTypeHints", "inlayHints.closureReturnTypeHints.enable",],
- ["inlayHints.hideNamedConstructorHints", "inlayHints.typeHints.hideNamedConstructor",],
- ["inlayHints.parameterHints", "inlayHints.parameterHints.enable",],
- ["inlayHints.reborrowHints", "inlayHints.reborrowHints.enable",],
- ["inlayHints.typeHints", "inlayHints.typeHints.enable",],
- ["lruCapacity", "lru.capacity",],
- ["runnables.cargoExtraArgs", "runnables.extraArgs",],
- ["runnables.overrideCargo", "runnables.command",],
- ["rustcSource", "rustc.source",],
- ["rustfmt.enableRangeFormatting", "rustfmt.rangeFormatting.enable"]
+ ["assist.allowMergingIntoGlobImports", "imports.merge.glob"],
+ ["assist.exprFillDefault", "assist.expressionFillDefault"],
+ ["assist.importEnforceGranularity", "imports.granularity.enforce"],
+ ["assist.importGranularity", "imports.granularity.group"],
+ ["assist.importMergeBehavior", "imports.granularity.group"],
+ ["assist.importMergeBehaviour", "imports.granularity.group"],
+ ["assist.importGroup", "imports.group.enable"],
+ ["assist.importPrefix", "imports.prefix"],
+ ["primeCaches.enable", "cachePriming.enable"],
+ ["cache.warmup", "cachePriming.enable"],
+ ["cargo.loadOutDirsFromCheck", "cargo.buildScripts.enable"],
+ ["cargo.runBuildScripts", "cargo.buildScripts.enable"],
+ ["cargo.runBuildScriptsCommand", "cargo.buildScripts.overrideCommand"],
+ ["cargo.useRustcWrapperForBuildScripts", "cargo.buildScripts.useRustcWrapper"],
+ ["completion.snippets", "completion.snippets.custom"],
+ ["diagnostics.enableExperimental", "diagnostics.experimental.enable"],
+ ["experimental.procAttrMacros", "procMacro.attributes.enable"],
+ ["highlighting.strings", "semanticHighlighting.strings.enable"],
+ ["highlightRelated.breakPoints", "highlightRelated.breakPoints.enable"],
+ ["highlightRelated.exitPoints", "highlightRelated.exitPoints.enable"],
+ ["highlightRelated.yieldPoints", "highlightRelated.yieldPoints.enable"],
+ ["highlightRelated.references", "highlightRelated.references.enable"],
+ ["hover.documentation", "hover.documentation.enable"],
+ ["hover.linksInHover", "hover.links.enable"],
+ ["hoverActions.linksInHover", "hover.links.enable"],
+ ["hoverActions.debug", "hover.actions.debug.enable"],
+ ["hoverActions.enable", "hover.actions.enable.enable"],
+ ["hoverActions.gotoTypeDef", "hover.actions.gotoTypeDef.enable"],
+ ["hoverActions.implementations", "hover.actions.implementations.enable"],
+ ["hoverActions.references", "hover.actions.references.enable"],
+ ["hoverActions.run", "hover.actions.run.enable"],
+ ["inlayHints.chainingHints", "inlayHints.chainingHints.enable"],
+ ["inlayHints.closureReturnTypeHints", "inlayHints.closureReturnTypeHints.enable"],
+ ["inlayHints.hideNamedConstructorHints", "inlayHints.typeHints.hideNamedConstructor"],
+ ["inlayHints.parameterHints", "inlayHints.parameterHints.enable"],
+ ["inlayHints.reborrowHints", "inlayHints.reborrowHints.enable"],
+ ["inlayHints.typeHints", "inlayHints.typeHints.enable"],
+ ["lruCapacity", "lru.capacity"],
+ ["runnables.cargoExtraArgs", "runnables.extraArgs"],
+ ["runnables.overrideCargo", "runnables.command"],
+ ["rustcSource", "rustc.source"],
+ ["rustfmt.enableRangeFormatting", "rustfmt.rangeFormatting.enable"],
];
for (const [oldKey, newKey] of renames) {
const inspect = config.inspect(oldKey);
if (inspect !== undefined) {
const valMatrix = [
- { val: inspect.globalValue, langVal: inspect.globalLanguageValue, target: vscode.ConfigurationTarget.Global },
- { val: inspect.workspaceFolderValue, langVal: inspect.workspaceFolderLanguageValue, target: vscode.ConfigurationTarget.WorkspaceFolder },
- { val: inspect.workspaceValue, langVal: inspect.workspaceLanguageValue, target: vscode.ConfigurationTarget.Workspace }
+ {
+ val: inspect.globalValue,
+ langVal: inspect.globalLanguageValue,
+ target: vscode.ConfigurationTarget.Global,
+ },
+ {
+ val: inspect.workspaceFolderValue,
+ langVal: inspect.workspaceFolderLanguageValue,
+ target: vscode.ConfigurationTarget.WorkspaceFolder,
+ },
+ {
+ val: inspect.workspaceValue,
+ langVal: inspect.workspaceLanguageValue,
+ target: vscode.ConfigurationTarget.Workspace,
+ },
];
for (const { val, langVal, target } of valMatrix) {
const pred = (val: unknown) => {
@@ -197,7 +220,14 @@ export async function updateConfig(config: vscode.WorkspaceConfiguration) {
// that means on the next run we would find these again, but as objects with
// these properties causing us to destroy the config
// so filter those already updated ones out
- return val !== undefined && !(typeof val === "object" && val !== null && (val.hasOwnProperty("enable") || val.hasOwnProperty("custom")));
+ return (
+ val !== undefined &&
+ !(
+ typeof val === "object" &&
+ val !== null &&
+ (val.hasOwnProperty("enable") || val.hasOwnProperty("custom"))
+ )
+ );
};
if (pred(val)) {
await config.update(newKey, val, target, false);
@@ -216,48 +246,50 @@ export function substituteVariablesInEnv(env: Env): Env {
const missingDeps = new Set<string>();
// vscode uses `env:ENV_NAME` for env vars resolution, and it's easier
// to follow the same convention for our dependency tracking
- const definedEnvKeys = new Set(Object.keys(env).map(key => `env:${key}`));
- const envWithDeps = Object.fromEntries(Object.entries(env).map(([key, value]) => {
- const deps = new Set<string>();
- const depRe = new RegExp(/\${(?<depName>.+?)}/g);
- let match = undefined;
- while ((match = depRe.exec(value))) {
- const depName = match.groups!.depName;
- deps.add(depName);
- // `depName` at this point can have a form of `expression` or
- // `prefix:expression`
- if (!definedEnvKeys.has(depName)) {
- missingDeps.add(depName);
+ const definedEnvKeys = new Set(Object.keys(env).map((key) => `env:${key}`));
+ const envWithDeps = Object.fromEntries(
+ Object.entries(env).map(([key, value]) => {
+ const deps = new Set<string>();
+ const depRe = new RegExp(/\${(?<depName>.+?)}/g);
+ let match = undefined;
+ while ((match = depRe.exec(value))) {
+ const depName = match.groups!.depName;
+ deps.add(depName);
+ // `depName` at this point can have a form of `expression` or
+ // `prefix:expression`
+ if (!definedEnvKeys.has(depName)) {
+ missingDeps.add(depName);
+ }
}
- }
- return [`env:${key}`, { deps: [...deps], value }];
- }));
+ return [`env:${key}`, { deps: [...deps], value }];
+ })
+ );
const resolved = new Set<string>();
for (const dep of missingDeps) {
const match = /(?<prefix>.*?):(?<body>.+)/.exec(dep);
if (match) {
const { prefix, body } = match.groups!;
- if (prefix === 'env') {
+ if (prefix === "env") {
const envName = body;
envWithDeps[dep] = {
- value: process.env[envName] ?? '',
- deps: []
+ value: process.env[envName] ?? "",
+ deps: [],
};
resolved.add(dep);
} else {
// we can't handle other prefixes at the moment
// leave values as is, but still mark them as resolved
envWithDeps[dep] = {
- value: '${' + dep + '}',
- deps: []
+ value: "${" + dep + "}",
+ deps: [],
};
resolved.add(dep);
}
} else {
envWithDeps[dep] = {
value: computeVscodeVar(dep),
- deps: []
+ deps: [],
};
}
}
@@ -267,11 +299,13 @@ export function substituteVariablesInEnv(env: Env): Env {
do {
leftToResolveSize = toResolve.size;
for (const key of toResolve) {
- if (envWithDeps[key].deps.every(dep => resolved.has(dep))) {
+ if (envWithDeps[key].deps.every((dep) => resolved.has(dep))) {
envWithDeps[key].value = envWithDeps[key].value.replace(
- /\${(?<depName>.+?)}/g, (_wholeMatch, depName) => {
+ /\${(?<depName>.+?)}/g,
+ (_wholeMatch, depName) => {
return envWithDeps[depName].value;
- });
+ }
+ );
resolved.add(key);
toResolve.delete(key);
}
@@ -302,16 +336,16 @@ function computeVscodeVar(varName: string): string {
return folders[0].uri.fsPath;
} else {
// no workspace opened
- return '';
+ return "";
}
},
workspaceFolderBasename: () => {
- const workspaceFolder = computeVscodeVar('workspaceFolder');
+ const workspaceFolder = computeVscodeVar("workspaceFolder");
if (workspaceFolder) {
return path.basename(workspaceFolder);
} else {
- return '';
+ return "";
}
},
@@ -323,13 +357,13 @@ function computeVscodeVar(varName: string): string {
// https://github.com/microsoft/vscode/blob/29eb316bb9f154b7870eb5204ec7f2e7cf649bec/src/vs/server/node/remoteTerminalChannel.ts#L56
execPath: () => process.env.VSCODE_EXEC_PATH ?? process.execPath,
- pathSeparator: () => path.sep
+ pathSeparator: () => path.sep,
};
if (varName in supportedVariables) {
return supportedVariables[varName]();
} else {
// can't resolve, keep the expression as is
- return '${' + varName + '}';
+ return "${" + varName + "}";
}
}