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