From 517d7a2a50fe2ff7f254e3f7aee0155f37255525 Mon Sep 17 00:00:00 2001 From: yakirgb Date: Tue, 6 Jan 2026 11:05:04 +0200 Subject: [PATCH] Fix race condition: onDefinition returns empty before validatePerlDocument completes When textDocument/definition is called shortly after textDocument/didOpen, navSymbols may not be populated yet because validatePerlDocument spawns a slow Perl process (300-500ms+). Instead of returning empty, parse on-demand using the fast Node.js parser. This provides immediate results for local symbols while the full Perl compilation completes in the background. Fixes #179 --- server/src/server.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/src/server.ts b/server/src/server.ts index 600a511..8c429c2 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -26,7 +26,8 @@ import { perlcompile, perlcritic, perlimports } from "./diagnostics"; import { cleanupTemporaryAssetPath } from "./assets"; import { getDefinition, getAvailableMods } from "./navigation"; import { getSymbols, getWorkspaceSymbols } from "./symbols"; -import { NavigatorSettings, PerlDocument, PerlElem, completionElem} from "./types"; +import { NavigatorSettings, PerlDocument, PerlElem, completionElem, ParseType } from "./types"; +import { parseDocument } from "./parser"; import { getHover } from "./hover"; import { getCompletions, getCompletionDoc } from "./completion"; import { formatDoc, formatRange } from "./formatting"; @@ -434,7 +435,10 @@ connection.onDefinition(async (params) => { let mods = availableMods.get("default"); if (!mods) mods = new Map(); if (!document) return; - if (!perlDoc) return; // navSymbols is an LRU cache, so the navigation elements will be missing if you open lots of files + // Parse on-demand if navSymbols hasn't been populated yet (race condition with validatePerlDocument) + if (!perlDoc) { + perlDoc = await parseDocument(document, ParseType.selfNavigation); + } let locOut: Location | Location[] | undefined = await getDefinition(params, perlDoc, document, mods); return locOut; });