@@ -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+ }
0 commit comments