diff --git a/server/resources/compiler/linux/nwn_script_comp b/server/resources/compiler/linux/nwn_script_comp index 5a188d8..0c984d7 100755 Binary files a/server/resources/compiler/linux/nwn_script_comp and b/server/resources/compiler/linux/nwn_script_comp differ diff --git a/server/resources/compiler/mac/nwn_script_comp b/server/resources/compiler/mac/nwn_script_comp index 88791f0..0c984d7 100644 Binary files a/server/resources/compiler/mac/nwn_script_comp and b/server/resources/compiler/mac/nwn_script_comp differ diff --git a/server/resources/compiler/windows/nwn_script_comp.exe b/server/resources/compiler/windows/nwn_script_comp.exe index c76bdc0..acd87a2 100644 Binary files a/server/resources/compiler/windows/nwn_script_comp.exe and b/server/resources/compiler/windows/nwn_script_comp.exe differ diff --git a/server/src/Providers/DiagnosticsProvider.ts b/server/src/Providers/DiagnosticsProvider.ts index 2246163..7449e89 100644 --- a/server/src/Providers/DiagnosticsProvider.ts +++ b/server/src/Providers/DiagnosticsProvider.ts @@ -25,20 +25,27 @@ export default class DiagnoticsProvider extends Provider { private generateDiagnostics(uris: string[], files: FilesDiagnostics, severity: DiagnosticSeverity) { return (line: string) => { - const uri = uris.find((uri) => basename(fileURLToPath(uri)) === lineFilename.exec(line)![2]); - - if (uri) { - const linePosition = Number(lineNumber.exec(line)![1]) - 1; - const diagnostic = { - severity, - range: { - start: { line: linePosition, character: 0 }, - end: { line: linePosition, character: Number.MAX_VALUE }, - }, - message: lineMessage.exec(line)![2].trim(), - }; - - files[uri].push(diagnostic); + const lineFilenameMatch = lineFilename.exec(line); + if (lineFilenameMatch) { + const reportedFileName = lineFilenameMatch[2]; + const uri = uris.find((uri) => basename(fileURLToPath(uri)) === reportedFileName); + if (uri) { + const lineNumberMatch = lineNumber.exec(line); + const lineMessageMatch = lineMessage.exec(line); + if (lineNumberMatch && lineMessageMatch) { + const linePosition = Number(lineNumberMatch[1]) - 1; + const diagnostic = { + severity, + range: { + start: { line: linePosition, character: 0 }, + end: { line: linePosition, character: Number.MAX_VALUE }, + }, + message: lineMessageMatch[2].trim(), + }; + + files[uri].push(diagnostic); + } + } } }; } @@ -101,7 +108,10 @@ export default class DiagnoticsProvider extends Provider { // The compiler command: // - y; continue on error // - s; dry run - const args = ["-y", "-s"]; + // - n; no entry point required (for include files) + // - E; collect and report all errors (not just the first) + // Note: -E requires compiler binary with ABI v2+ + const args = ["-y", "-s", "-n", "-E"]; if (Boolean(nwnHome)) { args.push("--userdirectory"); args.push(`"${nwnHome}"`); @@ -114,12 +124,25 @@ export default class DiagnoticsProvider extends Provider { } else if (verbose) { this.server.logger.info("Trying to resolve Neverwinter Nights installation directory automatically."); } - if (children.length > 0) { + // Collect directories from ALL indexed documents so the compiler can + // resolve the full transitive include chain, not just direct children. + const allDirs: Set = new Set(); + this.server.documentsCollection.forEach((doc) => { + if (doc.uri && doc.uri.startsWith("file://")) { + allDirs.add(dirname(fileURLToPath(doc.uri))); + } + }); + // Also add the compiled file's own directory + allDirs.add(dirname(fileURLToPath(uri))); + if (allDirs.size > 0) { args.push("--dirs"); - args.push(`"${[...new Set(uris.map((uri) => dirname(fileURLToPath(uri))))].join(",")}"`); + args.push(`"${[...allDirs].join(",")}"`); } + + const filePath = fileURLToPath(uri); + this.server.logger.info(`Compiling file: ${filePath}`); args.push("-c"); - args.push(`"${fileURLToPath(uri)}"`); + args.push(`"${filePath}"`); let stdout = ""; let stderr = ""; @@ -186,6 +209,7 @@ export default class DiagnoticsProvider extends Provider { for (const [uri, diagnostics] of Object.entries(files)) { this.server.connection.sendDiagnostics({ uri, diagnostics }); } + resolve(true); }); });