wcc+selfhost: pkg-qualified enum access (os.whence.CUR)
Driver-side concatenation flattens module names, but enum member lookup keyed off the exact lhs ident — so `whence.CUR` worked while `os.whence.CUR` fell through to w6l with `undefined main.whence`. C side: fold TY_ENUM members in the post-cexpr cascade too, not just the early SK_TYPE shortcut. The recursive cexpr lands the inner N_DOT(os, whence) on the named enum type; the outer access then folds normally. Selfhost: cgdot now treats `N_IDENT.MEMBER` and `N_DOT.MEMBER` the same way, keying off the leaf name. enumlookup strips a trailing `.`-prefix from the lookup key. Adds e2e test 700: `use os; os.whence.CUR as i32 == 1`.
This commit is contained in:
@@ -186,9 +186,22 @@ fn collectenums(c: *cgen, file: *node) void = {
|
||||
};
|
||||
|
||||
fn enumlookup(c: *cgen, name: str) *enumtype = {
|
||||
// Strip any `pkg.` prefix and key off the leaf — driver-side
|
||||
// concatenation flattens the namespace, so `os.whence` and
|
||||
// `whence` refer to the same registered enum.
|
||||
let leaf: str = name;
|
||||
let i: i32 = name.len - 1;
|
||||
for (i >= 0) {
|
||||
if (name[i] == 46u8) { // '.'
|
||||
leaf.ptr = name.ptr + (i + 1): u64;
|
||||
leaf.len = name.len - (i + 1);
|
||||
break;
|
||||
};
|
||||
i -= 1;
|
||||
};
|
||||
let e: *enumtype = c.enums;
|
||||
for (e != nil) {
|
||||
if (streq(e.ename, name)) { return e; };
|
||||
if (streq(e.ename, leaf)) { return e; };
|
||||
e = e.etnext;
|
||||
};
|
||||
return nil;
|
||||
|
||||
Reference in New Issue
Block a user