mirror of
https://github.com/dlang/dmd.git
synced 2025-04-25 12:40:11 +03:00
Moved Dsymbol.oneMembers to dsymbolsem (#21238)
This commit is contained in:
parent
1fe1cac81b
commit
e5de57e518
4 changed files with 74 additions and 75 deletions
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue