Moved Dsymbol.oneMembers to dsymbolsem (#21238)

This commit is contained in:
Matthew Qiu 2025-04-15 08:22:18 -04:00 committed by GitHub
parent 1fe1cac81b
commit e5de57e518
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 74 additions and 75 deletions

View file

@ -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)
{
}

View file

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

View file

@ -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;

View file

@ -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;