digitalmars.D.learn - Imports incorrectly part of "allMembers" trait output?
- Mike Bierlee (21/21) Jan 02 2017 When compiling the following code with DMD 2.072.2:
When compiling the following code with DMD 2.072.2: class LeClass { import std.stdio; } void main() { foreach (memberName; __traits(allMembers, LeClass)) { pragma(msg, memberName); } } The following output is shown in the console: std toString toHash opCmp opEquals Monitor factory Note how "std" is part of the output of allMembers. Is this a bug or is this intended behavior? I don't think imports are necessarily members of a class. It also happens for static imports.
Jan 02 2017
On Monday, 2 January 2017 at 18:56:40 UTC, Mike Bierlee wrote:When compiling the following code with DMD 2.072.2: class LeClass { import std.stdio; } void main() { foreach (memberName; __traits(allMembers, LeClass)) { pragma(msg, memberName); } } The following output is shown in the console: std toString toHash opCmp opEquals Monitor factory Note how "std" is part of the output of allMembers. Is this a bug or is this intended behavior? I don't think imports are necessarily members of a class. It also happens for static imports.It seems to be a bug that it takes std as there's no std as a part of object, not even as an import. However there is: __traits(derivedMembers, T) which should only give you members of your actual class and not anything inherited from base classes and/or object.
Jan 02 2017
On Tuesday, 3 January 2017 at 06:23:01 UTC, bauss wrote:It seems to be a bug that it takes std as there's no std as a part of object, not even as an import.there is. think of it as "ephemeral namespace entity" (kind of alias to "name bin" that compiler created, the entity that exists, just has no corresponding D type). as i wrote ealier, it will be useful eventually to walk import chains in CTFE.
Jan 03 2017
given the way your code is written, "std" namespace *is* a member. it will be very useful when we'll fix other bugs and recursive `allMembers` scan will become possible. so while it came from namespaces implementation, i don't see this as a bug. it is little annoying, yes, 'cause you *have* to sort module ids out in your code. luckily, it is fairly easy, as module has no valid D type.
Jan 03 2017