static foreach over enum symbols
    Ben Jones 
    fake at fake.fake
       
    Fri Feb 14 22:24:14 UTC 2020
    
    
  
Hi all,
I'm getting unexpected results while trying to process symbols 
from a module, some of which are enums.
Depending on whether or not I comment out the first static 
foreach loop below, fullyQualifiedName gives me different results 
in the second loop.
In either case, I'm surprised I can't grab the UDAs in the second 
static foreach loop.  Any ideas what's going on?
Test case:
---a.d---
module a;
@Object
enum x = "hello";
@Object
enum y = "goodbye";
@Object
struct z{}
---main.d---
template symbols(alias Mod){
     import std.meta;
     alias toSymbol(alias T) = __traits(getMember, Mod, T);
     alias symbols = staticMap!(toSymbol, __traits(allMembers, 
Mod));
}
void main(){
     import std.traits;
     import std.meta;
     import a;
     //commenting this out changes the results below
     static foreach(sym; symbols!a){
         pragma(msg, fullyQualifiedName!sym);
         pragma(msg, __traits(getAttributes, sym));
     }
     pragma(msg, "\nget with UDAs\n");
     pragma(msg, getSymbolsByUDA!(a, Object));
     alias udaSyms = getSymbolsByUDA!(a, Object);
     pragma(msg, staticMap!(fullyQualifiedName, udaSyms));
     static foreach(us; udaSyms){
         pragma(msg, fullyQualifiedName!us);
         pragma(msg, __traits(getAttributes, us));
     }
}
---
annotated output of dmd main.d:
with the first loop commented out:
get with UDAs
tuple("hello", "goodbye", (z))
tuple("a.x", "a.y", "a.z")
a.x
tuple()  //why is the UDA gone?
a.y
tuple()
a.z
tuple((Object))
and with the first loop:
object
tuple()
main.main.sym  //it's not a.x anymore, it's the name of the local 
var for static foreach?
tuple()
main.main.sym
tuple()
a.z
tuple((Object))
get with UDAs
tuple("hello", "goodbye", (z))
tuple("main.main.sym", "main.main.sym", "a.z") //and the results 
are changed here too?
main.main.sym
tuple()
main.main.sym
tuple()
a.z
tuple((Object))
    
    
More information about the Digitalmars-d-learn
mailing list