ffi 3.2 A2: implement #selector("explicit:string") override
Make-green half of the cadence step started in A1. Wires the
`#selector` directive end-to-end:
- Lexer token `hash_selector` at src/token.zig + lookup row in
src/lexer.zig.
- AST field `selector_override: ?[]const u8 = null` on
`ForeignMethodDecl` (src/ast.zig).
- Parser block in src/parser.zig that mirrors
`#jni_method_descriptor` — both occupy the same slot after the
optional `-> ReturnType` and before the body/terminator. Not
mutually exclusive at parse time.
- LSP semantic-token list (src/lsp/server.zig) updated.
- Lowering: `deriveObjcSelector` returns
`{ sel, keyword_count, is_override }`. When `is_override` is true,
the selector string is the user's literal and `keyword_count` is
the colon count in that literal. Both `lowerObjcMethodCall` and
`lowerObjcStaticCall` use the result.
Diagnostic policy when override colon-count ≠ call arity:
- Default mangling path: stays an error (`.err`). The user can fix
the sx-side name to produce the right keyword count.
- Override path: downgrades to a warning (`.warn`). Rationale:
Obj-C's `objc_msgSend` doesn't validate colon-vs-arg the way JNI's
`GetMethodID` validates the descriptor — the runtime dispatches
regardless and the wrong-arity case becomes silent calling-
convention corruption. The compiler is the last line of defense
for this typo class, but the warning preserves the override's
escape-hatch character (deliberate mismatches still proceed).
Snapshot for `examples/ffi-objc-dsl-06-selector-override.sx` flips
from the pre-3.2 parser-error to working output:
static override non-null: true
The mismatch diagnostic text in
`examples/ffi-objc-dsl-04-mismatch.sx`'s snapshot is updated to
drop the "once that lands (3.2)" phrasing now that 3.2 is here.
165/165 example tests.
This commit is contained in:
@@ -525,9 +525,18 @@ and an instance-method `NSDictionary.lookup` with override
|
||||
so the snapshot captures the parser error and exit=1. Next commit
|
||||
(A2) wires lexer/parser/AST/lowering and flips the snapshot.
|
||||
|
||||
Phase 3.2 A2 landed: `#selector("explicit:string")` override wired
|
||||
end-to-end. Lexer token `hash_selector`, AST field
|
||||
`selector_override: ?[]const u8` on `ForeignMethodDecl`, parser block
|
||||
mirroring `#jni_method_descriptor`, lowering in `deriveObjcSelector`
|
||||
returning `{ sel, keyword_count, is_override }`. Both
|
||||
`lowerObjcMethodCall` and `lowerObjcStaticCall` honor the override;
|
||||
arity-mismatch under the override path downgrades from `.err` to
|
||||
`.warn` (the runtime doesn't validate colon-vs-arg the way JNI's
|
||||
`GetMethodID` validates descriptors). Snapshot for
|
||||
`ffi-objc-dsl-06-selector-override.sx` flipped to working output.
|
||||
|
||||
Open work, in roughly the order they make sense:
|
||||
- **Phase 3 step 3.2 — A2 (make-green)** — wire the `#selector`
|
||||
token and override behavior. Snapshot flips to working output.
|
||||
- **Phase 3 step 3.2 — B (golden mangling table)** — locked-in IR
|
||||
fixture for the default mangling rule.
|
||||
- **Phase 3 step 3.2 — C1..C5** — uikit.sx migration, one cluster
|
||||
|
||||
Reference in New Issue
Block a user