A parse error raised while resolving an `#import` was rendered against the ROOT file's source — the caret landed on an unrelated line (often a comment) even though the message named the correct imported file. Two compounding causes: - core.zig wired `diagnostics.import_sources` only AFTER import resolution returned, but a parse error aborts mid-resolution (before that wiring), so the renderer had no imported sources and fell back to the root file. Wire it (and seed the main-file source) BEFORE resolving. - imports.zig emitted the diagnostic at the importer's `#import` span instead of the parser's actual error offset inside the imported file, and didn't pin the diagnostic's source_file to that file. parser.zig now records `err_end` alongside `err_offset` for a proper caret width. New `DiagnosticList.addFmtInFile` renders against an explicit source file; imports.zig uses it with `importErrSpan(&p)`. Regression test: examples/1176-diagnostics-import-parse-error-location (importer + deliberately-broken companion; caret must land in the companion).
14 lines
731 B
Plaintext
14 lines
731 B
Plaintext
// A parse error in an IMPORTED file must be located in THAT file, not the
|
|
// importer. Regression: `import_sources` was wired to the diagnostics only
|
|
// AFTER import resolution finished, so a parse error raised MID-resolution
|
|
// (which aborts before that wiring) could not resolve the imported file's
|
|
// source — the caret fell back to the root file and landed on an unrelated
|
|
// line. The fix wires `import_sources` before resolving and pins the
|
|
// diagnostic's `source_file` + offset to the imported file.
|
|
//
|
|
// The companion's error sits several lines down (after comments) so a caret
|
|
// mislocated against THIS importer would be unmistakable.
|
|
#import "1176-diagnostics-import-parse-error-location/broken.sx";
|
|
|
|
main :: () {}
|