hasUDA alternatives?

Anonymouse zorael at gmail.com
Sat Jan 28 16:29:35 UTC 2023


I use `hasUDA`, `getUDAs` and `getSymbolsByUDA` fairly heavily in 
my project. dmd requires some 3.2Gb to compile it, a dub 
recompilation taking somewhere around 8-14 seconds, depending on 
the phase of the moon. It's not too bad, admittedly.

Stuff like this, naturally taken out of all context:

```
static if (isSerialisable!member)
{
     import std.path : buildNormalizedPath;

     static if (hasUDA!(this.tupleof[i], Resource))
     {
         member = 
buildNormalizedPath(state.settings.resourceDirectory, member);
     }
     else static if (hasUDA!(this.tupleof[i], Configuration))
     {
         member = 
buildNormalizedPath(state.settings.configDirectory, member);
     }
}
```

```
private alias allEventHandlerFunctionsInModule =
     Filter!(isSomeFunction, getSymbolsByUDA!(thisModule, 
IRCEventHandler));
```

```
enum isSetupFun(alias T) = (getUDAs!(T, IRCEventHandler)[0]._when 
== Timing.setup);
enum isEarlyFun(alias T) = (getUDAs!(T, IRCEventHandler)[0]._when 
== Timing.early);
enum isLateFun(alias T) = (getUDAs!(T, IRCEventHandler)[0]._when 
== Timing.late);
enum isCleanupFun(alias T) = (getUDAs!(T, 
IRCEventHandler)[0]._when == Timing.cleanup);
alias hasSpecialTiming = templateOr!(isSetupFun, isEarlyFun, 
isLateFun, isCleanupFun);
alias isNormalEventHandler = templateNot!hasSpecialTiming;

alias setupFuns = Filter!(isSetupFun, 
this.allEventHandlerFunctionsInModule);
alias earlyFuns = Filter!(isEarlyFun, 
this.allEventHandlerFunctionsInModule);
alias lateFuns = Filter!(isLateFun, 
this.allEventHandlerFunctionsInModule);
alias cleanupFuns = Filter!(isCleanupFun, 
this.allEventHandlerFunctionsInModule);
alias pluginFuns = Filter!(isNormalEventHandler, 
this.allEventHandlerFunctionsInModule);
```

If `hasUDA` and friends are so bad[1] [2] [3], what can I use 
instead?

I need them to work at compile-time. `hasUDA` just needs to 
evaluate to true or false, but for `getUDAs` and 
`getSymbolsByUDA` I need them to resolve to symbols (and not 
string names of symbols).

Do I have any alternatives?

[1]: 
https://forum.dlang.org/post/bwekufskjmknllapzknd@forum.dlang.org
[2]: https://forum.dlang.org/post/tm02a6$nk3$1@digitalmars.com
[3]: 
https://forum.dlang.org/post/nzlnwbcezwyopjfiasan@forum.dlang.org


More information about the Digitalmars-d-learn mailing list