For me, having a solid reflection library like this is one of the most important improvements D can make right now.

After releasing jsonizer (a json serializer) I started talking to the authors of PainlessJson (another json serializer that was released around the same time) about how there was a substantial amount of overlap between our implementations, a large portion of which was related to reflection rather than actually handling json. While I won't speak for painlessjson, I can say that the techniques I used in jsonizer got pretty hacky -- there's a whole lot of __traits and one monstrous mixin template.

For the most part, this looks really nice. Thanks for putting it together, bitwise! That being said, there are a few limitiations I see to this implementation:

How can you get the user-defined attributes of a given ScopeRefl?
It would be awesome to say:
foreach(field ; reflect!Foo.fields) {
     static if (field.hasAttribute(...)) { ... }
}
I guess the difficulty here is that a user-defined attribute in D can be pretty much anything from a primitive type to a struct instance to some arbitrary symbol.

How can you get the static type of a reflected field? For example:
alias T = reflect!Foo.fields[0].field_type
doSomethingWithType!T

This is available in FieldRefImpl, but disappears on FieldRefl so it can be stuck into an array with a bunch of other FieldRefl, and I'm not sure if there is a way of getting that information back (other than resorting back to __traits on the user-end, which kind of defeats the purpose).

If I understand correctly, more work needs to be done in druntime to better support reflection, but I've read this thread about 3 times and I'm still having a hard time figuring out whats going on :)

If these changes were made to druntime, would they obviate the need for a reflection library, or simply make it easier to implement a reflection library? Is more help needed? If so, where should I start looking? I'm not familiar with druntime at all, but wouldn't mind trying to make sense of it.

Reply via email to