From 21da13b1c84aacf128a9f510bd8e42ca10d62606 Mon Sep 17 00:00:00 2001 From: Brett Saviano Date: Fri, 18 Jul 2025 14:55:16 -0400 Subject: [PATCH] Fix resolving of server connection for files opened from InterSystems Explorer or XML preview --- src/extension.ts | 16 ++++++++++++++-- src/utils/index.ts | 26 +++++++++++++++++++------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index e581f2f4..503a6898 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1959,7 +1959,8 @@ export async function activate(context: vscode.ExtensionContext): Promise { // This function is exported as one of our API functions but is also used internally // for example to implement the async variant capable of resolving docker port number. function serverForUri(uri: vscode.Uri): any { - const { apiTarget } = connectionTarget(uri); + const { apiTarget, configName } = connectionTarget(uri); + const configNameLower = configName.toLowerCase(); const api = new AtelierAPI(apiTarget); // This function intentionally no longer exposes the password for a named server UNLESS it is already exposed as plaintext in settings. @@ -1991,7 +1992,18 @@ function serverForUri(uri: vscode.Uri): any { password: serverName === "" ? password - : vscode.workspace.getConfiguration(`intersystems.servers.${serverName.toLowerCase()}`, uri).get("password"), + : vscode.workspace + .getConfiguration( + `intersystems.servers.${serverName.toLowerCase()}`, + // objectscript(xml):// URIs are not in any workspace folder, + // so make sure we resolve the server definition with the proper + // granularity. This is needed to prevent other extensions like + // Language Server prompting for a passwoord when it's not needed. + [OBJECTSCRIPT_FILE_SCHEMA, OBJECTSCRIPTXML_FILE_SCHEMA].includes(uri.scheme) + ? vscode.workspace.workspaceFolders?.find((f) => f.name.toLowerCase() == configNameLower)?.uri + : uri + ) + .get("password"), namespace: ns, apiVersion: active ? apiVersion : undefined, serverVersion: active ? serverVersion : undefined, diff --git a/src/utils/index.ts b/src/utils/index.ts index 165eeadc..47f4cdb6 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -13,6 +13,7 @@ import { documentContentProvider, filesystemSchemas, outputLangId, + OBJECTSCRIPTXML_FILE_SCHEMA, } from "../extension"; import { getCategory } from "../commands/export"; import { isCSP, isfsDocumentName } from "../providers/FileSystemProvider/FileSystemProvider"; @@ -334,14 +335,21 @@ export function connectionTarget(uri?: vscode.Uri): ConnectionTarget { ? vscode.window.activeTextEditor.document.uri : undefined; if (uri) { - if (notIsfs(uri)) { - const folder = vscode.workspace.getWorkspaceFolder(uri); + if (uri.scheme == OBJECTSCRIPT_FILE_SCHEMA) { + // For objectscript:// files the authority is the workspace folder name + result.apiTarget = uri; + result.configName = uri.authority; + } else if (notIsfs(uri)) { + const folder = vscode.workspace.getWorkspaceFolder( + // For XML preview files the fragment contains the URI for connection purposes + uri.scheme == OBJECTSCRIPTXML_FILE_SCHEMA ? vscode.Uri.parse(uri.fragment) : uri + ); // Active document might not be from any folder in the workspace (e.g. user's settings.json) if (folder) { result.configName = folder.name; result.apiTarget = result.configName; } - } else if (schemas.includes(uri.scheme)) { + } else { result.apiTarget = uri; const parts = uri.authority.split(":"); result.configName = parts.length === 2 ? parts[0] : uri.authority; @@ -390,10 +398,14 @@ export function currentWorkspaceFolder(document?: vscode.TextDocument): string { } export function workspaceFolderOfUri(uri: vscode.Uri): string { - if (notIsfs(uri)) { - if (vscode.workspace.getWorkspaceFolder(uri)) { - return vscode.workspace.getWorkspaceFolder(uri).name; - } + if (uri.scheme == OBJECTSCRIPT_FILE_SCHEMA) { + // For objectscript:// files the authority is the workspace folder name + return uri.authority; + } else if (uri.scheme == OBJECTSCRIPTXML_FILE_SCHEMA) { + // For XML preview files the fragment contains the URI of the original XML file + return vscode.workspace.getWorkspaceFolder(vscode.Uri.parse(uri.fragment))?.name ?? ""; + } else if (notIsfs(uri)) { + return vscode.workspace.getWorkspaceFolder(uri)?.name ?? ""; } else { const rootUri = uri.with({ path: "/" }).toString(); const foundFolder = vscode.workspace.workspaceFolders.find(