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:
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;
};
};