refactor(ffi-linkage): Phase 5.0 — route #foreign global decl onto extern AST
Part B begins: `#foreign` becomes an alias for `extern`. First of the four `#foreign` parser paths to migrate — the data-global form (`name : T #foreign [lib] ["csym"];`). It now builds the SAME extern-named VarDecl (`is_extern`/`extern_lib`/`extern_name`) that the postfix `extern` global path already produces, instead of `is_foreign`/`foreign_lib`/`foreign_name`. Behavior-preserving: lowering coalesces the two forms identically — the symbol name is `extern_name orelse foreign_name orelse name` (decl.zig:1119), and both `is_foreign` and `is_extern` feed the same `.is_extern` IR flag + early-return (decl.zig:1127,1141). The A->B gate already proved fn/global/class lower to byte-identical IR, so the corpus locks this with zero snapshot churn. Suite green: 10/10 steps, 444/444 unit, 643 corpus, 0 failed. The fn-decl, const-with-type, and runtime-class `#foreign` paths still build the legacy AST; they migrate next (the fn path needs the deferred visibility-gate + variadic alignment first).
This commit is contained in:
@@ -424,6 +424,10 @@ pub const Parser = struct {
|
|||||||
|
|
||||||
if (self.current.tag == .hash_foreign) {
|
if (self.current.tag == .hash_foreign) {
|
||||||
// name : type #foreign [lib] ["c_name"]; (extern global from libsystem etc.)
|
// name : type #foreign [lib] ["c_name"]; (extern global from libsystem etc.)
|
||||||
|
// Phase 5.0: `#foreign` is an alias for `extern`. Build the SAME
|
||||||
|
// extern-named AST the postfix `extern` global path builds below —
|
||||||
|
// lowering coalesces is_foreign/is_extern identically (decl.zig:1127,
|
||||||
|
// 1141), so this is behavior-preserving (snapshots unchanged).
|
||||||
self.advance();
|
self.advance();
|
||||||
var lib_ref: ?[]const u8 = null;
|
var lib_ref: ?[]const u8 = null;
|
||||||
if (self.current.tag == .identifier) {
|
if (self.current.tag == .identifier) {
|
||||||
@@ -442,9 +446,9 @@ pub const Parser = struct {
|
|||||||
.name_span = name_span,
|
.name_span = name_span,
|
||||||
.type_annotation = type_node,
|
.type_annotation = type_node,
|
||||||
.value = null,
|
.value = null,
|
||||||
.is_foreign = true,
|
.is_extern = true,
|
||||||
.foreign_lib = lib_ref,
|
.extern_lib = lib_ref,
|
||||||
.foreign_name = c_name,
|
.extern_name = c_name,
|
||||||
.is_raw = name_is_raw,
|
.is_raw = name_is_raw,
|
||||||
} });
|
} });
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user