symmetryinvestments / autowrap

Wrap existing D code for use in Python, Excel, C#
BSD 3-Clause "New" or "Revised" License
80 stars 16 forks source link

length() method wrap does not handle alias this well #271

Open imzhaodong opened 3 years ago

imzhaodong commented 3 years ago

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.

atilaneves commented 3 years ago

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.

imzhaodong commented 3 years ago

If I can add extra code into this being wrapped class, will that help? Say add a length() function into it?

imzhaodong commented 3 years ago

Or is there a way I can let autowrap ignore generate len for this class?

imzhaodong commented 3 years ago

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