autowrap
autowrap copied to clipboard
length() method wrap does not handle alias this well
When I wrap a simple class like this:
struct ProductType
{
string value;
alias value this;
}
wrapAggregate!(ProductType);
The compiler report error: ../../.dub/packages/autowrap-0.6.2/autowrap/pyd/source/autowrap/python/wrap.d(266,25): Error: no property length for type symmetry.carbon.client.CarbonClient.ProductType ../../.dub/packages/autowrap-0.6.2/autowrap/pyd/source/autowrap/python/wrap.d(98,9): Error: template instance autowrap.python.wrap.Lengths!(ProductType) error instantiating source/symmetry/carbon/pyd_manual.d(47,5): instantiated from here: wrapAggregate!(ProductType)
Here is the relevant code at file pyd/source/autowrap/python/wrap.d line 266
261 private template Lengths(T) {
262 import pyd.pyd: Len;
263 import std.meta: AliasSeq;
264
265 static if(is(typeof(T.init.length)))
266 alias Lengths = Len!(T.length);
267 else
268 alias Lengths = AliasSeq!();
269 }
So we can see the compiler complain for line 266 that it cannot find length method for T. I think this is because the alias this confused compiler. And there should be a simple solution I think, in this case we do not even need len() python method in the worst case.
Unfortunately, this is a pyd limitation. It's true that autowrap isn't doing the right thing, but it's also true that it's impossible to do the right thing with pyd's current API.
If I can add extra code into this being wrapped class, will that help? Say add a length() function into it?
Or is there a way I can let autowrap ignore generate len for this class?
Daniel Zhao 10:57 AM If I can add extra code into this being wrapped class, will that help? Say add a length() function into it? Or is there a way I can let autowrap ignore generate len for this class?
atilaneves 6:48 PM Yes, that would do it Adding length