The reserved-type-name binding diagnostic fired correctly but underlined the enclosing statement / if / while / for / match / protocol / #objc_class block because every binding-name check reused the parent `node.span`. Thread each binding name's own span through the AST and parser, and pass it to `checkBindingNames`: - ast: add name spans to VarDecl, DestructureDecl, If/WhileExpr, ForExpr (capture + index), MatchArm, Catch/OnFailStmt, Protocol/ForeignMethodDecl. - parser: populate each span at the binding site from the name token's loc; destructure reuses each target identifier's own span. - semantic_diagnostics: every checkBindingName call now passes the binding's own span — no site falls back to node.span. fn/lambda params already used Param.name_span. Carets now land on the offending identifier itself. New regression examples/1125 asserts the protocol default-body and sx-defined #objc_class method param spans; 0125/1119-1124 expected updated to the precise carets.
31 lines
993 B
Plaintext
31 lines
993 B
Plaintext
// A reserved/builtin type name used as a PARAMETER name is rejected inside the
|
|
// two method-with-body forms that carry their params as bare name lists rather
|
|
// than `Param` nodes: a protocol default-body method (`u8`) and a sx-defined
|
|
// foreign-class (`#objc_class`) method (`s16`). The declaration-site diagnostic
|
|
// underlines the OFFENDING PARAMETER itself, not the enclosing `protocol` /
|
|
// `#objc_class` block — each method's `param_name_spans` is threaded from the
|
|
// parser so the caret lands on the parameter token.
|
|
//
|
|
// Regression (issue 0076, attempt-5 span precision). Expected: one error per
|
|
// offending parameter, each caret on the parameter name; exit 1.
|
|
#import "modules/std.sx";
|
|
#import "modules/compiler.sx";
|
|
|
|
Greeter :: protocol {
|
|
greet :: (self: *Self, u8: s64) -> s64 {
|
|
return u8;
|
|
}
|
|
}
|
|
|
|
SxFoo :: #objc_class("SxFoo") {
|
|
counter: s32;
|
|
|
|
bump :: (self: *Self, s16: s32) {
|
|
self.counter += s16;
|
|
}
|
|
}
|
|
|
|
main :: () -> s32 {
|
|
return 0;
|
|
}
|