feat(ffi-linkage): postfix extern/export on #objc_class aggregate (Phase 3.1) — 1348 green
This commit is contained in:
@@ -1406,6 +1406,23 @@ pub const Parser = struct {
|
|||||||
self.advance();
|
self.advance();
|
||||||
try self.expect(.r_paren);
|
try self.expect(.r_paren);
|
||||||
|
|
||||||
|
// Phase 3 (FFI-linkage): optional postfix `extern` / `export` after the
|
||||||
|
// `#objc_class("X")` directive — the new spelling that replaces the prefix
|
||||||
|
// `#foreign` modifier (mirrors `struct #compiler` postfix placement).
|
||||||
|
// `… extern { … }` ⇒ reference an existing runtime class (== `#foreign`).
|
||||||
|
// `… export { … }` ⇒ define + register a new sx class (== no `#foreign`).
|
||||||
|
// Maps straight onto the existing `is_foreign` decision so lowering is
|
||||||
|
// unchanged. The legacy prefix `#foreign` form still works via the
|
||||||
|
// `is_foreign` argument; interplay/diagnostics for combining them is Phase 4.
|
||||||
|
var is_foreign_eff = is_foreign;
|
||||||
|
if (self.current.tag == .kw_extern) {
|
||||||
|
is_foreign_eff = true;
|
||||||
|
self.advance();
|
||||||
|
} else if (self.current.tag == .kw_export) {
|
||||||
|
is_foreign_eff = false;
|
||||||
|
self.advance();
|
||||||
|
}
|
||||||
|
|
||||||
try self.expect(.l_brace);
|
try self.expect(.l_brace);
|
||||||
|
|
||||||
var members = std.ArrayList(ast.ForeignClassMember).empty;
|
var members = std.ArrayList(ast.ForeignClassMember).empty;
|
||||||
@@ -1633,7 +1650,7 @@ pub const Parser = struct {
|
|||||||
.foreign_path = foreign_path,
|
.foreign_path = foreign_path,
|
||||||
.runtime = runtime,
|
.runtime = runtime,
|
||||||
.members = try members.toOwnedSlice(self.allocator),
|
.members = try members.toOwnedSlice(self.allocator),
|
||||||
.is_foreign = is_foreign,
|
.is_foreign = is_foreign_eff,
|
||||||
.is_main = is_main,
|
.is_main = is_main,
|
||||||
.is_raw = name_is_raw,
|
.is_raw = name_is_raw,
|
||||||
} });
|
} });
|
||||||
|
|||||||
Reference in New Issue
Block a user