From 11b0f0dfd77694ecd270cd76fb75dac5b59fbfb7 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 31 Mar 2026 09:51:55 +0200 Subject: [PATCH 01/43] Use slightly longer delays after changing machine in #1034. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e10620c84..b247fca68 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -113,7 +113,7 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: 8 + DELAY_FACTOR: 10 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | From 920448c99cbbd384e001b93ab047747d88925b87 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 31 Mar 2026 11:47:54 +0200 Subject: [PATCH 02/43] Wait longer for call hierarchies. --- .github/workflows/build.yaml | 2 +- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b247fca68..e10620c84 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -113,7 +113,7 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: 10 + DELAY_FACTOR: 8 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 83c66c498..6170e7d4c 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -296,7 +296,7 @@ end const outgoing = await ignoreFails(new SideBarView().getContent().getSection("Callers Of")); const items = await ignoreFails(outgoing!.getVisibleItems()); return items?.length === 2; - }, Delays.normal, "Call hierarchy should show `multiply` and its recursive call."); + }, Delays.slow, "Call hierarchy should show `multiply` and its recursive call."); await editor.selectText("multiply"); await bench.executeCommand("view.showOutgoingCalls"); @@ -304,7 +304,7 @@ end const incoming = await ignoreFails(new SideBarView().getContent().getSection("Calls From")); const items = await ignoreFails(incoming!.getVisibleItems()); return items?.length === 3; - }, Delays.normal, "Call hierarchy should show `multiply` and its two outgoing calls."); + }, Delays.slow, "Call hierarchy should show `multiply` and its two outgoing calls."); }); it("completion works", async function() { From e7821b7d68294815c317b4e0b2c77be69eb852a2 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 31 Mar 2026 11:48:20 +0200 Subject: [PATCH 03/43] Await rename trigger. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 3 +-- rascal-vscode-extension/src/test/vscode-suite/ide.test.ts | 3 +-- rascal-vscode-extension/src/test/vscode-suite/utils.ts | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 6170e7d4c..3db5e6757 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -248,8 +248,7 @@ end const editor = await ide.openModule(TestWorkspace.picoFile); await editor.moveCursor(5, 6); - ide.renameSymbol(editor, bench, "z"); - + await ide.renameSymbol(editor, bench, "z"); await driver.wait(() => (editor.isDirty()), Delays.extremelySlow, "Rename should have resulted in changes in the editor"); const editorText = await editor.getText(); diff --git a/rascal-vscode-extension/src/test/vscode-suite/ide.test.ts b/rascal-vscode-extension/src/test/vscode-suite/ide.test.ts index 0e147389a..cfdb28154 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/ide.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/ide.test.ts @@ -196,8 +196,7 @@ describe('IDE', function () { const checkRascalStatus = ide.statusContains("Loading Rascal"); await driver.wait(async () => !(await checkRascalStatus()), Delays.extremelySlow, "Rascal evaluators have not finished loading"); - ide.renameSymbol(editor, bench, "i"); - + await ide.renameSymbol(editor, bench, "i"); await driver.wait(() => (editor.isDirty()), Delays.extremelySlow, "Rename should have resulted in changes in the editor"); const editorText = await editor.getText(); diff --git a/rascal-vscode-extension/src/test/vscode-suite/utils.ts b/rascal-vscode-extension/src/test/vscode-suite/utils.ts index a46aa8c4d..b14df7e3d 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/utils.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/utils.ts @@ -379,6 +379,7 @@ export class IDEOperations { } catch (e) { console.log("Rename failed to succeed, lets try again"); + console.error(e); await this.screenshot(`DSL-failed-rename-round-${tries}`); tries++; } From c731214846878935d93a663526225677656e8460 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 31 Mar 2026 13:17:12 +0200 Subject: [PATCH 04/43] Slightly longer timeouts again. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e10620c84..b247fca68 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -113,7 +113,7 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: 8 + DELAY_FACTOR: 10 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | From a3e5b407c76b4d7daf1cc353ed00c0cff21731d6 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 1 Apr 2026 17:02:05 +0200 Subject: [PATCH 05/43] Try even longer delay factor. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b247fca68..cb2ca5efc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -113,7 +113,7 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: 10 + DELAY_FACTOR: 15 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | From ce4e7b19b8aabab4334c09932ddd453f123da4c8 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Thu, 2 Apr 2026 14:10:05 +0200 Subject: [PATCH 06/43] Try 22.04 with original delays. --- .github/workflows/build.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index cb2ca5efc..4466f794f 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,7 +49,7 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4, windows-latest, macos-latest] + os: [ubicloud-standard-4-ubuntu-2204, windows-latest, macos-latest] fail-fast: true env: CODE_VERSION: "1.90.2" @@ -113,12 +113,10 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: 15 + DELAY_FACTOR: 8 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start - run: | - sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 # workaround for issue with Ubuntu 24.04 https://github.com/redhat-developer/vscode-extension-tester/blob/main/KNOWN_ISSUES.md#openresources-not-working-with-apparmor-2404 - xvfb-run --auto-servernum --server-args='-screen 0 1920x1080x24' npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests + run: xvfb-run --auto-servernum --server-args='-screen 0 1920x1080x24' npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests - name: Upload Screenshots uses: actions/upload-artifact@v7 From 0ec6418537dafcba48964b23e65fe86435fff1fb Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Thu, 2 Apr 2026 16:39:12 +0200 Subject: [PATCH 07/43] Revert test-specific delays. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 3db5e6757..ee09b3783 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -295,7 +295,7 @@ end const outgoing = await ignoreFails(new SideBarView().getContent().getSection("Callers Of")); const items = await ignoreFails(outgoing!.getVisibleItems()); return items?.length === 2; - }, Delays.slow, "Call hierarchy should show `multiply` and its recursive call."); + }, Delays.normal, "Call hierarchy should show `multiply` and its recursive call."); await editor.selectText("multiply"); await bench.executeCommand("view.showOutgoingCalls"); @@ -303,7 +303,7 @@ end const incoming = await ignoreFails(new SideBarView().getContent().getSection("Calls From")); const items = await ignoreFails(incoming!.getVisibleItems()); return items?.length === 3; - }, Delays.slow, "Call hierarchy should show `multiply` and its two outgoing calls."); + }, Delays.normal, "Call hierarchy should show `multiply` and its two outgoing calls."); }); it("completion works", async function() { From e047fce30a197640ede6e14e0c53c4a2bba9ec51 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 12:28:01 +0200 Subject: [PATCH 08/43] Revert "Try 22.04 with original delays." This reverts commit ce4e7b19b8aabab4334c09932ddd453f123da4c8. --- .github/workflows/build.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 4466f794f..cb2ca5efc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,7 +49,7 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4-ubuntu-2204, windows-latest, macos-latest] + os: [ubicloud-standard-4, windows-latest, macos-latest] fail-fast: true env: CODE_VERSION: "1.90.2" @@ -113,10 +113,12 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: 8 + DELAY_FACTOR: 15 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start - run: xvfb-run --auto-servernum --server-args='-screen 0 1920x1080x24' npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests + run: | + sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 # workaround for issue with Ubuntu 24.04 https://github.com/redhat-developer/vscode-extension-tester/blob/main/KNOWN_ISSUES.md#openresources-not-working-with-apparmor-2404 + xvfb-run --auto-servernum --server-args='-screen 0 1920x1080x24' npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests - name: Upload Screenshots uses: actions/upload-artifact@v7 From 3a627bd686643aa7b59dcab0871cf6d3337f2cd8 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 12:30:40 +0200 Subject: [PATCH 09/43] Try several Ubuntu machines and delays. --- .github/workflows/build.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index cb2ca5efc..6d7b629ab 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,8 +49,10 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4, windows-latest, macos-latest] - fail-fast: true + os: [ubicloud-standard-4, ubicloud-standard-4-2204, ubuntu-latest] + run: [1, 2, 3, 4] + delay_factor: [8, 16, 32, 64] + fail-fast: false env: CODE_VERSION: "1.90.2" runs-on: ${{ matrix.os }} @@ -113,7 +115,7 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: 15 + DELAY_FACTOR: matrix.delay_factor RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | From 187cae43c48f31e4952115f4c6717085c6f86b10 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 12:32:45 +0200 Subject: [PATCH 10/43] Check rename state with screenshots. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index ee09b3783..11948c2fb 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -249,7 +249,10 @@ end await editor.moveCursor(5, 6); await ide.renameSymbol(editor, bench, "z"); - await driver.wait(() => (editor.isDirty()), Delays.extremelySlow, "Rename should have resulted in changes in the editor"); + await driver.wait(async () => { + await ide.screenshot("rename-dirty-check"); + return editor.isDirty(); + }, Delays.extremelySlow, "Rename should have resulted in changes in the editor"); const editorText = await editor.getText(); expect(editorText).to.contain("z : natural"); From e84e27f97d458e8d528975c9807493a339f90bcc Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 14:22:41 +0200 Subject: [PATCH 11/43] Fix runner name, less runs. --- .github/workflows/build.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6d7b629ab..6dddc448d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,8 +49,7 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4, ubicloud-standard-4-2204, ubuntu-latest] - run: [1, 2, 3, 4] + os: [ubicloud-standard-4, ubicloud-standard-4-ubuntu-2204, ubuntu-latest] delay_factor: [8, 16, 32, 64] fail-fast: false env: From 39920fc2a2994d13f7dc12e4de80173127ab1e18 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 14:23:33 +0200 Subject: [PATCH 12/43] Be explicit about GH runner versions. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6dddc448d..f23e6634a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,7 +49,7 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4, ubicloud-standard-4-ubuntu-2204, ubuntu-latest] + os: [ubicloud-standard-4, ubicloud-standard-4-ubuntu-2204, ubuntu-22.04, ubuntu-24.04] delay_factor: [8, 16, 32, 64] fail-fast: false env: From 4ac694948de9557ee02bbd01d3582277e006c9f0 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 15:07:46 +0200 Subject: [PATCH 13/43] Revert extester to 8.22.1 --- rascal-vscode-extension/package-lock.json | 14 +++++++------- rascal-vscode-extension/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/rascal-vscode-extension/package-lock.json b/rascal-vscode-extension/package-lock.json index 5c081362d..75b8ad15a 100644 --- a/rascal-vscode-extension/package-lock.json +++ b/rascal-vscode-extension/package-lock.json @@ -33,7 +33,7 @@ "license-check-and-add": "4.x", "mocha": "11.x", "typescript": "5.x", - "vscode-extension-tester": "8.x" + "vscode-extension-tester": "8.22.1" }, "engines": { "node": ">=20.9.0", @@ -8799,21 +8799,21 @@ } }, "node_modules/vscode-extension-tester": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.23.0.tgz", - "integrity": "sha512-YElhRDkOjvmGFv44aCMnEnUM5RmFqWByQ8TBr7/6N9K/b5o1gu2fo9EgTef6VmrB4kyFnSrkPVAbiZBfKQA1mQ==", + "version": "8.22.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.22.1.tgz", + "integrity": "sha512-euqibuaeGaQofejTKZqfHNkGSz+dmcuS687PROWjj01k48xm0XVbqc6WKpIzSRob3vYx3npy+8pFZ1dVRaW7Hw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@redhat-developer/locators": "^1.20.0", - "@redhat-developer/page-objects": "^1.20.0", + "@redhat-developer/locators": "^1.19.1", + "@redhat-developer/page-objects": "^1.19.1", "@types/selenium-webdriver": "^4.35.5", "@vscode/vsce": "^3.7.1", "c8": "^11.0.0", "commander": "^14.0.3", "compare-versions": "^6.1.1", "find-up": "8.0.0", - "fs-extra": "^11.3.4", + "fs-extra": "^11.3.3", "glob": "^13.0.6", "got": "^14.6.6", "hpagent": "^1.2.0", diff --git a/rascal-vscode-extension/package.json b/rascal-vscode-extension/package.json index e20276f32..ccf386a6e 100644 --- a/rascal-vscode-extension/package.json +++ b/rascal-vscode-extension/package.json @@ -329,6 +329,6 @@ "license-check-and-add": "4.x", "mocha": "11.x", "typescript": "5.x", - "vscode-extension-tester": "8.x" + "vscode-extension-tester": "8.22.1" } } From 99b1ec78110380f57ef016338ddad4110cc04fa7 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 15:32:10 +0200 Subject: [PATCH 14/43] Debug test initialization. --- .../src/test/vscode-suite/dsl.test.ts | 9 ++++++++- rascal-vscode-extension/src/test/vscode-suite/utils.ts | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 11948c2fb..dfed50eeb 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -76,15 +76,22 @@ parameterizedDescribe(function (errorRecovery: boolean) { } before(async () => { + console.log("Initializing browser"); browser = VSBrowser.instance; + console.log("Initializing driver"); driver = browser.driver; + console.log("Initializing workbench"); bench = new Workbench(); + console.log("Waiting for worbench"); await ignoreFails(browser.waitForWorkbench()); + console.log("Initializing IDE operations"); ide = new IDEOperations(browser); + console.log("Loading IDE"); await ide.load(); + console.log("Loading Pico"); await loadPico(); + console.log("Reading backup file"); picoFileBackup = await fs.readFile(TestWorkspace.picoFile); - ide = new IDEOperations(browser); await ide.load(); }); diff --git a/rascal-vscode-extension/src/test/vscode-suite/utils.ts b/rascal-vscode-extension/src/test/vscode-suite/utils.ts index b14df7e3d..78db13f47 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/utils.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/utils.ts @@ -211,6 +211,7 @@ export class IDEOperations { } async load() { + console.log("Loading IDE..."); await ignoreFails(this.browser.waitForWorkbench(Delays.slow)); for (let t = 0; t < 5; t++) { try { @@ -218,16 +219,23 @@ export class IDEOperations { if (isWorkSpaceOpen !== undefined && isWorkSpaceOpen.length > 0) { break; } + console.log(`Opening workspace ${TestWorkspace.workspaceFile}`); await this.browser.openResources(TestWorkspace.workspaceFile); } catch (ex) { - console.debug("Error opening workspace, retrying.", ex); + console.error("Error opening workspace, retrying.", ex); } } + console.log("Waiting for workbench"); await ignoreFails(this.browser.waitForWorkbench(Delays.normal)); + console.log("Waiting for workbench again"); await ignoreFails(this.browser.waitForWorkbench(Delays.normal)); + console.log("Opening notifications center"); const center = await ignoreFails(new Workbench().openNotificationsCenter()); + console.log("Clearing all notifications"); await ignoreFails(center?.clearAllNotifications()); + console.log("Closing notifications center"); await ignoreFails(center?.close()); + console.log("Assuring debug level logging is enabled"); await assureDebugLevelLoggingIsEnabled(); } From 7d4dcc12c5bfed203dac92c85799923d429d8cf2 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 15:45:30 +0200 Subject: [PATCH 15/43] More logging. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 4 ++++ rascal-vscode-extension/src/test/vscode-suite/utils.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index dfed50eeb..2409d94c6 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -96,17 +96,21 @@ parameterizedDescribe(function (errorRecovery: boolean) { }); beforeEach(async function () { + console.log(`[begin] beforeEach(${this.test?.title})`); if (this.test?.title) { await ide.screenshot(`DSL-${errorRecovery}-` + this.test?.title); } + console.log(`[end] beforeEach(${this.test?.title})`); }); afterEach(async function () { + console.log(`[begin] afterEach(${this.test?.title})`); if (this.test?.title) { await ide.screenshot(`DSL-${errorRecovery}-`+ this.test?.title); } await ide.cleanup(); await fs.writeFile(TestWorkspace.picoFile, picoFileBackup); + console.log(`[end] afterEach(${this.test?.title})`); }); it("has highlighting and parse errors", async function () { diff --git a/rascal-vscode-extension/src/test/vscode-suite/utils.ts b/rascal-vscode-extension/src/test/vscode-suite/utils.ts index 78db13f47..6423833ce 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/utils.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/utils.ts @@ -457,6 +457,7 @@ export class IDEOperations { private screenshotSeqNumber = 0; screenshot(name: string): Promise { + console.log(`Taking screenshot ${name}`); return this.browser.takeScreenshot( `${String(this.screenshotSeqNumber++).padStart(4, '0')}-` + // Make sorting screenshots chronologically in VS Code easier name.replace(/[/\\?%*:|"<>]/g, '-')); From baf5f03be51423945e8bac2d77359c6f26dadaa1 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 15:45:41 +0200 Subject: [PATCH 16/43] Run single machine for now. --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f23e6634a..a9932e750 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,8 +49,8 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4, ubicloud-standard-4-ubuntu-2204, ubuntu-22.04, ubuntu-24.04] - delay_factor: [8, 16, 32, 64] + os: [ubicloud-standard-4] #, ubicloud-standard-4-ubuntu-2204, ubuntu-22.04, ubuntu-24.04] + delay_factor: [8] #, 16, 32, 64] fail-fast: false env: CODE_VERSION: "1.90.2" From fb30dbd241edd3a55e0a32b9a6c9a0312fb942d1 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 16:42:32 +0200 Subject: [PATCH 17/43] Log within first test. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 2409d94c6..75da61904 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -114,13 +114,18 @@ parameterizedDescribe(function (errorRecovery: boolean) { }); it("has highlighting and parse errors", async function () { + console.log("Closing all editors"); await ignoreFails(new Workbench().getEditorView().closeAllEditors()); + console.log(`Opening Pico file ${TestWorkspace.picoFile}`); const editor = await ide.openModule(TestWorkspace.picoFile); const isPicoLoading = ide.statusContains("Pico"); // we might miss this event, but we wait for it to show up + console.log("Awaiting Pico parser generator start"); await ignoreFails(driver.wait(isPicoLoading, Delays.normal, "Pico parser generator should have started")); // now wait for the Pico parser generator to disappear + console.log("Awaiting Pico parser generator finish"); await driver.wait(async () => !(await isPicoLoading()), Delays.verySlow, "Pico parser generator should have finished", 100); + console.log("hHas syntax highilighting?"); await ide.hasSyntaxHighlighting(editor, Delays.slow); console.log("We got syntax highlighting"); try { From c74642d07f53f3bddfcef0fd703c6998d46f1a57 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 8 Apr 2026 16:51:15 +0200 Subject: [PATCH 18/43] Screenshot and loading check changes. --- .../src/test/vscode-suite/dsl.test.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 75da61904..793802ad0 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -120,11 +120,17 @@ parameterizedDescribe(function (errorRecovery: boolean) { const editor = await ide.openModule(TestWorkspace.picoFile); const isPicoLoading = ide.statusContains("Pico"); // we might miss this event, but we wait for it to show up - console.log("Awaiting Pico parser generator start"); - await ignoreFails(driver.wait(isPicoLoading, Delays.normal, "Pico parser generator should have started")); + await ignoreFails(driver.wait(async () => { + console.log("Awaiting Pico parser generator start"); + await ide.screenshot("is-pico-loading"); + return await isPicoLoading(); + }, Delays.normal, "Pico parser generator should have started")); // now wait for the Pico parser generator to disappear - console.log("Awaiting Pico parser generator finish"); - await driver.wait(async () => !(await isPicoLoading()), Delays.verySlow, "Pico parser generator should have finished", 100); + await driver.wait(async () => { + console.log("Awaiting Pico parser generator finish"); + await ide.screenshot("is-pico-loading-finished"); + return !(await isPicoLoading()); + }, Delays.verySlow, "Pico parser generator should have finished", 100); console.log("hHas syntax highilighting?"); await ide.hasSyntaxHighlighting(editor, Delays.slow); console.log("We got syntax highlighting"); From cecc26c79f7484787140a01121e4bad4c2f1365b Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Thu, 9 Apr 2026 08:58:56 +0200 Subject: [PATCH 19/43] Also upload screenshots on cancellation. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a9932e750..0dd114054 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -123,7 +123,7 @@ jobs: - name: Upload Screenshots uses: actions/upload-artifact@v7 - if: failure() + if: failure() || cancelled() with: name: screenshots-${{ matrix.os }} path: ./rascal-vscode-extension/uitests/screenshots/**/*.png From ed4311c59ffd22e4a86dd691792097f30f4d2876 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Thu, 9 Apr 2026 09:04:34 +0200 Subject: [PATCH 20/43] Additional screenshot. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 793802ad0..167050856 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -118,6 +118,7 @@ parameterizedDescribe(function (errorRecovery: boolean) { await ignoreFails(new Workbench().getEditorView().closeAllEditors()); console.log(`Opening Pico file ${TestWorkspace.picoFile}`); const editor = await ide.openModule(TestWorkspace.picoFile); + await ide.screenshot("after-opening-pico-file"); const isPicoLoading = ide.statusContains("Pico"); // we might miss this event, but we wait for it to show up await ignoreFails(driver.wait(async () => { From 2c789a594f8cc533a19e93540d2faf8863e37228 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Thu, 9 Apr 2026 10:28:28 +0200 Subject: [PATCH 21/43] Revert loading check, more screenshots. --- .github/workflows/build.yaml | 2 +- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0dd114054..1eddb6a7e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -114,7 +114,7 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: matrix.delay_factor + DELAY_FACTOR: 8 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 167050856..2804ee31d 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -92,7 +92,7 @@ parameterizedDescribe(function (errorRecovery: boolean) { await loadPico(); console.log("Reading backup file"); picoFileBackup = await fs.readFile(TestWorkspace.picoFile); - await ide.load(); + await ide.screenshot("after [before] init"); }); beforeEach(async function () { @@ -121,11 +121,7 @@ parameterizedDescribe(function (errorRecovery: boolean) { await ide.screenshot("after-opening-pico-file"); const isPicoLoading = ide.statusContains("Pico"); // we might miss this event, but we wait for it to show up - await ignoreFails(driver.wait(async () => { - console.log("Awaiting Pico parser generator start"); - await ide.screenshot("is-pico-loading"); - return await isPicoLoading(); - }, Delays.normal, "Pico parser generator should have started")); + await ignoreFails(driver.wait(isPicoLoading, Delays.normal, "Pico parser generator should have started")); // now wait for the Pico parser generator to disappear await driver.wait(async () => { console.log("Awaiting Pico parser generator finish"); From 533252b343054698e5c7b924d2ff4a6d45178ec3 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Thu, 9 Apr 2026 10:45:32 +0200 Subject: [PATCH 22/43] Extend matrix again. --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1eddb6a7e..8d1a1ae4a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,8 +49,8 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4] #, ubicloud-standard-4-ubuntu-2204, ubuntu-22.04, ubuntu-24.04] - delay_factor: [8] #, 16, 32, 64] + os: [ubicloud-standard-4, ubicloud-standard-4-ubuntu-2204, ubuntu-22.04, ubuntu-24.04] + run: [1, 2, 3, 4] fail-fast: false env: CODE_VERSION: "1.90.2" From 49c55f2cc5f38504be7db2fb39c6c65f21c74571 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Fri, 10 Apr 2026 09:20:21 +0200 Subject: [PATCH 23/43] Narrow down failing rename test. --- .github/workflows/build.yaml | 10 +++++----- rascal-vscode-extension/src/test/vscode-suite/utils.ts | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8d1a1ae4a..d188db9e8 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,8 +49,8 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4, ubicloud-standard-4-ubuntu-2204, ubuntu-22.04, ubuntu-24.04] - run: [1, 2, 3, 4] + os: [ubicloud-standard-4, ubicloud-standard-4-ubuntu-2204] + run: [1, 2, 3, 4, 5, 6, 7, 8] fail-fast: false env: CODE_VERSION: "1.90.2" @@ -97,7 +97,7 @@ jobs: DELAY_FACTOR: 10 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' - run: npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests + run: npx extest setup-and-run out/test/vscode-suite/dsl.test.js --storage uitests - name: "UI test (mac)" shell: bash @@ -107,7 +107,7 @@ jobs: DELAY_FACTOR: 15 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' - run: npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests + run: npx extest setup-and-run out/test/vscode-suite/dsl.test.js --storage uitests - name: "UI test (ubuntu)" shell: bash @@ -119,7 +119,7 @@ jobs: _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 # workaround for issue with Ubuntu 24.04 https://github.com/redhat-developer/vscode-extension-tester/blob/main/KNOWN_ISSUES.md#openresources-not-working-with-apparmor-2404 - xvfb-run --auto-servernum --server-args='-screen 0 1920x1080x24' npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests + xvfb-run --auto-servernum --server-args='-screen 0 1920x1080x24' npx extest setup-and-run out/test/vscode-suite/dsl.test.js --storage uitests - name: Upload Screenshots uses: actions/upload-artifact@v7 diff --git a/rascal-vscode-extension/src/test/vscode-suite/utils.ts b/rascal-vscode-extension/src/test/vscode-suite/utils.ts index 6423833ce..6880a49ed 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/utils.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/utils.ts @@ -384,6 +384,7 @@ export class IDEOperations { const renameBox = await this.hasElement(editor, By.className("rename-input"), Delays.normal, "Rename box should appear"); await renameBox.sendKeys(Key.BACK_SPACE, Key.BACK_SPACE, Key.BACK_SPACE, newName, Key.ENTER); renameSuccess = true; + console.log("Entering rename name succeeded"); } catch (e) { console.log("Rename failed to succeed, lets try again"); From c1e3a8edb5701b60011bf41010bf11f5b75218c5 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Fri, 10 Apr 2026 09:47:53 +0200 Subject: [PATCH 24/43] Try to fix stale code lens element. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 2804ee31d..de2eba94d 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -241,8 +241,10 @@ end it("code lens works", async function() { if (errorRecovery) { this.skip(); } const editor = await ide.openModule(TestWorkspace.picoFile); - const lens = await driver.wait(() => editor.getCodeLens("Rename variables a to b."), Delays.verySlow, "Rename lens should be available"); - await lens!.click(); + await driver.wait(async () => { + const lens = await editor.getCodeLens("Rename variables a to b."); + await ignoreFails(lens!.click()); + }, Delays.verySlow, "Rename lens should be available"); await ide.assertLineBecomes(editor, 9, "b := 2;", "a variable should be changed to b"); }); From 277765985e64b0d260cdd10bcb42f7e4ceeaf31e Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Fri, 10 Apr 2026 09:49:12 +0200 Subject: [PATCH 25/43] Unique artifact name. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d188db9e8..a0e3d516a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -125,7 +125,7 @@ jobs: uses: actions/upload-artifact@v7 if: failure() || cancelled() with: - name: screenshots-${{ matrix.os }} + name: screenshots-${{ matrix.os }}-${{matrix.run}} path: ./rascal-vscode-extension/uitests/screenshots/**/*.png retention-days: 5 if-no-files-found: error From 926c45f7ca4ca08e9bec19fbc1e486b14b9e0f5f Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Fri, 10 Apr 2026 10:31:59 +0200 Subject: [PATCH 26/43] Try to fix code lens test again. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index de2eba94d..9c73c4af7 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -243,7 +243,12 @@ end const editor = await ide.openModule(TestWorkspace.picoFile); await driver.wait(async () => { const lens = await editor.getCodeLens("Rename variables a to b."); - await ignoreFails(lens!.click()); + try { + await lens!.click(); + return true; + } catch (e) { + return false; + } }, Delays.verySlow, "Rename lens should be available"); await ide.assertLineBecomes(editor, 9, "b := 2;", "a variable should be changed to b"); }); From 6c16fa1931b255b96838e102e7c0ddd78358a6c9 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Fri, 10 Apr 2026 11:43:54 +0200 Subject: [PATCH 27/43] Inspect call hierarchy test. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 9c73c4af7..e2eb7d5f4 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -323,6 +323,7 @@ end await driver.wait(async () => { const outgoing = await ignoreFails(new SideBarView().getContent().getSection("Callers Of")); const items = await ignoreFails(outgoing!.getVisibleItems()); + await ide.screenshot("call-hierarchy-incoming"); return items?.length === 2; }, Delays.normal, "Call hierarchy should show `multiply` and its recursive call."); @@ -331,6 +332,7 @@ end await driver.wait(async () => { const incoming = await ignoreFails(new SideBarView().getContent().getSection("Calls From")); const items = await ignoreFails(incoming!.getVisibleItems()); + await ide.screenshot("call-hierarchy-outgoing"); return items?.length === 3; }, Delays.normal, "Call hierarchy should show `multiply` and its two outgoing calls."); }); From cd5e7050a7a348e7df5ed9b2a2e917b253e01261 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Fri, 10 Apr 2026 11:44:04 +0200 Subject: [PATCH 28/43] Run 24.04 only. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a0e3d516a..f54283109 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,7 +49,7 @@ jobs: ui-test: strategy: matrix: - os: [ubicloud-standard-4, ubicloud-standard-4-ubuntu-2204] + os: [ubicloud-standard-4] run: [1, 2, 3, 4, 5, 6, 7, 8] fail-fast: false env: From 93845b1005749fe9f6a13792b84c08cb9f6b01b2 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Fri, 10 Apr 2026 11:53:47 +0200 Subject: [PATCH 29/43] Run all tests again. --- .github/workflows/build.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f54283109..c418daa24 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -97,7 +97,7 @@ jobs: DELAY_FACTOR: 10 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' - run: npx extest setup-and-run out/test/vscode-suite/dsl.test.js --storage uitests + run: npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests - name: "UI test (mac)" shell: bash @@ -107,7 +107,7 @@ jobs: DELAY_FACTOR: 15 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' - run: npx extest setup-and-run out/test/vscode-suite/dsl.test.js --storage uitests + run: npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests - name: "UI test (ubuntu)" shell: bash @@ -119,7 +119,7 @@ jobs: _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 # workaround for issue with Ubuntu 24.04 https://github.com/redhat-developer/vscode-extension-tester/blob/main/KNOWN_ISSUES.md#openresources-not-working-with-apparmor-2404 - xvfb-run --auto-servernum --server-args='-screen 0 1920x1080x24' npx extest setup-and-run out/test/vscode-suite/dsl.test.js --storage uitests + xvfb-run --auto-servernum --server-args='-screen 0 1920x1080x24' npx extest setup-and-run out/test/vscode-suite/*.test.js --storage uitests - name: Upload Screenshots uses: actions/upload-artifact@v7 From ab1a6b09233878d250d587bb934eb5656aad1c3a Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Mon, 13 Apr 2026 10:03:09 +0200 Subject: [PATCH 30/43] Longer delay factor again. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c418daa24..31633c899 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -114,7 +114,7 @@ jobs: if: contains(matrix.os, 'ubuntu') || startsWith(matrix.os, 'ubicloud-standard') working-directory: ./rascal-vscode-extension env: - DELAY_FACTOR: 8 + DELAY_FACTOR: 15 RASCAL_LSP_DEV_DEPLOY: true _JAVA_OPTIONS: '-Xmx5G' # we have 16gb of memory, make sure LSP, REPL & DSL-LSP can start run: | From 6bdfa978998ea4b1334671717cb6859ecce4149d Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Mon, 13 Apr 2026 11:24:50 +0200 Subject: [PATCH 31/43] Debug missing parse tree/contributions. --- .../lsp/parametric/ParametricTextDocumentService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java index c024c43ee..b534891fb 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java @@ -421,7 +421,7 @@ private void handleParsingErrors(TextDocumentState file, CompletableFuture diagnostic.instantiate(columns)) .collect(Collectors.toList()); - logger.trace("Finished parsing tree, reporting new parse errors: {} for: {}", parseErrors, file.getLocation()); + logger.info("Finished parsing tree, reporting new parse errors: {} for: {}", parseErrors, file.getLocation()); facts(file.getLocation()).reportParseErrors(file.getLocation(), diagnostics.version(), parseErrors); }); } @@ -694,7 +694,10 @@ private ILanguageContributions contributions(ISourceLocation doc) { .map(contributions::get) .map(ILanguageContributions.class::cast) .flatMap(Optional::ofNullable) - .orElseGet(() -> new NoContributions(extension(doc), exec)); + .orElseGet(() -> { + logger.error("No contributions for {}", doc); + return new NoContributions(extension(doc), exec); + }); } private static String extension(ISourceLocation doc) { @@ -1042,7 +1045,7 @@ public Set fileExtensions() { private void updateFileState(LanguageParameter lang, ISourceLocation f) { f = f.top(); - logger.trace("File of language {} - updating state: {}", lang.getName(), f); + logger.info("File of language {} - updating state: {}", lang.getName(), f); // Since we cannot know what happened to this file before we were called, we need to be careful about races. // It might have been closed in the meantime, so we compute the new value if the key still exists, based on the current value. var state = files.computeIfPresent(f, (loc, currentState) -> currentState.changeParser(contributions(loc)::parsing)); From ed5d656af636b93b977820b06041f1923852bf1b Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 14 Apr 2026 13:37:34 +0200 Subject: [PATCH 32/43] Unwrap NoContributionException. --- .../main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java | 2 +- .../org/rascalmpl/vscode/lsp/parametric/NoContributions.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java index 89f889fe5..11b6611f0 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java @@ -132,7 +132,7 @@ public CompletableFuture> getCurrentTreeAsync(boolean allowReco } /** - * Wait for current tree to parse. Then return the last tree that matches the allowRecoveredErrors conditation. + * Wait for current tree to parse. Then return the last tree that matches the allowRecoveredErrors condition. * @param allowRecoveredErrors if false, the result will not contain a tree with recovered errors. * @return the last parse tree, or an exception if non existed. */ diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/NoContributions.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/NoContributions.java index b30c31360..d8b999f2a 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/NoContributions.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/NoContributions.java @@ -87,7 +87,7 @@ public String getName() { @Override public CompletableFuture parsing(ISourceLocation loc, String input) { - return CompletableFuture.failedFuture(new NoContributionException("parsing")); + throw new NoContributionException("parsing"); } @Override From 6729b09220ab84f5343ab714f417ac05cdf2e34f Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 14 Apr 2026 13:54:02 +0200 Subject: [PATCH 33/43] Include problems in screenshot. --- rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index e2eb7d5f4..f55761fd2 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -106,6 +106,8 @@ parameterizedDescribe(function (errorRecovery: boolean) { afterEach(async function () { console.log(`[begin] afterEach(${this.test?.title})`); if (this.test?.title) { + const bb = await new Workbench().getBottomBar(); + await bb.openProblemsView(); await ide.screenshot(`DSL-${errorRecovery}-`+ this.test?.title); } await ide.cleanup(); From 67c3d6ff6abc93201f41b8d54ac0451d7e4a1d00 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 14 Apr 2026 14:32:46 +0200 Subject: [PATCH 34/43] Debug stale diagnostics. --- .../vscode/lsp/parametric/ParametricTextDocumentService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java index b534891fb..ee6b3073f 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java @@ -360,6 +360,7 @@ public void didClose(DidCloseTextDocumentParams params) { logger.debug("Did Close file: {}", params.getTextDocument()); var loc = Locations.toLoc(params.getTextDocument()); if (files.remove(loc) == null) { + logger.error("Received `didClose` for unknown file: {}", loc); throw new ResponseErrorException(unknownFileError(loc, params)); } facts(loc).close(loc); @@ -372,9 +373,11 @@ public void didClose(DidCloseTextDocumentParams params) { @Override public void didDeleteFiles(DeleteFilesParams params) { + logger.debug("textDocument/didDeleteFiles({})", params); exec.submit(() -> { // if a file is deleted, and we were tracking it, we remove our diagnostics for (var f : params.getFiles()) { + logger.debug("Received `didDelete` for {}", f); availableClient().publishDiagnostics(new PublishDiagnosticsParams(f.getUri(), List.of())); } }); From a423f25a852d1477fbf2ce1918af5e2325f56adc Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 14 Apr 2026 14:34:16 +0200 Subject: [PATCH 35/43] Await screenshots. --- rascal-vscode-extension/src/test/vscode-suite/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/utils.ts b/rascal-vscode-extension/src/test/vscode-suite/utils.ts index 6880a49ed..57505a89b 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/utils.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/utils.ts @@ -291,7 +291,7 @@ export class IDEOperations { await new Workbench().executeCommand("workbench.action.revertAndCloseActiveEditor"); } catch (ex) { const title = ignoreFails(new TextEditor().getTitle()) ?? 'unknown'; - this.screenshot(`revert of ${title} failed ` + tryCount); + await this.screenshot(`revert of ${title} failed ` + tryCount); console.log(`Revert of ${title} failed, but we ignore it`, ex); } try { @@ -307,7 +307,7 @@ export class IDEOperations { return !(await new TextEditor().isDirty()); } catch (ignored) { - this.screenshot("open editor check failed " + tryCount); + await this.screenshot("open editor check failed " + tryCount); console.log("Open editor dirty check failed: ", ignored); return false; From 0499428a93fc6e4804ff23ae2422fc7c12786adb Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 14 Apr 2026 14:38:35 +0200 Subject: [PATCH 36/43] Log parse events. --- .../java/org/rascalmpl/vscode/lsp/TextDocumentState.java | 5 +++++ .../org/rascalmpl/vscode/lsp/parametric/NoContributions.java | 1 + 2 files changed, 6 insertions(+) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java index 11b6611f0..f41c1fadc 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java @@ -198,6 +198,7 @@ public CompletableFuture>> getDiagnosticsAs } private void parse() { + logger.debug("Triggering parse for {}", location); try { parser.apply(location, content) .whenComplete((ITree t, Throwable e) -> { @@ -208,13 +209,17 @@ private void parse() { // Complete future to get the tree if (t == null) { + logger.error("Parse completed exceptionally: {}", location); treeAsync.completeExceptionally(e); } else { var tree = new Versioned<>(version, t, timestamp); + logger.error("Parse completed: {}", location); Versioned.replaceIfNewer(last, tree); if (diagnosticsList.isEmpty()) { + logger.error("Parse completed without errors: {}", location); Versioned.replaceIfNewer(lastWithoutErrors, tree); } + logger.error("TreeAsync completed: {}", location); treeAsync.complete(tree); } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/NoContributions.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/NoContributions.java index d8b999f2a..5b209a9a6 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/NoContributions.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/NoContributions.java @@ -87,6 +87,7 @@ public String getName() { @Override public CompletableFuture parsing(ISourceLocation loc, String input) { + logger.error("NoContributions::parsing()", loc); throw new NoContributionException("parsing"); } From 706bbdc6bdedfbff1c69e1c6f313c1b017394395 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 14 Apr 2026 17:57:33 +0200 Subject: [PATCH 37/43] Try to find race in Versioned. --- .../rascalmpl/vscode/lsp/util/Versioned.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java index 7e8aac0de..7b3c2f430 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java @@ -27,9 +27,14 @@ package org.rascalmpl.vscode.lsp.util; import java.util.concurrent.atomic.AtomicReference; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.checkerframework.checker.nullness.qual.PolyNull; public class Versioned { + + private static final Logger logger = LogManager.getLogger(Versioned.class); + private final int version; private final T object; private final long timestamp; @@ -66,13 +71,23 @@ public static AtomicReference> atomic(int version, T object) { } public static boolean replaceIfNewer(AtomicReference<@PolyNull Versioned> current, Versioned maybeNewer) { + logger.debug("Versioned.replaceIfNewer({}, {})", current, maybeNewer); while (true) { var old = current.get(); - if (old == null || old.version() < maybeNewer.version()) { + if (old == null) { + logger.debug("old == null"); + if (current.compareAndSet(old, maybeNewer)) { + return true; + } + } else if (old.version() < maybeNewer.version()) { + logger.debug("old version ({}) < new version ({})", old.version, maybeNewer.version); if (current.compareAndSet(old, maybeNewer)) { return true; + } else { + logger.debug("compareAndSet failed: {}, {}", current, old); } } else { + logger.debug("old version ({}) >= new version ({})", old.version, maybeNewer.version); return false; } } From 759a0e5f15e51c7b853aed3ec09f33edd3ac9360 Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Tue, 14 Apr 2026 18:00:39 +0200 Subject: [PATCH 38/43] Always parse on worker pool. --- .../org/rascalmpl/vscode/lsp/TextDocumentState.java | 12 ++++++++---- .../parametric/ParametricTextDocumentService.java | 2 +- .../vscode/lsp/rascal/RascalTextDocumentService.java | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java index f41c1fadc..7a27ef5c7 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; +import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiFunction; @@ -62,6 +63,7 @@ public class TextDocumentState { private final BiFunction> parser; private final ISourceLocation location; + private final ExecutorService exec; private final AtomicReference> current; private final AtomicReference<@Nullable Versioned> lastWithoutErrors; @@ -70,10 +72,12 @@ public class TextDocumentState { public TextDocumentState( BiFunction> parser, ISourceLocation location, - int initialVersion, String initialContent, long initialTimestamp) { + int initialVersion, String initialContent, long initialTimestamp, + ExecutorService exec) { this.parser = parser; this.location = location; + this.exec = exec; var u = new Update(initialVersion, initialContent, initialTimestamp); this.current = new AtomicReference<>(new Versioned<>(initialVersion, u)); @@ -201,7 +205,7 @@ private void parse() { logger.debug("Triggering parse for {}", location); try { parser.apply(location, content) - .whenComplete((ITree t, Throwable e) -> { + .whenCompleteAsync((ITree t, Throwable e) -> { if (e instanceof CompletionException && e.getCause() != null) { e = e.getCause(); } @@ -226,7 +230,7 @@ private void parse() { // Complete future to get diagnostics var diagnostics = new Versioned<>(version, diagnosticsList); diagnosticsAsync.complete(diagnostics); - }); + }, exec); } catch (NoContributionException e) { logger.debug("Ignoring missing parser for {}", location, e); treeAsync.completeOnTimeout(new Versioned<>(version, IRascalValueFactory.getInstance().character(0), timestamp), 60, TimeUnit.SECONDS); @@ -260,6 +264,6 @@ public long getLastModified() { public TextDocumentState changeParser(BiFunction> parsing) { var c = getCurrentContent(); - return new TextDocumentState(parsing, this.location, c.version(), c.get(), getLastModified()); + return new TextDocumentState(parsing, this.location, c.version(), c.get(), getLastModified(), exec); } } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java index ee6b3073f..a341f6e9f 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java @@ -719,7 +719,7 @@ private ParametricFileFacts facts(ISourceLocation doc) { private TextDocumentState open(TextDocumentItem doc, long timestamp) { return files.computeIfAbsent(Locations.toLoc(doc), - l -> new TextDocumentState(contributions(l)::parsing, l, doc.getVersion(), doc.getText(), timestamp)); + l -> new TextDocumentState(contributions(l)::parsing, l, doc.getVersion(), doc.getText(), timestamp, exec)); } private TextDocumentState getFile(ISourceLocation loc) { diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java index e581a3273..a13d62b58 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java @@ -557,7 +557,7 @@ private static T last(List l) { private TextDocumentState open(TextDocumentItem doc, long timestamp) { return documents.computeIfAbsent(Locations.toLoc(doc), - l -> new TextDocumentState(availableRascalServices()::parseSourceFile, l, doc.getVersion(), doc.getText(), timestamp)); + l -> new TextDocumentState(availableRascalServices()::parseSourceFile, l, doc.getVersion(), doc.getText(), timestamp, exec)); } private TextDocumentState getFile(TextDocumentIdentifier doc) { From 58d5ece1575bf315ea371a4e8bf9bc93126e2416 Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Wed, 15 Apr 2026 07:42:57 +0200 Subject: [PATCH 39/43] Revert "Always parse on worker pool." This reverts commit 759a0e5f15e51c7b853aed3ec09f33edd3ac9360. --- .../org/rascalmpl/vscode/lsp/TextDocumentState.java | 12 ++++-------- .../parametric/ParametricTextDocumentService.java | 2 +- .../vscode/lsp/rascal/RascalTextDocumentService.java | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java index 7a27ef5c7..f41c1fadc 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java @@ -30,7 +30,6 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; -import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiFunction; @@ -63,7 +62,6 @@ public class TextDocumentState { private final BiFunction> parser; private final ISourceLocation location; - private final ExecutorService exec; private final AtomicReference> current; private final AtomicReference<@Nullable Versioned> lastWithoutErrors; @@ -72,12 +70,10 @@ public class TextDocumentState { public TextDocumentState( BiFunction> parser, ISourceLocation location, - int initialVersion, String initialContent, long initialTimestamp, - ExecutorService exec) { + int initialVersion, String initialContent, long initialTimestamp) { this.parser = parser; this.location = location; - this.exec = exec; var u = new Update(initialVersion, initialContent, initialTimestamp); this.current = new AtomicReference<>(new Versioned<>(initialVersion, u)); @@ -205,7 +201,7 @@ private void parse() { logger.debug("Triggering parse for {}", location); try { parser.apply(location, content) - .whenCompleteAsync((ITree t, Throwable e) -> { + .whenComplete((ITree t, Throwable e) -> { if (e instanceof CompletionException && e.getCause() != null) { e = e.getCause(); } @@ -230,7 +226,7 @@ private void parse() { // Complete future to get diagnostics var diagnostics = new Versioned<>(version, diagnosticsList); diagnosticsAsync.complete(diagnostics); - }, exec); + }); } catch (NoContributionException e) { logger.debug("Ignoring missing parser for {}", location, e); treeAsync.completeOnTimeout(new Versioned<>(version, IRascalValueFactory.getInstance().character(0), timestamp), 60, TimeUnit.SECONDS); @@ -264,6 +260,6 @@ public long getLastModified() { public TextDocumentState changeParser(BiFunction> parsing) { var c = getCurrentContent(); - return new TextDocumentState(parsing, this.location, c.version(), c.get(), getLastModified(), exec); + return new TextDocumentState(parsing, this.location, c.version(), c.get(), getLastModified()); } } diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java index a341f6e9f..ee6b3073f 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/parametric/ParametricTextDocumentService.java @@ -719,7 +719,7 @@ private ParametricFileFacts facts(ISourceLocation doc) { private TextDocumentState open(TextDocumentItem doc, long timestamp) { return files.computeIfAbsent(Locations.toLoc(doc), - l -> new TextDocumentState(contributions(l)::parsing, l, doc.getVersion(), doc.getText(), timestamp, exec)); + l -> new TextDocumentState(contributions(l)::parsing, l, doc.getVersion(), doc.getText(), timestamp)); } private TextDocumentState getFile(ISourceLocation loc) { diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java index a13d62b58..e581a3273 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/rascal/RascalTextDocumentService.java @@ -557,7 +557,7 @@ private static T last(List l) { private TextDocumentState open(TextDocumentItem doc, long timestamp) { return documents.computeIfAbsent(Locations.toLoc(doc), - l -> new TextDocumentState(availableRascalServices()::parseSourceFile, l, doc.getVersion(), doc.getText(), timestamp, exec)); + l -> new TextDocumentState(availableRascalServices()::parseSourceFile, l, doc.getVersion(), doc.getText(), timestamp)); } private TextDocumentState getFile(TextDocumentIdentifier doc) { From 1b437ee0018b1fd2204518154b4e90ba6a0d318b Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Wed, 15 Apr 2026 07:48:04 +0200 Subject: [PATCH 40/43] Add more log statements to while loop --- .../main/java/org/rascalmpl/vscode/lsp/util/Versioned.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java index 7b3c2f430..16c1c6d6b 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java @@ -72,8 +72,12 @@ public static AtomicReference> atomic(int version, T object) { public static boolean replaceIfNewer(AtomicReference<@PolyNull Versioned> current, Versioned maybeNewer) { logger.debug("Versioned.replaceIfNewer({}, {})", current, maybeNewer); + logger.debug("maybeNewer.version: {}", maybeNewer.version()); + int i = 1; while (true) { + logger.debug("Iteration {}: Getting `old`...", i++); var old = current.get(); + logger.debug("Iteration {}: `old` = `{}`", i++, old); if (old == null) { logger.debug("old == null"); if (current.compareAndSet(old, maybeNewer)) { From a8a2f8aee99682e26d2afc9b0fccf22cc095d21e Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Wed, 15 Apr 2026 08:09:26 +0200 Subject: [PATCH 41/43] Add more log statements to while loop --- .../java/org/rascalmpl/vscode/lsp/util/Versioned.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java index 16c1c6d6b..7b084f3dd 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java @@ -72,11 +72,18 @@ public static AtomicReference> atomic(int version, T object) { public static boolean replaceIfNewer(AtomicReference<@PolyNull Versioned> current, Versioned maybeNewer) { logger.debug("Versioned.replaceIfNewer({}, {})", current, maybeNewer); - logger.debug("maybeNewer.version: {}", maybeNewer.version()); + logger.debug("current==null: {}; maybeNewer.version: {}", current == null, maybeNewer.version()); int i = 1; while (true) { + Versioned old = null; logger.debug("Iteration {}: Getting `old`...", i++); - var old = current.get(); + try { + old = current.get(); + } catch (Throwable t) { + logger.error("{}: {}", t.getClass(), t.getMessage()); + t.printStackTrace(); + throw t; + } logger.debug("Iteration {}: `old` = `{}`", i++, old); if (old == null) { logger.debug("old == null"); From a4984855a17d859cb9cee97dd88e41877cbc14d1 Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Wed, 15 Apr 2026 08:25:43 +0200 Subject: [PATCH 42/43] Add more log statements to while loop --- .../src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java index 7b084f3dd..360df3e0e 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/util/Versioned.java @@ -81,7 +81,7 @@ public static boolean replaceIfNewer(AtomicReference<@PolyNull Versioned> old = current.get(); } catch (Throwable t) { logger.error("{}: {}", t.getClass(), t.getMessage()); - t.printStackTrace(); + // t.printStackTrace(); throw t; } logger.debug("Iteration {}: `old` = `{}`", i++, old); From df5a6d1f7e70de00f14f2bda8eefdccd0ffc10ce Mon Sep 17 00:00:00 2001 From: Sung-Shik Jongmans Date: Wed, 15 Apr 2026 08:49:45 +0200 Subject: [PATCH 43/43] Fix issue that an outer class instance (`TextDocumentState`) wasn't properly initialized yet when an inner class instance (`Update`) was created. The inner class instance would use an uninitialized field of the outer class instance, resulting in an NPE. --- .../main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java index f41c1fadc..e9bda27c8 100644 --- a/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java +++ b/rascal-lsp/src/main/java/org/rascalmpl/vscode/lsp/TextDocumentState.java @@ -74,11 +74,11 @@ public TextDocumentState( this.parser = parser; this.location = location; + this.lastWithoutErrors = new AtomicReference<>(); + this.last = new AtomicReference<>(); var u = new Update(initialVersion, initialContent, initialTimestamp); this.current = new AtomicReference<>(new Versioned<>(initialVersion, u)); - this.lastWithoutErrors = new AtomicReference<>(); - this.last = new AtomicReference<>(); } public ISourceLocation getLocation() {