View mode: basic / threaded / horizontal-split · Log in · Help
May 04, 2012
allMembers
So I do a lot of module scanning via allMembers, and I'm consistently
running into an awkward problem:

module test.blah;

static this()
{
 foreach(m; __traits(allMembers, test.module))
 {
   // m is a string, the only way I know to address the thing m references
is: mixin(m), and this can't be involved in virtually any complex
expressions...

   // I need to know if m is an interface, class or struct
   static if( is( mixin(m) == [interface/class/struct] ) )   // how can I
do this? I can't use mixin() here.


   // I have a scenario where I need to know if m is a function, and I
made it work using an ugly trick like this:
   static if( is( typeof( mixin( m ) ) ) ) // this works!
   {
     // here, I know that m is an instance of something, which means I can
alias it's typeof()
     alias typeof( mixin( m ) ) Type;

     // ... and life is good
     static if( is( Type == function ) )
     {
       ...
     }
   }

   // that construct doesn't work for definitions, like
interface/class/struct

 }
}

What can I do?
May 04, 2012
Re: allMembers
__traits(getMember, test.module, m);

should work.
May 04, 2012
Re: allMembers
On 4 May 2012 16:34, Adam D. Ruppe <destructionator@gmail.com> wrote:

> __traits(getMember, test.module, m);
>
> should work.
>

Tried that:

static if( is( __traits( getMember, mixin( moduleName ), m ) == interface )
)
{
pragma( msg, "Is an interface: " ~ m );
}
May 04, 2012
Re: allMembers
On 4 May 2012 17:01, Manu <turkeyman@gmail.com> wrote:

> On 4 May 2012 16:34, Adam D. Ruppe <destructionator@gmail.com> wrote:
>
>> __traits(getMember, test.module, m);
>>
>> should work.
>>
>
> Tried that:
>
> static if( is( __traits( getMember, mixin( moduleName ), m ) == interface
> ) )
> {
>   pragma( msg, "Is an interface: " ~ m );
> }
>

** accidental 'send' ** >_<

Fails:
 engine\bindings.d(399):basic type expected, not __traits
 engine\bindings.d(399):found '__traits' when expecting ')'
 engine\bindings.d(399):expression expected, not 'interface'
 engine\bindings.d(399):found ')' instead of statement
May 04, 2012
Re: allMembers
On Fri, May 04, 2012 at 05:03:36PM +0300, Manu wrote:
> On 4 May 2012 17:01, Manu <turkeyman@gmail.com> wrote:
> 
> > On 4 May 2012 16:34, Adam D. Ruppe <destructionator@gmail.com> wrote:
> >
> >> __traits(getMember, test.module, m);
> >>
> >> should work.
> >>
> >
> > Tried that:
> >
> > static if( is( __traits( getMember, mixin( moduleName ), m ) == interface
> > ) )
> > {
> >   pragma( msg, "Is an interface: " ~ m );
> > }
> >
> 
> ** accidental 'send' ** >_<
> 
> Fails:
>   engine\bindings.d(399):basic type expected, not __traits
>   engine\bindings.d(399):found '__traits' when expecting ')'
>   engine\bindings.d(399):expression expected, not 'interface'
>   engine\bindings.d(399):found ')' instead of statement

You're missing a typeof there. __traits(getMember,...) returns the
actual value of the member, not just its type.


T

-- 
Государство делает вид, что платит нам зарплату, а мы делаем вид, что работаем.
May 04, 2012
Re: allMembers
On 4 May 2012 17:09, H. S. Teoh <hsteoh@quickfur.ath.cx> wrote:

> On Fri, May 04, 2012 at 05:03:36PM +0300, Manu wrote:
> > On 4 May 2012 17:01, Manu <turkeyman@gmail.com> wrote:
> >
> > > On 4 May 2012 16:34, Adam D. Ruppe <destructionator@gmail.com> wrote:
> > >
> > >> __traits(getMember, test.module, m);
> > >>
> > >> should work.
> > >>
> > >
> > > Tried that:
> > >
> > > static if( is( __traits( getMember, mixin( moduleName ), m ) ==
> interface
> > > ) )
> > > {
> > >   pragma( msg, "Is an interface: " ~ m );
> > > }
> > >
> >
> > ** accidental 'send' ** >_<
> >
> > Fails:
> >   engine\bindings.d(399):basic type expected, not __traits
> >   engine\bindings.d(399):found '__traits' when expecting ')'
> >   engine\bindings.d(399):expression expected, not 'interface'
> >   engine\bindings.d(399):found ')' instead of statement
>
> You're missing a typeof there. __traits(getMember,...) returns the
> actual value of the member, not just its type.
>

Sorry, I meant to say above: I'm looking for _definitions_ (not
declarations), and not variables.
Top | Discussion index | About this forum | D home