From e5de57e5182bec5a2d116c4b84e14899ad7ef99b Mon Sep 17 00:00:00 2001 From: Matthew Qiu <93230055+MatthewQiu-5@users.noreply.github.com> Date: Tue, 15 Apr 2025 08:22:18 -0400 Subject: [PATCH] Moved Dsymbol.oneMembers to dsymbolsem (#21238) --- compiler/src/dmd/dsymbol.d | 64 ---------------------------- compiler/src/dmd/dsymbolsem.d | 77 ++++++++++++++++++++++++++++++---- compiler/src/dmd/dtemplate.d | 6 +-- compiler/src/dmd/templatesem.d | 2 +- 4 files changed, 74 insertions(+), 75 deletions(-) diff --git a/compiler/src/dmd/dsymbol.d b/compiler/src/dmd/dsymbol.d index d2c1f8b308..7467112ad0 100644 --- a/compiler/src/dmd/dsymbol.d +++ b/compiler/src/dmd/dsymbol.d @@ -51,7 +51,6 @@ import dmd.statement; import dmd.staticassert; import dmd.tokens; import dmd.visitor; -import dmd.dsymbolsem; import dmd.common.outbuffer; @@ -900,69 +899,6 @@ extern (C++) class Dsymbol : ASTNode assert(0); } - /***************************************** - * Same as Dsymbol::oneMember(), but look at an array of Dsymbols. - */ - extern (D) static bool oneMembers(Dsymbols* members, out Dsymbol ps, Identifier ident) - { - //printf("Dsymbol::oneMembers() %d\n", members ? members.length : 0); - Dsymbol s = null; - if (!members) - { - ps = null; - return true; - } - - for (size_t i = 0; i < members.length; i++) - { - Dsymbol sx = (*members)[i]; - bool x = sx.oneMember(ps, ident); //MYTODO: this temporarily creates a new dependency to dsymbolsem, will need to extract oneMembers() later - //printf("\t[%d] kind %s = %d, s = %p\n", i, sx.kind(), x, *ps); - if (!x) - { - //printf("\tfalse 1\n"); - assert(ps is null); - return false; - } - if (ps) - { - assert(ident); - if (!ps.ident || !ps.ident.equals(ident)) - continue; - if (!s) - s = ps; - else if (s.isOverloadable() && ps.isOverloadable()) - { - // keep head of overload set - FuncDeclaration f1 = s.isFuncDeclaration(); - FuncDeclaration f2 = ps.isFuncDeclaration(); - if (f1 && f2) - { - assert(!f1.isFuncAliasDeclaration()); - assert(!f2.isFuncAliasDeclaration()); - for (; f1 != f2; f1 = f1.overnext0) - { - if (f1.overnext0 is null) - { - f1.overnext0 = f2; - break; - } - } - } - } - else // more than one symbol - { - ps = null; - //printf("\tfalse 2\n"); - return false; - } - } - } - ps = s; // s is the one symbol, null if none - //printf("\ttrue\n"); - return true; - } - void addObjcSymbols(ClassDeclarations* classes, ClassDeclarations* categories) { } diff --git a/compiler/src/dmd/dsymbolsem.d b/compiler/src/dmd/dsymbolsem.d index a6e731bf0a..e93232f5b1 100644 --- a/compiler/src/dmd/dsymbolsem.d +++ b/compiler/src/dmd/dsymbolsem.d @@ -5141,7 +5141,7 @@ void templateInstanceSemantic(TemplateInstance tempinst, Scope* sc, ArgumentList if (tempinst.members.length) { Dsymbol s; - if (Dsymbol.oneMembers(tempinst.members, s, tempdecl.ident) && s) + if (oneMembers(tempinst.members, s, tempdecl.ident) && s) { //printf("tempdecl.ident = %s, s = `%s %s`\n", tempdecl.ident.toChars(), s.kind(), s.toPrettyChars()); //printf("setting aliasdecl\n"); @@ -5186,7 +5186,7 @@ void templateInstanceSemantic(TemplateInstance tempinst, Scope* sc, ArgumentList if (tempinst.members.length) { Dsymbol s; - if (Dsymbol.oneMembers(tempinst.members, s, tempdecl.ident) && s) + if (oneMembers(tempinst.members, s, tempdecl.ident) && s) { if (!tempinst.aliasdecl || tempinst.aliasdecl != s) { @@ -8242,7 +8242,7 @@ private extern(C++) class OneMemberVisitor : Visitor override void visit(AttribDeclaration atb) { Dsymbols* d = atb.include(null); - result = Dsymbol.oneMembers(d, *ps, ident); + result = oneMembers(d, *ps, ident); } override void visit(StaticForeachDeclaration sfd) @@ -8265,7 +8265,7 @@ private extern(C++) class OneMemberVisitor : Visitor override void visit(StorageClassDeclaration scd) { - bool t = Dsymbol.oneMembers(scd.decl, *ps, ident); + bool t = oneMembers(scd.decl, *ps, ident); if (t && *ps) { /* This is to deal with the following case: @@ -8295,11 +8295,11 @@ private extern(C++) class OneMemberVisitor : Visitor if (cd.condition.inc != Include.notComputed) { Dsymbols* d = dmd.expressionsem.include(cd.condition, null) ? cd.decl : cd.elsedecl; - result = Dsymbol.oneMembers(d, *ps, ident); + result = oneMembers(d, *ps, ident); } else { - bool res = (Dsymbol.oneMembers(cd.decl, *ps, ident) && *ps is null && Dsymbol.oneMembers(cd.elsedecl, *ps, ident) && *ps is null); + bool res = (oneMembers(cd.decl, *ps, ident) && *ps is null && oneMembers(cd.elsedecl, *ps, ident) && *ps is null); *ps = null; result = res; } @@ -8308,7 +8308,7 @@ private extern(C++) class OneMemberVisitor : Visitor override void visit(ScopeDsymbol sd) { if (sd.isAnonymous()) - result = Dsymbol.oneMembers(sd.members, *ps, ident); + result = oneMembers(sd.members, *ps, ident); else { // visit(Dsymbol dsym) *ps = sd; @@ -9000,3 +9000,66 @@ void getLocalClasses(Module mod, ref ClassDeclarations aclasses) _foreach(null, mod.members, &pushAddClassDg); } + +/***************************************** +* Same as Dsymbol::oneMember(), but look at an array of Dsymbols. +*/ +extern (D) bool oneMembers(Dsymbols* members, out Dsymbol ps, Identifier ident) +{ + //printf("Dsymbol::oneMembers() %d\n", members ? members.length : 0); + Dsymbol s = null; + if (!members) + { + ps = null; + return true; + } + + for (size_t i = 0; i < members.length; i++) + { + Dsymbol sx = (*members)[i]; + bool x = sx.oneMember(ps, ident); //MYTODO: this temporarily creates a new dependency to dsymbolsem, will need to extract oneMembers() later + //printf("\t[%d] kind %s = %d, s = %p\n", i, sx.kind(), x, *ps); + if (!x) + { + //printf("\tfalse 1\n"); + assert(ps is null); + return false; + } + if (ps) + { + assert(ident); + if (!ps.ident || !ps.ident.equals(ident)) + continue; + if (!s) + s = ps; + else if (s.isOverloadable() && ps.isOverloadable()) + { + // keep head of overload set + FuncDeclaration f1 = s.isFuncDeclaration(); + FuncDeclaration f2 = ps.isFuncDeclaration(); + if (f1 && f2) + { + assert(!f1.isFuncAliasDeclaration()); + assert(!f2.isFuncAliasDeclaration()); + for (; f1 != f2; f1 = f1.overnext0) + { + if (f1.overnext0 is null) + { + f1.overnext0 = f2; + break; + } + } + } + } + else // more than one symbol + { + ps = null; + //printf("\tfalse 2\n"); + return false; + } + } + } + ps = s; // s is the one symbol, null if none + //printf("\ttrue\n"); + return true; +} diff --git a/compiler/src/dmd/dtemplate.d b/compiler/src/dmd/dtemplate.d index 8c94856053..af225cca4f 100644 --- a/compiler/src/dmd/dtemplate.d +++ b/compiler/src/dmd/dtemplate.d @@ -53,7 +53,7 @@ import dmd.dinterpret; import dmd.dmodule; import dmd.dscope; import dmd.dsymbol; -import dmd.dsymbolsem : dsymbolSemantic, checkDeprecated, aliasSemantic, search, search_correct, setScope, importAll, include, hasStaticCtorOrDtor; +import dmd.dsymbolsem : dsymbolSemantic, checkDeprecated, aliasSemantic, search, search_correct, setScope, importAll, include, hasStaticCtorOrDtor, oneMembers; import dmd.errors; import dmd.errorsink; import dmd.expression; @@ -639,7 +639,7 @@ extern (C++) final class TemplateDeclaration : ScopeDsymbol return; Dsymbol s; - if (!Dsymbol.oneMembers(members, s, ident) || !s) + if (!oneMembers(members, s, ident) || !s) return; onemember = s; @@ -5273,7 +5273,7 @@ extern (C++) class TemplateInstance : ScopeDsymbol if (members.length) { Dsymbol sa; - if (Dsymbol.oneMembers(members, sa, tempdecl.ident) && sa) + if (oneMembers(members, sa, tempdecl.ident) && sa) aliasdecl = sa; } done = true; diff --git a/compiler/src/dmd/templatesem.d b/compiler/src/dmd/templatesem.d index e5efce4a8b..a2ef845974 100644 --- a/compiler/src/dmd/templatesem.d +++ b/compiler/src/dmd/templatesem.d @@ -188,7 +188,7 @@ void templateDeclarationSemantic(Scope* sc, TemplateDeclaration tempdecl) if (tempdecl.members) { Dsymbol s; - if (Dsymbol.oneMembers(tempdecl.members, s, tempdecl.ident) && s) + if (oneMembers(tempdecl.members, s, tempdecl.ident) && s) { tempdecl.onemember = s; s.parent = tempdecl;