Skip to content

Commit e5de57e

Browse files
authored
Moved Dsymbol.oneMembers to dsymbolsem (dlang#21238)
1 parent 1fe1cac commit e5de57e

File tree

4 files changed

+74
-75
lines changed

4 files changed

+74
-75
lines changed

compiler/src/dmd/dsymbol.d

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ import dmd.statement;
5151
import dmd.staticassert;
5252
import dmd.tokens;
5353
import dmd.visitor;
54-
import dmd.dsymbolsem;
5554

5655
import dmd.common.outbuffer;
5756

@@ -900,69 +899,6 @@ extern (C++) class Dsymbol : ASTNode
900899
assert(0);
901900
}
902901

903-
/*****************************************
904-
* Same as Dsymbol::oneMember(), but look at an array of Dsymbols.
905-
*/
906-
extern (D) static bool oneMembers(Dsymbols* members, out Dsymbol ps, Identifier ident)
907-
{
908-
//printf("Dsymbol::oneMembers() %d\n", members ? members.length : 0);
909-
Dsymbol s = null;
910-
if (!members)
911-
{
912-
ps = null;
913-
return true;
914-
}
915-
916-
for (size_t i = 0; i < members.length; i++)
917-
{
918-
Dsymbol sx = (*members)[i];
919-
bool x = sx.oneMember(ps, ident); //MYTODO: this temporarily creates a new dependency to dsymbolsem, will need to extract oneMembers() later
920-
//printf("\t[%d] kind %s = %d, s = %p\n", i, sx.kind(), x, *ps);
921-
if (!x)
922-
{
923-
//printf("\tfalse 1\n");
924-
assert(ps is null);
925-
return false;
926-
}
927-
if (ps)
928-
{
929-
assert(ident);
930-
if (!ps.ident || !ps.ident.equals(ident))
931-
continue;
932-
if (!s)
933-
s = ps;
934-
else if (s.isOverloadable() && ps.isOverloadable())
935-
{
936-
// keep head of overload set
937-
FuncDeclaration f1 = s.isFuncDeclaration();
938-
FuncDeclaration f2 = ps.isFuncDeclaration();
939-
if (f1 && f2)
940-
{
941-
assert(!f1.isFuncAliasDeclaration());
942-
assert(!f2.isFuncAliasDeclaration());
943-
for (; f1 != f2; f1 = f1.overnext0)
944-
{
945-
if (f1.overnext0 is null)
946-
{
947-
f1.overnext0 = f2;
948-
break;
949-
}
950-
}
951-
}
952-
}
953-
else // more than one symbol
954-
{
955-
ps = null;
956-
//printf("\tfalse 2\n");
957-
return false;
958-
}
959-
}
960-
}
961-
ps = s; // s is the one symbol, null if none
962-
//printf("\ttrue\n");
963-
return true;
964-
}
965-
966902
void addObjcSymbols(ClassDeclarations* classes, ClassDeclarations* categories)
967903
{
968904
}

