From 514ce9eec2dff71a33754cb8c3c2b1c03a025da9 Mon Sep 17 00:00:00 2001 From: ncannasse Date: Fri, 21 Sep 2018 10:47:30 +0200 Subject: [PATCH] more type checks --- hscript/Checker.hx | 51 +++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/hscript/Checker.hx b/hscript/Checker.hx index 9de1e4c..2bcb03e 100644 --- a/hscript/Checker.hx +++ b/hscript/Checker.hx @@ -14,6 +14,7 @@ enum TType { TInst( c : CClass, args : Array ); TEnum( e : CEnum, args : Array ); TType( t : CTypedef, args : Array ); + TAbstract( t : CAbstract, args : Array ); TFun( args : Array<{ name : String, opt : Bool, t : TType }>, ret : TType ); TAnon( fields : Array<{ name : String, opt : Bool, t : TType }> ); } @@ -29,11 +30,15 @@ enum CTypedecl { CTEnum( e : CEnum ); CTTypedef( t : CTypedef ); CTAlias( t : TType ); + CTAbstract( a : CAbstract ); } -typedef CClass = { +typedef CNamedType = { var name : String; var params : Array; +} + +typedef CClass = {> CNamedType, @:optional var superClass : TType; @:optional var constructor : CField; var fields : Map; @@ -47,18 +52,17 @@ typedef CField = { var t : TType; } -typedef CEnum = { - var name : String; - var params : Array; +typedef CEnum = {> CNamedType, var constructors : Map; } -typedef CTypedef = { - var name : String; - var params : Array; +typedef CTypedef = {> CNamedType, var t : TType; } +typedef CAbstract = {> CNamedType, +} + @:allow(hscript.Checker) class CheckerTypes { @@ -164,19 +168,17 @@ class CheckerTypes { types.set(t.path, CTTypedef(td)); case TAbstractdecl(a): if( types.exists(a.path) ) return; - var td : CEnum = { + var ta : CAbstract = { name : a.path, params : [], - constructors : new Map(), }; for( p in a.params ) - td.params.push(TParam(p)); + ta.params.push(TParam(p)); todo.push(function() { - localParams = [for( t in td.params ) a.path+"."+Checker.typeStr(t) => t]; - //td.t = makeXmlType(a.athis); + localParams = [for( t in ta.params ) a.path+"."+Checker.typeStr(t) => t]; localParams = null; }); - types.set(a.path, CTEnum(td)); + types.set(a.path, CTAbstract(ta)); } } @@ -227,6 +229,7 @@ class CheckerTypes { case CTClass(c): TInst(c,args); case CTEnum(e): TEnum(e,args); case CTTypedef(t): TType(t,args); + case CTAbstract(a): TAbstract(a, args); case CTAlias(t): t; } } @@ -306,6 +309,7 @@ class Checker { case TInst(c, args): c.name + makeArgs(args); case TEnum(e, args): e.name + makeArgs(args); case TType(t, args): t.name + makeArgs(args); + case TAbstract(a, args): a.name + makeArgs(args); case TFun(args, ret): "(" + [for( a in args ) (a.opt?"?":"")+(a.name == "" ? "" : a.name+":")+typeStr(a.t)].join(", ")+") -> "+typeStr(ret); case TAnon(fields): "{" + [for( f in fields ) (f.opt?"?":"")+f.name+":"+typeStr(f.t)].join(", ")+"}"; case TParam(name): name; @@ -321,7 +325,7 @@ class Checker { case TMono(r): if( r.r == null ) return false; return linkLoop(a,r.r); - case TEnum(_,tl), TInst(_,tl), TType(_,tl): + case TEnum(_,tl), TInst(_,tl), TType(_,tl), TAbstract(_,tl): for( t in tl ) if( linkLoop(a,t) ) return true; @@ -393,6 +397,11 @@ class Checker { if( !typeEq(pl1[i],pl2[i]) ) return false; return true; + case [TAbstract(a1,pl1), TAbstract(a2,pl2)] if( a1 == a2 ): + for( i in 0...pl1.length ) + if( !typeEq(pl1[i],pl2[i]) ) + return false; + return true; case [TNull(t1), TNull(t2)]: return typeEq(t1,t2); case [TFun(args1,r1), TFun(args2,r2)] if( args1.length == args2.length ): @@ -440,16 +449,6 @@ class Checker { return tryUnify(apply(t1.t, t1.params, pl1), t2); case [_,TType(t2,pl2)]: return tryUnify(t1, apply(t2.t, t2.params, pl2)); - case [TInst(cl1,pl1), TInst(cl2,pl2)] if( cl1 == cl2 ): - for( i in 0...pl1.length ) - if( !typeEq(pl1[i],pl2[i]) ) - return false; - return true; - case [TEnum(e1,pl1), TEnum(e2,pl2)] if( e1 == e2 ): - for( i in 0...pl1.length ) - if( !typeEq(pl1[i],pl2[i]) ) - return false; - return true; case [TNull(t1), _]: return tryUnify(t1,t2); case [_, TNull(t2)]: @@ -479,9 +478,11 @@ class Checker { return true; case [TInt, TFloat]: return true; + case [TFun(_), TAbstract({ name : "haxe.Function" },_)]: + return true; default: } - return false; + return typeEq(t1,t2); } function unify( t1 : TType, t2 : TType, e : Expr ) {