www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - how to skip sub functions in __traits(allMembers)

reply "BBaz" <bb.temp gmx.com> writes:
I try to build a symbol table:

---
module aveb;

import std.stdio;
import std.algorithm.searching;
import std.ascii;

void* [string] sig;

void ana(alias mod)()
{
     import std.traits;
     foreach(memb;__traits(allMembers,mod))
     static if 
(canFind(["package","public"],__traits(getProtection,memb)))
         static if (isSomeFunction! (__traits(getMember,mod,memb) 
))
             foreach(ov;__traits(getOverloads,mod,memb))
                 sig[memb] = &__traits(getMember,mod,memb);
}

void main(string[] args)
{
     //ana!(std.ascii); //ok
     ana!(std.traits);
     writeln(sig);
}
---

Error: function std.traits.demangleParameterStorageClass is not 
accessible from module aveb
Error: function std.traits.demangleParameterStorageClass is not 
accessible from module aveb
etc
problem is that the sub functions are not accessible. i'd like to skip them.
Jun 27 2015
parent ketmar <ketmar ketmar.no-ip.org> writes:
On Sat, 27 Jun 2015 16:28:40 +0000, BBaz wrote:

 I try to build a symbol table:
=20
 ---
 module aveb;
=20
 import std.stdio;
 import std.algorithm.searching;
 import std.ascii;
=20
 void* [string] sig;
=20
 void ana(alias mod)()
 {
      import std.traits; foreach(memb;__traits(allMembers,mod))
      static if
 (canFind(["package","public"],__traits(getProtection,memb)))
          static if (isSomeFunction! (__traits(getMember,mod,memb)
 ))
              foreach(ov;__traits(getOverloads,mod,memb))
                  sig[memb] =3D &__traits(getMember,mod,memb);
 }
=20
 void main(string[] args)
 {
      //ana!(std.ascii); //ok ana!(std.traits);
      writeln(sig);
 }
 ---
=20
Error: function std.traits.demangleParameterStorageClass is not
accessible from module aveb Error: function
std.traits.demangleParameterStorageClass is not accessible from module
aveb etc
=20 =20 problem is that the sub functions are not accessible. i'd like to skip them.
wrap your code in another static if: static if (is(typeof(__traits(getMember, mod, memb)))) { ... } `is()` gags errors and simply returns `false` for invalid cases.=
Jun 27 2015