Browse Source

change domkit parent syntax parsing & handle parent arguments evaluation

Nicolas Cannasse 6 months ago
parent
commit
a9b8d3fd6f
3 changed files with 57 additions and 55 deletions
  1. 2 1
      hide/comp/CodeEditor.hx
  2. 6 11
      hide/comp/DomkitEditor.hx
  3. 49 43
      hrt/impl/DomkitViewer.hx

+ 2 - 1
hide/comp/CodeEditor.hx

@@ -166,7 +166,8 @@ class CodeEditor extends Component {
 	public function setError( msg : String, line : Int, pmin : Int, pmax : Int ) {
 		var linePos = code.substr(0,pmin).lastIndexOf("\n");
 		if( linePos < 0 ) linePos = 0 else linePos++;
-		var range = new monaco.Range(line,pmin + 1 - linePos,line,pmax + 2 - linePos);
+		var delta = pmin == pmax ? 2 : 1;
+		var range = new monaco.Range(line,pmin + 1 - linePos,line,pmax + delta - linePos);
 		currrentDecos = editor.deltaDecorations(currrentDecos,[
 			{ range : range, options : { inlineClassName: "codeErrorContentLine", isWholeLine : true } },
 			{ range : range, options : { linesDecorationsClassName: "codeErrorLine", inlineClassName: "codeErrorContent" } }

+ 6 - 11
hide/comp/DomkitEditor.hx

@@ -116,7 +116,7 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 				currentComponent = null;
 				switch( c.kind ) {
 				case Node(name):
-					var comp = resolveComp(name.split(":")[0]);
+					var comp = resolveComp(name);
 					if( comp != null && comp.classDef != null ) {
 						currentComponent = comp.classDef;
 						checker.setGlobals(comp.classDef, true);
@@ -376,7 +376,7 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 			case Node(null):
 				for( c in expr.children )
 					switch( c.kind ) {
-					case Node(n) if( n.split(":")[0] == name ): node = c;
+					case Node(n) if( n == name ): node = c;
 					default:
 					}
 			default:
@@ -538,17 +538,12 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 	static var IDENT = ~/^([A-Za-z_][A-Za-z0-9_]*)$/;
 
 	function defineComponent( name : String, e : domkit.MarkupParser.Markup, params : Map<String,Type> ) {
-		var parts = name.split(":");
 		var parent = null;
 		var c = components.get(name);
-		if( parts.length == 2 ) {
-			name = parts[0];
-			c = components.get(name);
-			parent = resolveComp(parts[1]);
-			if( parent == null ) {
-				var start = e.pmin + name.length + 1;
-				domkitError("Unknown parent component "+parts[1], start, start + parts[1].length);
-			}
+		if( e.parent != null ) {
+			parent = resolveComp(e.parent.name);
+			if( parent == null )
+				domkitError("Unknown parent component", e.parent.pmin, e.parent.pmax);
 		}
 		if( parent == null )
 			parent = components.get("flow");

+ 49 - 43
hrt/impl/DomkitViewer.hx

@@ -416,8 +416,6 @@ class DomkitViewer extends h2d.Object {
 				var m = expr.children[expr.children.length - i - 1];
 				switch( m.kind ) {
 				case Node(name):
-					var parts = name.split(":");
-					var name = parts[0];
 					mainComp = domkit.Component.get(name, true);
 					break;
 				default:
@@ -452,12 +450,10 @@ class DomkitViewer extends h2d.Object {
 			for( m in expr.children ) {
 				switch( m.kind ) {
 				case Node(name):
-					var parts = name.split(":");
-					var name = parts[0];
 					if( tmpCompMap.exists(name) )
 						error("Duplicate component "+name, m.pmin, m.pmax);
-					var parentType = parts[1] ?? "flow";
-					var compParent = resolveComponent(parentType, m.pmin);
+					var parentName = m.parent?.name ?? "flow";
+					var compParent = resolveComponent(parentName, m.pmin);
 					var comp = domkit.Component.get(name, true);
 					var inst : Dynamic = null;
 					if( comp == null ) {
@@ -473,7 +469,7 @@ class DomkitViewer extends h2d.Object {
 								try Reflect.setProperty(inst, f.name, f.value) catch( e : Dynamic ) {}
 						}
 					}
-					var args = [];
+					var argNames = [];
 					if( m.arguments != null ) {
 						for( arg in m.arguments ) {
 							switch( arg.value ) {
@@ -481,7 +477,7 @@ class DomkitViewer extends h2d.Object {
 								var code = parseCode(code.split(":")[0], arg.pmin);
 								switch( code.e ) {
 								case EIdent(a):
-									args.push(a);
+									argNames.push(a);
 									continue;
 								default:
 								}
@@ -490,7 +486,38 @@ class DomkitViewer extends h2d.Object {
 							error("Invalid argument decl", arg.pmin, arg.pmax);
 						}
 					}
-					var make = makeComponent.bind(res, m, comp, args, interp, inst);
+
+					function make( args : Array<Dynamic>, parent : h2d.Object ) : h2d.Object {
+						var prev = interp.variables.copy();
+						var obj = null;
+						handleErrors(res, function() {
+
+							if( args.length > 0 && argNames.length > 0 ) {
+								for( i => arg in argNames ) {
+									interp.variables.set(arg, args[i]);
+									if( inst != null )
+										try Reflect.setProperty(inst, arg, args[i]) catch( e : Dynamic ) {};
+								}
+							}
+
+							var fmake = tmpCompMap.get(comp.parent.name);
+							if( fmake == null ) fmake = compHooks.get(comp.parent.name);
+							if( fmake == null ) {
+								fmake = comp.parent.make;
+								args = evalArgs(interp, m.parent.arguments);
+							}
+							obj = fmake(args, parent);
+							if( obj.dom == null )
+								obj.dom = new domkit.Properties(obj, cast comp);
+							else
+								@:privateAccess obj.dom.component = cast comp;
+						});
+						for( c in m.children )
+							handleErrors(res, () -> addRec(c, interp, obj));
+						interp.variables = prev;
+						return obj;
+					}
+
 					tmpCompMap.set(name, make);
 					inf.comps.push(make);
 				default:
@@ -538,31 +565,6 @@ class DomkitViewer extends h2d.Object {
 		}
 	}
 
-	function makeComponent( res : hxd.res.Resource, m : Markup, comp : domkit.Component<Dynamic,Dynamic>, argNames : Array<String>, interp : DomkitInterp, inst : Dynamic, args : Array<Dynamic>, parent : h2d.Object ) : h2d.Object {
-		var prev = interp.variables.copy();
-		var obj = null;
-		handleErrors(res, function() {
-			var fmake = tmpCompMap.get(comp.parent.name);
-			if( fmake == null ) fmake = compHooks.get(comp.parent.name);
-			if( fmake == null ) fmake = comp.parent.make;
-			obj = fmake(args, parent);
-			if( obj.dom == null )
-				obj.dom = new domkit.Properties(obj, cast comp);
-			else
-				@:privateAccess obj.dom.component = cast comp;
-			if( args.length > 0 && argNames.length > 0 ) {
-				for( i => arg in argNames ) {
-					interp.variables.set(arg, args[i]);
-					if( inst != null ) try Reflect.setProperty(inst, arg, args[i]) catch( e : Dynamic ) {};
-				}
-			}
-		});
-		for( c in m.children )
-			handleErrors(res, () -> addRec(c, interp, obj));
-		interp.variables = prev;
-		return obj;
-	}
-
 	function resolveComponent( name : String, pmin : Int ) {
 		var comp = domkit.Component.get(name, true);
 		if( comp == null ) {
@@ -583,6 +585,18 @@ class DomkitViewer extends h2d.Object {
 		return comp;
 	}
 
+	function evalArgs( interp : DomkitInterp, args : Array<domkit.MarkupParser.Argument> ) : Array<Dynamic> {
+		return [for( a in args ) {
+			var v : Dynamic = switch( a.value ) {
+			case RawValue(v): v;
+			case Code(code):
+				var code = parseCode(code, a.pmin);
+				evalCode(interp, code);
+			}
+			v;
+		}];
+	}
+
 	function addRec( e : domkit.MarkupParser.Markup, interp : DomkitInterp, parent : h2d.Object ) {
 		switch( e.kind ) {
 		case Node(name):
@@ -592,15 +606,7 @@ class DomkitViewer extends h2d.Object {
 					return;
 			}
 			var comp = resolveComponent(name, e.pmin+1);
-			var args = [for( a in e.arguments ) {
-				var v : Dynamic = switch( a.value ) {
-				case RawValue(v): v;
-				case Code(code):
-					var code = parseCode(code, a.pmin);
-					evalCode(interp, code);
-				}
-				v;
-			}];
+			var args = evalArgs(interp, e.arguments);
 			var parentObj = cast(parent.dom?.contentRoot,h2d.Object) ?? parent;
 			var make = tmpCompMap.get(comp.name);
 			var obj = make != null ? make(args, parentObj) : comp.make(args, parentObj);