On Saturday, 25 October 2014 at 13:53:35 UTC, Adam D. Ruppe wrote:
On Saturday, 25 October 2014 at 13:45:29 UTC, Rares Pop wrote:
What do you mean by copy/pasting ?
I literally copied the code in your post (and fixed a missing
semicolon) and got it to compile.
Passing A as an argument to injections should work. You can
also use this and typeof(this) inside the injections template
code to access the class. It should all work.
Taking this one step further, it looks like the attributes are
not available at the mixin scope.
Here is my code:
------
struct Inject {
// immutable Scope scoped;
}
static string injections(T)()
{
pragma(msg, "injections for : ", T);
string result;
foreach(member; __traits(allMembers,T))
{
enum fullName = format("%s.%s", T.stringof, member);
pragma(msg, "member: ", fullName);
auto attributes = __traits(getAttributes, fullName);
enum dbg_msg = format ("%s attributes are %s", fullName,
attributes.stringof);
pragma(msg, dbg_msg);
foreach(attr;attributes){
pragma(msg, "Checking attribute", attr);
}
}
return result;
}
class A {
this(){
}
}
class B {
@Inject A a;
mixin(injections!(B));
}
---
when compiling this code this is the output I get:
----
Compiling using dmd...
injections for : B
member: B.a
B.a attributes are tuple()
member: B.toString
B.toString attributes are tuple()
member: B.toHash
B.toHash attributes are tuple()
member: B.opCmp
B.opCmp attributes are tuple()
member: B.opEquals
B.opEquals attributes are tuple()
member: B.Monitor
B.Monitor attributes are tuple()
member: B.factory
B.factory attributes are tuple()
------
B.a attributes are an empty tuple even though the member is
annotated with @Inject.
Any ideas why?