From eb1d9a35d670d7bd30aa6977ff5ab900c87ffd61 Mon Sep 17 00:00:00 2001 From: Maruf Rasully Date: Fri, 14 Nov 2025 16:47:35 +0100 Subject: [PATCH 1/3] fix: substitute error message popup with log --- packages/language-server/src/constant.ts | 4 ++ packages/language-server/src/server.ts | 31 +++------- packages/language-server/src/utils/index.ts | 20 +++++++ .../test/unit/utils/indext.test.ts | 56 +++++++++++++++++++ .../src/extension.ts | 21 ------- 5 files changed, 87 insertions(+), 45 deletions(-) create mode 100644 packages/language-server/src/utils/index.ts create mode 100644 packages/language-server/test/unit/utils/indext.test.ts diff --git a/packages/language-server/src/constant.ts b/packages/language-server/src/constant.ts index 6a4c18a89..4b74b6745 100644 --- a/packages/language-server/src/constant.ts +++ b/packages/language-server/src/constant.ts @@ -1 +1,5 @@ export const PACKAGE_NAME = "@ui5-language-assistant/language-server"; +export const BUILD_CONTEXT_ERROR_MSG = + "An error has occurred building context. Please open an [issue](https://github.com/SAP/ui5-language-assistant/issues)"; +export const SDK_MSG = + "[SAPUI5 SDK](https://tools.hana.ondemand.com/#sapui5) is not accessible. Connect to the internet or setup local web server for offline work."; diff --git a/packages/language-server/src/server.ts b/packages/language-server/src/server.ts index f287582b3..685156750 100644 --- a/packages/language-server/src/server.ts +++ b/packages/language-server/src/server.ts @@ -53,6 +53,7 @@ import { getLogger, setLogLevel } from "./logger"; import { initI18n } from "./i18n"; import { isXMLView, getCDNBaseUrl } from "@ui5-language-assistant/logic-utils"; import { getDefinition } from "@ui5-language-assistant/xml-views-definition"; +import { handleContextError } from "./utils"; const connection = createConnection(ProposedFeatures.all); const documents = new TextDocuments(TextDocument); @@ -146,10 +147,7 @@ connection.onCompletion( initializationOptions?.modelCachePath ); if (!isContext(context)) { - connection.sendNotification( - "UI5LanguageAssistant/context-error", - context - ); + handleContextError(context); return []; } const version = context.ui5Model.version; @@ -206,10 +204,7 @@ connection.onHover( initializationOptions?.modelCachePath ); if (!isContext(context)) { - connection.sendNotification( - "UI5LanguageAssistant/context-error", - context - ); + handleContextError(context); return; } const version = context.ui5Model.version; @@ -256,10 +251,7 @@ const validateOpenDocuments = async (): Promise => { initializationOptions?.modelCachePath ); if (!isContext(context)) { - connection.sendNotification( - "UI5LanguageAssistant/context-error", - context - ); + handleContextError(context); return; } const diagnostics = getXMLViewDiagnostics({ @@ -287,10 +279,7 @@ const validateIdsOfOpenDocuments = async (): Promise => { initializationOptions?.modelCachePath ); if (!isContext(context)) { - connection.sendNotification( - "UI5LanguageAssistant/context-error", - context - ); + handleContextError(context); return; } const idDiagnostics = getXMLViewIdDiagnostics({ @@ -408,10 +397,7 @@ documents.onDidChangeContent(async (changeEvent): Promise => { document.getText() ); if (!isContext(context)) { - connection.sendNotification( - "UI5LanguageAssistant/context-error", - context - ); + handleContextError(context); return; } @@ -462,10 +448,7 @@ connection.onCodeAction(async (params) => { textDocument.getText() ); if (!isContext(context)) { - connection.sendNotification( - "UI5LanguageAssistant/context-error", - context - ); + handleContextError(context); return; } diff --git a/packages/language-server/src/utils/index.ts b/packages/language-server/src/utils/index.ts new file mode 100644 index 000000000..0dc78a148 --- /dev/null +++ b/packages/language-server/src/utils/index.ts @@ -0,0 +1,20 @@ +import { getLogger } from "../logger"; +import { BUILD_CONTEXT_ERROR_MSG, SDK_MSG } from "../constant"; + +/** + * Handles context-related errors by logging them with appropriate error messages. + * + * This function categorizes errors based on whether they have an error code: + * - Errors with a code property are logged with SDK_MSG + * - Errors without a code property are logged with BUILD_CONTEXT_ERROR_MSG + * + * @param error - The error object to handle. Must be an Error instance with an optional code property + * @param error.code - Optional error code that determines which error message to use + */ +export function handleContextError(error: Error & { code?: string }): void { + if (error.code) { + getLogger().error(SDK_MSG, { error }); + } else { + getLogger().error(BUILD_CONTEXT_ERROR_MSG, { error }); + } +} diff --git a/packages/language-server/test/unit/utils/indext.test.ts b/packages/language-server/test/unit/utils/indext.test.ts new file mode 100644 index 000000000..e850e05a4 --- /dev/null +++ b/packages/language-server/test/unit/utils/indext.test.ts @@ -0,0 +1,56 @@ +import { handleContextError } from "../../../src/utils"; +import { getLogger } from "../../../src/logger"; +import { BUILD_CONTEXT_ERROR_MSG, SDK_MSG } from "../../../src/constant"; + +// Mock the logger module +jest.mock("../../../src/logger"); + +describe("handleContextError", () => { + let mockLogger: jest.Mocked<{ + error: jest.Mock; + }>; + + beforeEach(() => { + // Clear all mocks before each test + jest.clearAllMocks(); + + // Create a mock logger with an error method + mockLogger = { + error: jest.fn(), + }; + + // Make getLogger return our mock logger + (getLogger as jest.Mock).mockReturnValue(mockLogger); + }); + + it("should log error with SDK_MSG", () => { + // Arrange + const errorWithCode = Object.assign(new Error("Connection failed"), { + code: "ECONNREFUSED", + }); + + // Act + handleContextError(errorWithCode); + + // Assert + expect(getLogger).toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledTimes(1); + expect(mockLogger.error).toHaveBeenCalledWith(SDK_MSG, { + error: errorWithCode, + }); + }); + it("should log error with BUILD_CONTEXT_ERROR_MSG", () => { + // Arrange + const errorWithoutCode = new Error("Build failed"); + + // Act + handleContextError(errorWithoutCode); + + // Assert + expect(getLogger).toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledTimes(1); + expect(mockLogger.error).toHaveBeenCalledWith(BUILD_CONTEXT_ERROR_MSG, { + error: errorWithoutCode, + }); + }); +}); diff --git a/packages/vscode-ui5-language-assistant/src/extension.ts b/packages/vscode-ui5-language-assistant/src/extension.ts index c2200752e..bf49a4d22 100644 --- a/packages/vscode-ui5-language-assistant/src/extension.ts +++ b/packages/vscode-ui5-language-assistant/src/extension.ts @@ -67,10 +67,6 @@ function init(context: ExtensionContext): void { "UI5LanguageAssistant/ui5Model", async (model: UI5Model): Promise => await updateCurrentModel(model) ); - client.onNotification( - "UI5LanguageAssistant/context-error", - (error: Error) => handleContextError(error) - ); }); } @@ -226,23 +222,6 @@ async function updateCurrentModel(model: UI5Model | undefined): Promise { } } -let showedOnce = false; -function handleContextError(error: Error & { code?: string }) { - if (showedOnce) { - return; - } - showedOnce = true; - if (error.code) { - window.showErrorMessage( - "[SAPUI5 SDK](https://tools.hana.ondemand.com/#sapui5) is not accessible. Connect to the internet or setup local web server for offline work." - ); - } else { - window.showErrorMessage( - "An error has occurred building context. Please open an [issue](https://github.com/SAP/ui5-language-assistant/issues)" - ); - } -} - export async function deactivate(): Promise> { if (!client) { return undefined; From 7e9dda714ca446a95ee5d3a3e4b716dbf26c4169 Mon Sep 17 00:00:00 2001 From: Maruf Rasully Date: Fri, 14 Nov 2025 17:04:36 +0100 Subject: [PATCH 2/3] fix: add change set --- .changeset/five-emus-love.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/five-emus-love.md diff --git a/.changeset/five-emus-love.md b/.changeset/five-emus-love.md new file mode 100644 index 000000000..1717ee40c --- /dev/null +++ b/.changeset/five-emus-love.md @@ -0,0 +1,7 @@ +--- +"@ui5-language-assistant/vscode-ui5-language-assistant-bas-ext": patch +"vscode-ui5-language-assistant": patch +"@ui5-language-assistant/language-server": patch +--- + +fix: Substitute error message popup with log From cb066bddf396073cf2cf933d1ae02ad6bb6af416 Mon Sep 17 00:00:00 2001 From: Maruf Rasully Date: Mon, 17 Nov 2025 08:47:28 +0100 Subject: [PATCH 3/3] fix: correct file name --- .../test/unit/utils/{indext.test.ts => index.test.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/language-server/test/unit/utils/{indext.test.ts => index.test.ts} (100%) diff --git a/packages/language-server/test/unit/utils/indext.test.ts b/packages/language-server/test/unit/utils/index.test.ts similarity index 100% rename from packages/language-server/test/unit/utils/indext.test.ts rename to packages/language-server/test/unit/utils/index.test.ts