json2object icon indicating copy to clipboard operation
json2object copied to clipboard

Generic Maps not working with abstracts

Open haath opened this issue 2 years ago • 6 comments

// this works
var x: Array<Int>;

// this works
var y: MyArray<Int>;

// this does NOT work
var z: MyMap<Int>;

where

abstract MyArray<T>(Array<T>) { ... }
abstract MyMap<T>(Map<Int, T>) { ... }

Specifically the following error is thrown (once for every offending type):

Type not found : T

/haxelib/json2object/3,11,0/src/json2object/reader/DataBuilder.hx:961: lines 961-984 : ... Defined in this class

I'm assuming this is not intended since generic-array-abstracts work, but generic-map-abstracts don't?

haath avatar Aug 07 '23 14:08 haath

Generic array abstracts also break when the array is nested.

var arr: MyArray2D<Int>;

abstact MyArray2D<T>(Array<Array<T>>) { ... }

haath avatar Aug 07 '23 14:08 haath

There was indeed a problem with generic abstract types. I've pushed some changes, that should fix the problems raised by your small examples.

Can you confirm if it fixes the problem in your case ?

elnabo avatar Aug 08 '23 16:08 elnabo

Amazing! These work now:

abstract MyArray<T>(Array<T>) { ... }
abstract MyMap<T>(Map<Int, T>) { ... }
abstract MyNestedMap<T>(Map<Int, Map<Int, T>>) { ... }

But this still doesn't:

abstact MyArray2D<T>(Array<Array<T>>) { ... }

haath avatar Aug 09 '23 06:08 haath

I think I'm going to need more example for MyArray2D. Mine compile/parse without problem.

elnabo avatar Aug 26 '23 10:08 elnabo

Alright, I was able to narrow-down what exactly in my abstract was causing this issue. It turns out it was a @:from function.

Here is the smallest example that I can get the error with:

abstract MyArray2D<T>(Array<Array<T>>)
{
    @:from
    public static function fromArray<T>(arr: Array<Array<T>>): MyArray2D<T>
    {
        return cast arr;
    }
}

The error persists even if I add @:jignored to the function.

Only removing the @:from meta makes the error go away.

haath avatar Aug 28 '23 07:08 haath

Oh I see the problem. The from function is static, we can't apply the <T> from the abstract.

We'll have to see if we can infer it from the return value.

@:jignored only works on variables/properties.

elnabo avatar Aug 30 '23 09:08 elnabo