@@ -434,10 +434,6 @@ class Checker {
434434 return globals ;
435435 }
436436
437- public dynamic function onTopDownEnum ( en : CEnum , field : String ) {
438- return false ;
439- }
440-
441437 function typeArgs ( args : Array <Argument >, pos : Expr ) {
442438 return [for ( i in 0 ... args .length ) {
443439 var a = args [i ];
@@ -1209,31 +1205,29 @@ class Checker {
12091205 return TDynamic ;
12101206 default :
12111207 #if hscriptPos
1212- switch ( withType ) {
1208+ var wt = switch ( withType ) { case WithType (t ): follow (t ); default : null ; };
1209+ switch ( wt ) {
1210+ case null :
12131211 // enum constructor resolution
1214- case WithType ( et = TEnum (e , args ) ):
1212+ case TEnum (e , args ):
12151213 for ( c in e .constructors )
12161214 if ( c .name == name ) {
1217- if ( onTopDownEnum (e ,name ) ) { // deprecated
1218- var ct = c .args == null ? et : TFun (c .args , et );
1219- return apply (ct , e .params , args );
1220- }
1221- var acc = getTypeAccess (et , expr , name );
1215+ var acc = getTypeAccess (wt , expr , name );
12221216 if ( acc != null ) {
12231217 expr .e = acc ;
1224- var ct = c .args == null ? et : TFun (c .args , et );
1218+ var ct = c .args == null ? wt : TFun (c .args , wt );
12251219 return apply (ct , e .params , args );
12261220 }
12271221 break ;
12281222 }
12291223 // abstract enum resolution
1230- case WithType ( at = TAbstract (a , args ) ) if ( hasMeta (a .meta ," :enum" ) ):
1224+ case TAbstract (a , args ) if ( hasMeta (a .meta ," :enum" ) ):
12311225 var f = a .impl .statics .get (name );
12321226 if ( f != null && hasMeta (f .meta ," :enum" ) ) {
12331227 var acc = getTypeAccess (TInst (a .impl ,[]),expr ,name );
12341228 if ( acc != null ) {
12351229 expr .e = acc ;
1236- return at ;
1230+ return wt ;
12371231 }
12381232 }
12391233 default :
@@ -1617,6 +1611,14 @@ class Checker {
16171611 error (" Cannot compare " + typeStr (t1 ), expr );
16181612 }
16191613 return TBool ;
1614+ case " ??" :
1615+ var t1 = typeExpr (e1 ,withType );
1616+ var t2 = typeExpr (e2 ,WithType (t1 ));
1617+ if ( tryUnify (t2 ,t1 ) )
1618+ return t1 ;
1619+ if ( tryUnify (t1 ,t2 ) )
1620+ return t2 ;
1621+ unify (t2 ,t1 ,e2 ); // error
16201622 default :
16211623 if ( op .charCodeAt (op .length - 1 ) == " =" .code ) {
16221624 var t = typeExpr (mk (EBinop (op .substr (0 ,op .length - 1 ),e1 ,e2 ),expr ),withType );
0 commit comments