Parcourir la source

support for key=>value iterator type check

ncannasse il y a 3 mois
Parent
commit
aabdf15394
1 fichiers modifiés avec 21 ajouts et 5 suppressions
  1. 21 5
      hide/comp/DomkitEditor.hx

+ 21 - 5
hide/comp/DomkitEditor.hx

@@ -716,18 +716,34 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 				checkDMLRec(c);
 		case For(cond):
 			var expr = parseCode("for"+cond+"{}", e.pmin);
+			inline function restore(v,t) {
+				@:privateAccess if( t == null ) checker.locals.remove(v) else checker.locals.set(v, t);					
+			}
 			switch( expr.e ) {
 			case EFor(n,it,_): @:privateAccess {
-				var et = checker.getIteratorType(expr,checker.typeExpr(it,Value));
+				var et = checker.getIteratorType(checker.typeExpr(it,Value),it);
 				var prev = checker.locals.get(n);
 				checker.locals.set(n, et);
 				for( c in e.children )
 					checkDMLRec(c);
-				if( prev == null )
-					checker.locals.remove(n);
-				else
-					checker.locals.set(n, prev);
+				restore(n, prev);
 			}
+			case EForGen(it,_):
+				hscript.Tools.getKeyIterator(it, function(vk,vv,it) @:privateAccess {
+					if( vk == null ) {
+						domkitError("Invalid for block", e.pmin);
+						return;
+					}
+					var types = checker.getKeyIteratorTypes(checker.typeExpr(it,Value),it);
+					var prevKey = checker.locals.get(vk);
+					var prevValue = checker.locals.get(vv);
+					checker.locals.set(vk, types.key);
+					checker.locals.set(vv, types.value);
+					for( c in e.children )
+						checkDMLRec(c);
+					restore(vk, prevKey);
+					restore(vv, prevValue);
+				});
 			default:
 				domkitError("Invalid for block", e.pmin);
 			}