describeCallable

Describes a callable

describeCallable
(
size_t overloadIndex = 0
)
()
if (
isCallable!T
)

Examples

It should describe a function with no params that returns void

1 void test() { }
2 
3 auto result = describeCallable!test;
4 
5 result.name.should.equal("test");
6 result.type.name.should.equal("pure nothrow @nogc @safe void()");
7 result.returns.name.should.equal("void");
8 result.parameters.length.should.equal(0);
9 result.location.file.should.equal("source/introspection/callable.d");
10 result.location.line.should.be.greaterThan(0);
11 result.location.column.should.equal(8);

It should describe a function with no params that returns ref int

1 int val = 0;
2 ref int test() { return val; }
3 
4 auto result = describeCallable!test;
5 
6 result.name.should.equal("test");
7 result.type.name.should.equal("pure nothrow @nogc ref @safe int()");
8 result.returns.name.should.equal("int");
9 result.parameters.length.should.equal(0);

It should describe a function with a parameter without a default value

1 int val = 0;
2 ref int test(string a) { return val; }
3 
4 auto result = describeCallable!test;
5 
6 result.parameters.length.should.equal(1);
7 result.parameters[0].name.should.equal("a");
8 result.parameters[0].type.name.should.equal("string");
9 result.parameters[0].default_.value.should.equal("");
10 result.parameters[0].default_.exists.should.equal(false);

It should describe a function with a parameter with a default value

1 int val = 0;
2 ref int test(string a = "test") { return val; }
3 
4 auto result = describeCallable!test;
5 
6 result.parameters.length.should.equal(1);
7 result.parameters[0].name.should.equal("a");
8 result.parameters[0].type.name.should.equal("string");
9 result.parameters[0].default_.value.should.equal(`"test"`);
10 result.parameters[0].default_.exists.should.equal(true);
11 
12 result.parameters[0].isLazy.should.equal(false);
13 result.parameters[0].isScope.should.equal(false);
14 result.parameters[0].isOut.should.equal(false);
15 result.parameters[0].isRef.should.equal(false);
16 result.parameters[0].isReturn.should.equal(false);

It should describe a function attributes

1 int attr(int) { return 0; }
2 
3 @("attribute1") @attr(1)
4 void test() { }
5 
6 auto result = describeCallable!test;
7 
8 result.attributes.length.should.equal(2);
9 result.attributes[0].name.should.equal(`"attribute1"`);
10 result.attributes[0].type.name.should.equal(`string`);
11 result.attributes[1].name.should.equal("0");
12 result.attributes[1].type.name.should.equal(`int`);

It should find the parameter storage classes

1 void test(scope Object, out int, ref int, lazy int, return Object) { }
2 
3 auto result = describeCallable!test;
4 
5 result.parameters[0].isScope.should.equal(true);
6 result.parameters[1].isOut.should.equal(true);
7 result.parameters[2].isRef.should.equal(true);
8 result.parameters[3].isLazy.should.equal(true);
9 result.parameters[4].isReturn.should.equal(true);

Meta