From 6aa5ca4c2885fd363c7be3017fa0bae47fd59fe5 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 8 Nov 2022 10:05:55 -0800 Subject: [PATCH] Add launch/task variable completions to workspace file (#165842) Fix #164728 --- .../src/configurationEditingMain.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/extensions/configuration-editing/src/configurationEditingMain.ts b/extensions/configuration-editing/src/configurationEditingMain.ts index 41399c2194a..c29db75e29b 100644 --- a/extensions/configuration-editing/src/configurationEditingMain.ts +++ b/extensions/configuration-editing/src/configurationEditingMain.ts @@ -21,6 +21,9 @@ export function activate(context: vscode.ExtensionContext): void { // task.json variable suggestions context.subscriptions.push(registerVariableCompletions('**/tasks.json')); + // Workspace file launch/tasks variable completions + context.subscriptions.push(registerVariableCompletions('**/*.code-workspace')); + // keybindings.json/package.json context key suggestions context.subscriptions.push(registerContextKeyCompletions()); } @@ -38,6 +41,10 @@ function registerVariableCompletions(pattern: string): vscode.Disposable { provideCompletionItems(document, position, _token) { const location = getLocation(document.getText(), document.offsetAt(position)); if (isCompletingInsidePropertyStringValue(document, location, position)) { + if (document.fileName.endsWith('.code-workspace') && !isLocationInsideTopLevelProperty(location, ['launch', 'tasks'])) { + return []; + } + let range = document.getWordRangeAtPosition(position, /\$\{[^"\}]*\}?/); if (!range || range.start.isEqual(position) || range.end.isEqual(position) && document.getText(range).endsWith('}')) { range = new vscode.Range(position, position); @@ -84,6 +91,10 @@ function isCompletingInsidePropertyStringValue(document: vscode.TextDocument, lo return false; } +function isLocationInsideTopLevelProperty(location: Location, values: string[]) { + return values.includes(location.path[0] as string); +} + interface IExtensionsContent { recommendations: string[]; }