From 4ef8b374faba519b4fdde848c40f2127819126b8 Mon Sep 17 00:00:00 2001 From: metagn Date: Sun, 18 May 2025 18:49:46 +0300 Subject: [PATCH] expand `OchoiceX` on resem --- src/nimony/sem.nim | 23 ++++++++++++++++++- src/nimony/sembasics.nim | 16 +++++++++++++ tests/nimony/lookups/tcrossmoduleoverload.nim | 12 ++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 tests/nimony/lookups/tcrossmoduleoverload.nim diff --git a/src/nimony/sem.nim b/src/nimony/sem.nim index 53d0a832e..35fabaf12 100644 --- a/src/nimony/sem.nim +++ b/src/nimony/sem.nim @@ -6763,6 +6763,27 @@ proc semTableConstructor(c: var SemContext; it: var Item; flags: set[SemFlag]) = it.typ = item.typ inc it.n +proc expandSymChoice(c: var SemContext; n: var Cursor) = + let info = n.info + takeToken c, n + assert n.kind == Symbol + var name = pool.syms[n.symId] + extractBasename(name) + var marker = initHashSet[SymId]() + while n.kind != ParRi: + assert n.kind == Symbol + marker.incl n.symId + takeToken c, n + addSymChoiceSyms(c, pool.strings.getOrIncl(name), marker, info) + takeParRi c, n + +proc semSymChoice(c: var SemContext; it: var Item; flags: set[SemFlag] = {}) = + if it.n.exprKind == OchoiceX: + # could restrict to callees + expandSymChoice c, it.n + else: + takeTree c, it.n + proc semExpr(c: var SemContext; it: var Item; flags: set[SemFlag] = {}) = case it.n.kind of IntLit: @@ -7027,7 +7048,7 @@ proc semExpr(c: var SemContext; it: var Item; flags: set[SemFlag] = {}) = of FieldsX, FieldpairsX, InternalFieldPairsX: takeTree c, it.n of OchoiceX, CchoiceX: - takeTree c, it.n + semSymChoice c, it of HaddrX, HderefX: takeToken c, it.n # this is exactly what we need here as these operators have the same diff --git a/src/nimony/sembasics.nim b/src/nimony/sembasics.nim index 40bdf8625..aafbbccbb 100644 --- a/src/nimony/sembasics.nim +++ b/src/nimony/sembasics.nim @@ -130,6 +130,22 @@ proc buildSymChoice*(c: var SemContext; identifier: StrId; info: PackedLineInfo; c.dest.shrink oldLen c.dest.add identToken(identifier, info) +proc addSymChoiceSyms*(c: var SemContext; identifier: StrId; marker: var HashSet[SymId]; info: PackedLineInfo) = + # like rawBuildSymChoice but adds to an existing symchoice, ignoring duplicates + var it = c.currentScope + while it != nil: + for sym in it.tab.getOrDefault(identifier): + if not marker.containsOrIncl(sym.name): + c.dest.addSymUse sym, info + it = it.up + # mirror considerImportedSymbols: + for moduleId in c.importTab.getOrDefault(identifier): + # prevent copies + let candidates = addr c.importedModules[moduleId].iface[identifier] + for defId in candidates[]: + if not marker.containsOrIncl(defId): + c.dest.add symToken(defId, info) + proc isDeclared*(c: var SemContext; name: StrId): bool = var scope = c.currentScope while scope != nil: diff --git a/tests/nimony/lookups/tcrossmoduleoverload.nim b/tests/nimony/lookups/tcrossmoduleoverload.nim new file mode 100644 index 000000000..10711d249 --- /dev/null +++ b/tests/nimony/lookups/tcrossmoduleoverload.nim @@ -0,0 +1,12 @@ +import std / syncio + +type + MyS = distinct string + +proc write*(f: File; s: MyS) = write f, string(s) + +proc main = + var s90 = MyS"abc" + echo s90 + +main()