@@ -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