commit cdb5faa593f7a11ff9ed961c0a3456609ce8793f
parent 29ce9f703ee411b789141afd83ebadc1c1910e84
Author: Lou Woell <lou.woell@posteo.de>
Date:   Tue, 17 Feb 2026 11:55:50 +0100

[list] also list enum members

Diffstat:
Mcmd/harehelper/+test/list_test.ha | 32++++++++++++++++++++++++++++++--
Mcmd/harehelper/list_symbols.ha | 10++++++++++
Mcmd/harehelper/resolve.ha | 28+++++++++++++++-------------
3 files changed, 55 insertions(+), 15 deletions(-)

diff --git a/cmd/harehelper/+test/list_test.ha b/cmd/harehelper/+test/list_test.ha @@ -5,7 +5,7 @@ use hare::module; use hare::parse; use os; -@test fn list_symbols_test () void = { +fn list_symbols_test_fn (module: str) []ast::ident = { const ctx = module::context { harepath = harepath(), harecache = match (os::getenv("HARECACHE")) { @@ -17,14 +17,42 @@ use os; tags = ["linux"], }; - let res = match (list_symbols(&ctx, parse::identstr("test")!)) { + let res = match (list_symbols(&ctx, parse::identstr(module)!)) { case let e: error => fmt::fatalf("Error: {}", strerror(e)); case let l: []ast::ident => fmt::errorfln("N Symbols: {}", len(l))!; yield l; }; + + return res; +}; + +@test fn list_symbols () void = { + let res = list_symbols_test_fn("test"); defer idents_finish(res); assert(len(res) == 4); }; + +@test fn list_symbols_enum () void = { + let res = list_symbols_test_fn("fmt"); + defer idents_finish(res); + + for (let i .. res) { + if (ast::ident_eq(["alignment"], i)) return void; + }; + + abort("Enum not found."); +}; + +@test fn list_symbols_enum_member () void = { + let res = list_symbols_test_fn("fmt"); + defer idents_finish(res); + + for (let i .. res) { + if (ast::ident_eq(["alignment", "RIGHT"], i)) return void; + }; + + abort("Enum not found."); +}; diff --git a/cmd/harehelper/list_symbols.ha b/cmd/harehelper/list_symbols.ha @@ -18,6 +18,7 @@ use getopt; use hare::ast; use hare::module; use hare::parse; +use strings; fn list (cmd: getopt::command, ctx: *module::context) void = { @@ -84,6 +85,15 @@ fn list_symbols ( append(res, ast::ident_dup(d.ident))!; case let d: ast::decl_type => append(res, ast::ident_dup(d.ident))!; + match (d._type.repr) { + case let e: ast::enum_type => + for (let v .. e.values) { + let ns = ast::ident_dup(d.ident); + append(ns, strings::dup(v.name)!)!; + append(res, ns)!; + }; + case => void; + }; case let d: ast::decl_func => append(res, ast::ident_dup(d.ident))!; case ast::assert_expr => void; diff --git a/cmd/harehelper/resolve.ha b/cmd/harehelper/resolve.ha @@ -169,7 +169,8 @@ fn resolve_uid ( case ast::import_wildcard => // Conceptually the same as in members case. - + // list_symbols includes enum members in result, so we + // need no special cases. let list = match (list_symbols(ctx, ident)) { case let e: error => fmt::errorfln("Error: {}", strerror(e))!; @@ -181,7 +182,7 @@ fn resolve_uid ( defer idents_finish(list); for (let s .. list) { - found_import = ast::ident_eq(s, [id[0]]); + found_import = ast::ident_eq(s, id); if (found_import) { interned = true; break; @@ -197,11 +198,15 @@ fn resolve_uid ( ns, ident_last(ident), ); - // check for enum - // id: [ast, builtin_type, bool] - // ns: [ast, builtin_type] - // ident: [hare, ast] - if (!found_import && len(ns) > 1) { + if (found_import && len(id) > 1) { + interned = true; + id = ident_last(id); + } else if (!found_import && len(ns) > 1) { + + // check for enum + // id: [ast, builtin_type, bool] + // ns: [ast, builtin_type] + // ident: [hare, ast] let nsns = ident_ns(ns); found_import = ast::ident_eq(nsns, ident_last(ident)); @@ -217,16 +222,13 @@ fn resolve_uid ( let result = ast::ident_dup(ident); - - if (found_import) if (interned) { + // unless ident is unshadowed module name. + if (interned) { for (let s .. ast::ident_dup(id)) { append(result, s)!; }; - } else if (len(id) > 1) { - let end = ident_last(id); - let id_end = ast::ident_dup(end); - append(result, id_end[0])!; }; + return result; }; };