Allow for typemaps that reduce everything except null.

This commit is contained in:
Juraj Kirchheim
2020-04-24 15:29:24 +02:00
parent 34516086c9
commit e3bac681ce
3 changed files with 53 additions and 15 deletions

View File

@@ -8,14 +8,33 @@ import haxe.macro.Type;
using tink.MacroApi;
class TypeMap<V> extends BalancedTree<Type, V> implements IMap<Type, V> {
var follow:Bool;
public function new(?noFollow:Bool) {
this.follow = noFollow != true;
var normalize:Type->Type;
public function new(?normalize:Type->Type) {
this.normalize = switch normalize {
case null: function (t) return t.reduce();
case fn: fn;
}
super();
}
override function compare(k1:Type, k2:Type):Int
return k1.compare(k2, follow);
return normalize(k1).compare(normalize(k2), false);
static public function noFollow(t:Type)
return t;
static public function keepNull(t:Type):Type
return switch t {
case TAbstract(_.get() => { name: 'Null', pack: [] }, [t])
#if !haxe4 | TType(_.get() => { name: 'Null', pack: []}, [t]) #end
:
var ct = keepNull(t).toComplex({ direct: true });
(macro : Null<$ct>).toType().sure();
case TLazy(f): keepNull(f());
case TType(_, _): keepNull(Context.follow(t, true));
default: t;
}
}