Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--docs/user/manual.adoc23
-rw-r--r--editors/code/package.json9
-rw-r--r--editors/code/src/config.ts10
-rw-r--r--editors/code/src/run.ts14
4 files changed, 50 insertions, 6 deletions
diff --git a/docs/user/manual.adoc b/docs/user/manual.adoc
index 2cf985adab..5dafd1a4c8 100644
--- a/docs/user/manual.adoc
+++ b/docs/user/manual.adoc
@@ -949,6 +949,29 @@ Or it is possible to specify vars more granularly:
You can use any valid regular expression as a mask.
Also note that a full runnable name is something like *run bin_or_example_name*, *test some::mod::test_name* or *test-mod some::mod*, so it is possible to distinguish binaries, single tests, and test modules with this masks: `"^run"`, `"^test "` (the trailing space matters!), and `"^test-mod"` respectively.
+If needed, you can set different values for different platforms:
+```jsonc
+"rust-analyzer.runnables.extraEnv": [
+ {
+ "platform": "win32", // windows only
+ env: {
+ "APP_DATA": "windows specific data"
+ }
+ },
+ {
+ "platform": ["linux"],
+ "env": {
+ "APP_DATA": "linux data",
+ }
+ },
+ { // for all platforms
+ "env": {
+ "APP_COMMON_DATA": "xxx",
+ }
+ }
+]
+```
+
==== Compiler feedback from external commands
Instead of relying on the built-in `cargo check`, you can configure Code to run a command in the background and use the `$rustc-watch` problem matcher to generate inline error markers from its output.
diff --git a/editors/code/package.json b/editors/code/package.json
index 8b20011ba5..76d7e91f38 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -328,6 +328,15 @@
"items": {
"type": "object",
"properties": {
+ "platform": {
+ "type": [
+ "null",
+ "string",
+ "array"
+ ],
+ "default": null,
+ "markdownDescription": "Platform(s) filter like \"win32\" or [\"linux\", \"win32\"]. See [process.platform](https://nodejs.org/api/process.html#processplatform) values."
+ },
"mask": {
"type": "string",
"description": "Runnable name mask"
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index a047f9659a..0e64054c11 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -6,10 +6,12 @@ import type { Env } from "./client";
import { log } from "./util";
import { expectNotUndefined, unwrapUndefinable } from "./undefinable";
-export type RunnableEnvCfg =
- | undefined
- | Record<string, string>
- | { mask?: string; env: Record<string, string> }[];
+export type RunnableEnvCfgItem = {
+ mask?: string;
+ env: Record<string, string>;
+ platform?: string | string[];
+};
+export type RunnableEnvCfg = undefined | Record<string, string> | RunnableEnvCfgItem[];
export class Config {
readonly extensionId = "rust-lang.rust-analyzer";
diff --git a/editors/code/src/run.ts b/editors/code/src/run.ts
index c893d39055..57881803a6 100644
--- a/editors/code/src/run.ts
+++ b/editors/code/src/run.ts
@@ -5,7 +5,7 @@ import * as tasks from "./tasks";
import type { CtxInit } from "./ctx";
import { makeDebugConfig } from "./debug";
-import type { Config, RunnableEnvCfg } from "./config";
+import type { Config, RunnableEnvCfg, RunnableEnvCfgItem } from "./config";
import { unwrapUndefinable } from "./undefinable";
const quickPickButtons = [
@@ -112,11 +112,21 @@ export function prepareEnv(
}
Object.assign(env, process.env as { [key: string]: string });
+ const platform = process.platform;
+
+ const checkPlatform = (it: RunnableEnvCfgItem) => {
+ if (it.platform) {
+ const platforms = Array.isArray(it.platform) ? it.platform : [it.platform];
+ return platforms.indexOf(platform) >= 0;
+ }
+ return true;
+ };
if (runnableEnvCfg) {
if (Array.isArray(runnableEnvCfg)) {
for (const it of runnableEnvCfg) {
- if (!it.mask || new RegExp(it.mask).test(runnable.label)) {
+ const masked = !it.mask || new RegExp(it.mask).test(runnable.label);
+ if (masked && checkPlatform(it)) {
Object.assign(env, it.env);
}
}