describeTemplate

Describes a template

describeTemplate
()
()
if (
__traits(isTemplate, T)
)

Examples

It should describe the template name and parameters

template foo(T) {
  alias foo = string;
}

auto result = describeTemplate!foo;

result.name.should.equal("foo");
result.parameters.length.should.equal(0);

result.templateParameters.length.should.equal(1);
result.templateParameters[0].name.should.equal("T");
result.templateParameters[0].original.should.equal("T");
result.templateParameters[0].type.should.equal("");
result.templateParameters[0].defaultValue.should.equal("");
result.templateParameters[0].isVariadic.should.equal(false);

result.protection.should.equal(Protection.public_);

result.location.file.should.equal("source/introspection/template_.d");
result.location.line.should.be.greaterThan(0);
result.location.column.should.equal(3);

It should describe a templated function

void foo(T)(T param) { }

auto result = describeTemplate!foo;

result.name.should.equal("foo");
result.templateParameters.length.should.equal(1);

result.templateParameters[0].name.should.equal("T");
result.templateParameters[0].original.should.equal("T");
result.templateParameters[0].type.should.equal("");
result.templateParameters[0].defaultValue.should.equal("");
result.templateParameters[0].isVariadic.should.equal(false);

result.parameters.length.should.equal(1);
result.parameters[0].name.should.equal("param");
result.parameters[0].original.should.equal("T param");
result.parameters[0].type.should.equal("T");
result.parameters[0].defaultValue.should.equal("");
result.parameters[0].isVariadic.should.equal(false);

It should describe a templated function with default values

void foo(T = int)(T param) { }

auto result = describeTemplate!foo;

result.name.should.equal("foo");
result.templateParameters.length.should.equal(1);

result.templateParameters[0].name.should.equal("T");
result.templateParameters[0].defaultValue.should.equal("int");
result.templateParameters[0].original.should.equal("T = int");
result.templateParameters[0].type.should.equal("");
result.templateParameters[0].isVariadic.should.equal(false);

result.parameters.length.should.equal(1);
result.parameters[0].name.should.equal("param");
result.parameters[0].original.should.equal("T param");
result.parameters[0].type.should.equal("T");
result.parameters[0].defaultValue.should.equal("");
result.parameters[0].isVariadic.should.equal(false);

It should describe a templated function with a numeric parameter and variadic parameters

void foo(int a = 3, T...)(int b) if(T.length > 1) { }

auto result = describeTemplate!foo;

result.name.should.equal("foo");
result.templateParameters.length.should.equal(2);

result.templateParameters[0].name.should.equal("a");
result.templateParameters[0].defaultValue.should.equal("3");
result.templateParameters[0].original.should.equal("int a = 3");
result.templateParameters[0].type.should.equal("int");
result.templateParameters[0].isVariadic.should.equal(false);

result.templateParameters[1].name.should.equal("T");
result.templateParameters[1].defaultValue.should.equal("");
result.templateParameters[1].original.should.equal("T...");
result.templateParameters[1].type.should.equal("");
result.templateParameters[1].isVariadic.should.equal(true);

result.parameters.length.should.equal(1);
result.parameters[0].name.should.equal("b");
result.parameters[0].original.should.equal("int b");
result.parameters[0].type.should.equal("int");
result.parameters[0].defaultValue.should.equal("");
result.parameters[0].isVariadic.should.equal(false);

It should describe a templated class with a numeric parameter and variadic parameters

class Foo(int a = 3, T...) {
  void bar() {}
}

auto result = describeTemplate!Foo;

result.name.should.equal("Foo");
result.templateParameters.length.should.equal(2);

result.templateParameters[0].name.should.equal("a");
result.templateParameters[0].defaultValue.should.equal("3");
result.templateParameters[0].original.should.equal("int a = 3");
result.templateParameters[0].type.should.equal("int");
result.templateParameters[0].isVariadic.should.equal(false);

result.templateParameters[1].name.should.equal("T");
result.templateParameters[1].defaultValue.should.equal("");
result.templateParameters[1].original.should.equal("T...");
result.templateParameters[1].type.should.equal("");
result.templateParameters[1].isVariadic.should.equal(true);

Meta