Get all functions
Andrea Fontana
nospam at example.com
Tue Oct 8 07:09:47 PDT 2013
Oh, I didn't realize that allMembers works for modules too :)
On Tuesday, 8 October 2013 at 14:00:51 UTC, Dicebot wrote:
> On Tuesday, 8 October 2013 at 13:45:42 UTC, Dicebot wrote:
>> On Tuesday, 8 October 2013 at 12:45:48 UTC, Andrea Fontana
>> wrote:
>>> I have a number of functions like:
>>>
>>> @MyUda("...")
>>> void test();
>>>
>>> And I want to check them (at compile time, of course) to
>>> generate the right calls.
>>>
>>>
>>> Is there a way to get a list of them? Using traits/reflection?
>>
>> In specific module or in whole program?
>
> Anyway, full answer:
>
> 1) For a given module it is very easy
> ```
> foreach(name; __traits(allMembers, moduleName))
> {
> mixin ("alias symbol = " ~ name ~ ";");
> static if (is(symbol == function))
> {
> alias UDAs = __traits(getAttributes, symbol);
> foreach (UDA; UDAs)
> {
> static if (is(typeof(UDA) == MyUda))
> // proceed as you wish
> }
> }
> }
> ```
>
> 2)
> To get all transitively accessible modules you need to use some
> `.stringof` magic. Imported modules / packages are also listed
> in `allMembers` tuple but only way to find those is to check if
> `symbol.stringof` starts with "package " or "module " and then
> call `__traits(allMembers, symbol) recursively.
>
> Some of Phobos functions already do this and this should have
> probably been generalized but not progress there so far, at
> least one I am aware of.
More information about the Digitalmars-d-learn
mailing list