feat(ffi-linkage): consume extern LIB "csym" rename for fns (Phase 1.2b)
parseFnDecl parses the optional [LIB] ["csym"] tail after the extern/export keyword into FnDecl.extern_lib/extern_name (mirrors '#foreign LIB "csym"'). declareFunction unifies the symbol-name override: rename_c_name = foreign_expr.c_name (for #foreign) OR fd.extern_name (for extern) -> declare under the C name and map sx->C in foreign_name_map; the dedupe guard now covers extern too. examples/1224 green: 'c_abs :: (n) -> i32 extern "abs";' resolves c_abs to libc abs -> c_abs(-42) = 42. 1223 (bare extern) unregressed. Suite green (635 corpus / 443 unit). extern_lib is parsed + stored but not a linking driver — like '#foreign libc', it references a lib; the #library decl + build flags remain the separate linking axis (decision 4). green commit.
This commit is contained in:
@@ -1952,6 +1952,24 @@ pub const Parser = struct {
|
||||
// Optional postfix linkage modifier: `extern` (import) / `export` (define).
|
||||
const extern_export = self.parseOptionalExternExport();
|
||||
|
||||
// Optional `[LIB] ["csym"]` tail after extern/export — a library-alias
|
||||
// ident then a C symbol-name string, both optional (mirrors
|
||||
// `#foreign LIB "csym"`). Stored on extern_lib/extern_name; the rename
|
||||
// is consumed in `declareFunction`, the lib reference in Part B.
|
||||
var extern_lib: ?[]const u8 = null;
|
||||
var extern_name: ?[]const u8 = null;
|
||||
if (extern_export != .none) {
|
||||
if (self.current.tag == .identifier) {
|
||||
extern_lib = self.tokenSlice(self.current);
|
||||
self.advance();
|
||||
}
|
||||
if (self.current.tag == .string_literal) {
|
||||
const raw = self.tokenSlice(self.current);
|
||||
extern_name = raw[1 .. raw.len - 1];
|
||||
self.advance();
|
||||
}
|
||||
}
|
||||
|
||||
// Body: block `{ ... }`, arrow `=> expr;`, #builtin, #compiler, or #foreign marker.
|
||||
// An `extern` import has NO body — just `;`. The extern_export modifier
|
||||
// carries the linkage; we synthesize an empty block as the (non-optional)
|
||||
@@ -2025,6 +2043,8 @@ pub const Parser = struct {
|
||||
.is_arrow = is_arrow,
|
||||
.call_conv = call_conv,
|
||||
.extern_export = extern_export,
|
||||
.extern_lib = extern_lib,
|
||||
.extern_name = extern_name,
|
||||
.name_span = name_span,
|
||||
.is_raw = name_is_raw,
|
||||
} });
|
||||
|
||||
Reference in New Issue
Block a user