Skip to content

Commit da4bea6

Browse files
committed
fixed ENew and ensure exact type params count
1 parent 8467221 commit da4bea6

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

hscript/Checker.hx

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -422,12 +422,21 @@ class CheckerTypes {
422422
}
423423
var t = types.get(name);
424424
if( t == null ) return null;
425-
if( args == null ) args = [];
425+
inline function makeArgs(targs) {
426+
if( args == null )
427+
return targs;
428+
if( args.length != targs.length ) throw "Invalid type params for "+name;
429+
return args;
430+
}
426431
return switch( t ) {
427-
case CTClass(c): TInst(c,args);
428-
case CTEnum(e): TEnum(e,args);
429-
case CTTypedef(t): TType(t,args);
430-
case CTAbstract(a): TAbstract(a, args);
432+
case CTClass(c):
433+
TInst(c,makeArgs(c.params));
434+
case CTEnum(e):
435+
TEnum(e,makeArgs(e.params));
436+
case CTTypedef(t):
437+
TType(t,makeArgs(t.params));
438+
case CTAbstract(a):
439+
TAbstract(a,makeArgs(a.params));
431440
case CTAlias(t): t;
432441
}
433442
}
@@ -586,15 +595,15 @@ class Checker {
586595
return switch (t) {
587596
case CTPath(path, params):
588597
var params = params == null ? [] : [for( p in params ) makeType(p,e)];
589-
var ct = types.resolve(path.join("."),params);
598+
var ct = resolve(path.join("."),params,e);
590599
if( ct == null ) {
591600
// maybe a subtype that is public ?
592601
var pack = path.copy();
593602
var name = pack.pop();
594603
if( pack.length > 0 && pack[pack.length-1].charCodeAt(0) >= 'A'.code && pack[pack.length-1].charCodeAt(0) <= 'Z'.code ) {
595604
pack.pop();
596605
pack.push(name);
597-
ct = types.resolve(pack.join("."), params);
606+
ct = resolve(pack.join("."), params,e);
598607
}
599608
}
600609
if( ct == null ) {
@@ -892,6 +901,15 @@ class Checker {
892901
return typeEq(t1,t2);
893902
}
894903

904+
function resolve(name,params,pos:Expr) {
905+
try {
906+
return types.resolve(name,params);
907+
} catch( msg : String ) {
908+
error(msg, pos);
909+
return null;
910+
}
911+
}
912+
895913
public function unify( t1 : TType, t2 : TType, e : Expr ) {
896914
if( !tryUnify(t1,t2) && !abstractCast(t1,t2,e) )
897915
error(typeStr(t1)+" should be "+typeStr(t2),e);
@@ -1871,20 +1889,24 @@ class Checker {
18711889
case ENew(cl, params, targs):
18721890
if( !allowNew ) error("'new' is not allowed", expr);
18731891
var targs = targs == null ? null : [for( t in targs ) makeType(t,expr)];
1874-
var t = types.resolve(cl, targs);
1892+
var t = resolve(cl, targs, expr);
18751893
if( t == null ) error("Unknown class "+cl, expr);
18761894
var tparams = null, cst = null;
18771895
switch( t ) {
1878-
case TInst(c,args): targs = args; tparams = c.params; cst = c.constructor;
1896+
case TInst(c,args): tparams = c.params; cst = c.constructor;
18791897
#if hscriptPos
18801898
case TAbstract(a, args) if( a.constructor != null && patchAbstractAccess(expr,a,a.constructor.name,params) ):
1881-
targs = args; tparams = a.params;
1899+
tparams = a.params;
18821900
cst = a.constructor;
18831901
#end
18841902
default:
18851903
}
18861904
if( cst == null )
18871905
error(typeStr(t)+" cannot be constructed", expr);
1906+
if( targs == null ) {
1907+
targs = [for( i in 0...tparams.length ) makeMono()];
1908+
t = apply(t,tparams,targs);
1909+
}
18881910
switch( cst.t ) {
18891911
case TFun(args, _):
18901912
var mf = [for( c in cst.params ) makeMono()];

0 commit comments

Comments
 (0)