compiler/src/dmd/dsymbolsem.d

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5141,7 +5141,7 @@ void templateInstanceSemantic(TemplateInstance tempinst, Scope* sc, ArgumentList
51415141
if (tempinst.members.length)
51425142
{
51435143
Dsymbol s;
5144-
if (Dsymbol.oneMembers(tempinst.members, s, tempdecl.ident) && s)
5144+
if (oneMembers(tempinst.members, s, tempdecl.ident) && s)
51455145
{
51465146
//printf("tempdecl.ident = %s, s = `%s %s`\n", tempdecl.ident.toChars(), s.kind(), s.toPrettyChars());
51475147
//printf("setting aliasdecl\n");
@@ -5186,7 +5186,7 @@ void templateInstanceSemantic(TemplateInstance tempinst, Scope* sc, ArgumentList
51865186
if (tempinst.members.length)
51875187
{
51885188
Dsymbol s;
5189-
if (Dsymbol.oneMembers(tempinst.members, s, tempdecl.ident) && s)
5189+
if (oneMembers(tempinst.members, s, tempdecl.ident) && s)
51905190
{
51915191
if (!tempinst.aliasdecl || tempinst.aliasdecl != s)
51925192
{
@@ -8242,7 +8242,7 @@ private extern(C++) class OneMemberVisitor : Visitor
82428242
override void visit(AttribDeclaration atb)
82438243
{
82448244
Dsymbols* d = atb.include(null);
8245-
result = Dsymbol.oneMembers(d, *ps, ident);
8245+
result = oneMembers(d, *ps, ident);
82468246
}
82478247

82488248
override void visit(StaticForeachDeclaration sfd)
@@ -8265,7 +8265,7 @@ private extern(C++) class OneMemberVisitor : Visitor
82658265

82668266
override void visit(StorageClassDeclaration scd)
82678267
{
8268-
bool t = Dsymbol.oneMembers(scd.decl, *ps, ident);
8268+
bool t = oneMembers(scd.decl, *ps, ident);
82698269
if (t && *ps)
82708270
{
82718271
/* This is to deal with the following case:
@@ -8295,11 +8295,11 @@ private extern(C++) class OneMemberVisitor : Visitor
82958295
if (cd.condition.inc != Include.notComputed)
82968296
{
82978297
Dsymbols* d = dmd.expressionsem.include(cd.condition, null) ? cd.decl : cd.elsedecl;
8298-
result = Dsymbol.oneMembers(d, *ps, ident);
8298+
result = oneMembers(d, *ps, ident);
82998299
}
83008300
else
83018301
{
8302-
bool res = (Dsymbol.oneMembers(cd.decl, *ps, ident) && *ps is null && Dsymbol.oneMembers(cd.elsedecl, *ps, ident) && *ps is null);
8302+
bool res = (oneMembers(cd.decl, *ps, ident) && *ps is null && oneMembers(cd.elsedecl, *ps, ident) && *ps is null);
83038303
*ps = null;
83048304
result = res;
83058305
}
@@ -8308,7 +8308,7 @@ private extern(C++) class OneMemberVisitor : Visitor
83088308
override void visit(ScopeDsymbol sd)
83098309
{
83108310
if (sd.isAnonymous())
8311-
result = Dsymbol.oneMembers(sd.members, *ps, ident);
8311+
result = oneMembers(sd.members, *ps, ident);
83128312
else {
83138313
// visit(Dsymbol dsym)
83148314
*ps = sd;
@@ -9000,3 +9000,66 @@ void getLocalClasses(Module mod, ref ClassDeclarations aclasses)
90009000

90019001
_foreach(null, mod.members, &pushAddClassDg);
90029002
}
9003+
9004+
/*****************************************
9005+
* Same as Dsymbol::oneMember(), but look at an array of Dsymbols.
9006+
*/
9007+
extern (D) bool oneMembers(Dsymbols* members, out Dsymbol ps, Identifier ident)
9008+
{
9009+
//printf("Dsymbol::oneMembers() %d\n", members ? members.length : 0);
9010+
Dsymbol s = null;
9011+
if (!members)
9012+
{
9013+
ps = null;
9014+
return true;
9015+
}
9016+
9017+
for (size_t i = 0; i < members.length; i++)
9018+
{
9019+
Dsymbol sx = (*members)[i];
9020+
bool x = sx.oneMember(ps, ident); //MYTODO: this temporarily creates a new dependency to dsymbolsem, will need to extract oneMembers() later
9021+
//printf("\t[%d] kind %s = %d, s = %p\n", i, sx.kind(), x, *ps);
9022+
if (!x)
9023+
{
9024+
//printf("\tfalse 1\n");
9025+
assert(ps is null);
9026+
return false;
9027+
}
9028+
if (ps)
9029+
{
9030+
assert(ident);
9031+
if (!ps.ident || !ps.ident.equals(ident))
9032+
continue;
9033+
if (!s)
9034+
s = ps;
9035+
else if (s.isOverloadable() && ps.isOverloadable())
9036+
{
9037+
// keep head of overload set
9038+
FuncDeclaration f1 = s.isFuncDeclaration();
9039+
FuncDeclaration f2 = ps.isFuncDeclaration();
9040+
if (f1 && f2)
9041+
{
9042+
assert(!f1.isFuncAliasDeclaration());
9043+
assert(!f2.isFuncAliasDeclaration());
9044+
for (; f1 != f2; f1 = f1.overnext0)
9045+
{
9046+
if (f1.overnext0 is null)
9047+
{
9048+
f1.overnext0 = f2;
9049+
break;
9050+
}
9051+
}
9052+
}
9053+
}
9054+
else // more than one symbol
9055+
{
9056+
ps = null;
9057+
//printf("\tfalse 2\n");
9058+
return false;
9059+
}
9060+
}
9061+
}
9062+
ps = s; // s is the one symbol, null if none
9063+
//printf("\ttrue\n");
9064+
return true;
9065+
}

compiler/src/dmd/dtemplate.d

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import dmd.dinterpret;
5353
import dmd.dmodule;
5454
import dmd.dscope;
5555
import dmd.dsymbol;
56-
import dmd.dsymbolsem : dsymbolSemantic, checkDeprecated, aliasSemantic, search, search_correct, setScope, importAll, include, hasStaticCtorOrDtor;
56+
import dmd.dsymbolsem : dsymbolSemantic, checkDeprecated, aliasSemantic, search, search_correct, setScope, importAll, include, hasStaticCtorOrDtor, oneMembers;
5757
import dmd.errors;
5858
import dmd.errorsink;
5959
import dmd.expression;
@@ -639,7 +639,7 @@ extern (C++) final class TemplateDeclaration : ScopeDsymbol
639639
return;
640640

641641
Dsymbol s;
642-
if (!Dsymbol.oneMembers(members, s, ident) || !s)
642+
if (!oneMembers(members, s, ident) || !s)
643643
return;
644644

645645
onemember = s;
@@ -5273,7 +5273,7 @@ extern (C++) class TemplateInstance : ScopeDsymbol
52735273
if (members.length)
52745274
{
52755275
Dsymbol sa;
5276-
if (Dsymbol.oneMembers(members, sa, tempdecl.ident) && sa)
5276+
if (oneMembers(members, sa, tempdecl.ident) && sa)
52775277
aliasdecl = sa;
52785278
}
52795279
done = true;

compiler/src/dmd/templatesem.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ void templateDeclarationSemantic(Scope* sc, TemplateDeclaration tempdecl)
188188
if (tempdecl.members)
189189
{
190190
Dsymbol s;
191-
if (Dsymbol.oneMembers(tempdecl.members, s, tempdecl.ident) && s)
191+
if (oneMembers(tempdecl.members, s, tempdecl.ident) && s)
192192
{
193193
tempdecl.onemember = s;
194194
s.parent = tempdecl;

0 commit comments

Comments
 (0)