浏览代码

allow to declare type in component argument

Nicolas Cannasse 7 月之前
父节点
当前提交
afc4a17423
共有 1 个文件被更改,包括 33 次插入4 次删除
  1. 33 4
      hide/comp/DomkitEditor.hx

+ 33 - 4
hide/comp/DomkitEditor.hx

@@ -391,6 +391,16 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 		return parser.parseString(code, pos);
 	}
 
+	function parseType( tstr : String, pos : Int ) {
+		var parser = new hscript.Parser();
+		parser.allowTypes = true;
+		var expr = parser.parseString("(x:"+tstr+")", pos - 3 );
+		return switch( expr.e ) {
+		case ECheckType(_,t): @:privateAccess checker.makeType(t, expr);
+		default: throw "assert";
+		}
+	}
+
 	function typeCode( code : String, pos : Int ) : Type {
 		var e = parseCode(code, pos);
 		return @:privateAccess checker.typeExpr(e, Value);
@@ -519,19 +529,36 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 		else {
 			c.arguments = [];
 			for( a in e.arguments ) {
+				var type = null;
 				var name = switch( a.value ) {
-				case Code(c) if( IDENT.match(c) ): c;
+				case Code(c) if( IDENT.match(c) ):
+					c;
+				case Code(c):
+					var parts = c.split(":");
+					var p0len = parts[0].length;
+					var name = StringTools.trim(parts.shift());
+					if( !IDENT.match(name) )
+						null;
+					else {
+						type = parseType(parts.join(":"),a.pmin + p0len);
+						name;
+					}
 				default:
+					null;
+				}
+				if( name == null ) {
 					domkitError("Invalid parameter", a.pmin, a.pmax);
 					continue;
 				}
-				var t = params.get(name);
-				if( t == null )
+				if( type == null )
+					type = params.get(name);
+				if( type == null )
 					domkitError("Unknown parameter type", a.pmin, a.pmax);
 				c.arguments.push({
 					name : name,
-					t : t,
+					t : type,
 				});
+				@:privateAccess checker.locals.set(name, type);
 			}
 		}
 		if( e.condition != null )
@@ -547,9 +574,11 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 			for( c in e.children )
 				checkDMLRec(c,isRoot);
 		case Node(name) if( isRoot ):
+			var prev = @:privateAccess checker.locals.copy();
 			defineComponent(name, e, params);
 			for( c in e.children )
 				checkDMLRec(c);
+			@:privateAccess checker.locals = prev;
 		case Node(name):
 			var c = resolveComp(name);
 			if( c == null )