about summary refs log tree commit diff
path: root/editors/code/src/config.ts
diff options
context:
space:
mode:
authorAndrei Listochkin <andrei.listochkin@ferrous-systems.com>2022-05-11 13:34:43 +0100
committerAndrei Listochkin <andrei.listochkin@ferrous-systems.com>2022-05-11 15:50:59 +0100
commit684fa2794f0c10280ff7b9fbcda73d5c7c1cf204 (patch)
treee42e0726193797074278277b7afff09a76aed2c6 /editors/code/src/config.ts
parent6c769ac00d12cc1436bdbb2bbbce80db0bb8d2d5 (diff)
downloadrust-684fa2794f0c10280ff7b9fbcda73d5c7c1cf204.tar.gz
rust-684fa2794f0c10280ff7b9fbcda73d5c7c1cf204.zip
VSCode variables support for substitutions
Tests now open Rust-Analyzer extension code in order to populate
VSCode variables.
Diffstat (limited to 'editors/code/src/config.ts')
-rw-r--r--editors/code/src/config.ts55
1 files changed, 54 insertions, 1 deletions
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index cfbdd696652..9165ba861d4 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -1,3 +1,4 @@
+import path = require('path');
 import * as vscode from 'vscode';
 import { Env } from './client';
 import { log } from "./util";
@@ -253,7 +254,10 @@ export function substituteVariablesInEnv(env: Env): Env {
                 resolved.add(dep);
             }
         } else {
-            // TODO: handle VSCode variables
+            envWithDeps[dep] = {
+                value: computeVscodeVar(dep),
+                deps: []
+            };
         }
     }
     const toResolve = new Set(Object.keys(envWithDeps));
@@ -279,3 +283,52 @@ export function substituteVariablesInEnv(env: Env): Env {
     }
     return resolvedEnv;
 }
+
+function computeVscodeVar(varName: string): string {
+    // https://code.visualstudio.com/docs/editor/variables-reference
+    const supportedVariables: { [k: string]: () => string } = {
+        workspaceFolder: () => {
+            const folders = vscode.workspace.workspaceFolders ?? [];
+            if (folders.length === 1) {
+                // TODO: support for remote workspaces?
+                return folders[0].uri.fsPath;
+            } else if (folders.length > 1) {
+                // could use currently opened document to detect the correct
+                // workspace. However, that would be determined by the document
+                // user has opened on Editor startup. Could lead to
+                // unpredictable workspace selection in practice.
+                // It's better to pick the first one
+                return folders[0].uri.fsPath;
+            } else {
+                // no workspace opened
+                return '';
+            }
+        },
+
+        workspaceFolderBasename: () => {
+            const workspaceFolder = computeVscodeVar('workspaceFolder');
+            if (workspaceFolder) {
+                return path.basename(workspaceFolder);
+            } else {
+                return '';
+            }
+        },
+
+        cwd: () => process.cwd(),
+
+        // see
+        // https://github.com/microsoft/vscode/blob/08ac1bb67ca2459496b272d8f4a908757f24f56f/src/vs/workbench/api/common/extHostVariableResolverService.ts#L81
+        // or
+        // 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
+    };
+
+    if (varName in supportedVariables) {
+        return supportedVariables[varName]();
+    } else {
+        // can't resolve, keep the expression as is
+        return '${' + varName + '}';
+    }
+}