qualified type names for mixins

Jonathan Marler via Digitalmars-d digitalmars-d at puremagic.com
Thu Jun 15 12:15:55 PDT 2017


I've found that the fullyQualifiedName template in std.traits is 
a good tool for creating mixin code, however, it doesn't always 
work.

-----
import std.traits;

struct GlobalFoo
{
     int x;
}

// WORKS
mixin(fullyQualifiedName!GlobalFoo ~ " globalFoo;");

unittest
{
     static struct Foo
     {
         int x;
     }
     // Error: no property 'Foo' for type 'void'
     mixin(fullyQualifiedName!Foo ~ " foo;");
}

void main()
{
     static struct Foo
     {
         int x;
     }
     // Error: no property 'Foo' for type 'void'
     mixin(fullyQualifiedName!Foo ~ " foo;"); // Error: no 
property 'Foo' for type 'void'
}
-----

The problem in the example is that you can't access the Foo 
struct outside the unittest/main function, even if you have a 
qualified name.  I'm wondering if adding support for cases like 
this should be considered?  Should you be able to access types 
defined inside a unittests/functions?

Another idea to help with this would be to add a new template to 
phobos, relativeQualifiedName.  This would take the current 
context into account and remove that from the fullyQualifiedName.

module foo;

struct baz
{
      void bar()
      {
          struct bon
          {
          }
          assert(fullyQualifiedName!bon == "foo.baz.bar.bon");
          assert(relativeQualifiedName!bon == "bon");
      }
}

I've thought about how to implement this but haven't figured out 
a good way.  I had something like the following in mind:

template relativeQualifiedName(T)
{
     string relativeQualifiedName(string context = 
__QUALIFIED_NAME_CONTEXT__)
     {
         return fullyQualifiedName!T[context.length+1..$];
     }
}

Of course, __QUALIFIED_NAME_CONTEXT__does not exist in the 
langauge so this wouldn't work. Any thoughts/suggestions?  Can 
someone think of a way to implement relativeQualifiedName?






More information about the Digitalmars-d mailing list