Переглянути джерело

fix context evaluation and single component dml

Nicolas Cannasse 7 місяців тому
батько
коміт
4756c045a7
3 змінених файлів з 49 додано та 15 видалено
  1. 5 6
      hide/comp/DomkitEditor.hx
  2. 2 0
      hide/view/Domkit.hx
  3. 42 9
      hrt/impl/DomkitViewer.hx

+ 5 - 6
hide/comp/DomkitEditor.hx

@@ -108,10 +108,6 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 		var parser = new domkit.MarkupParser();
 		parser.allowRawText = true;
 		var expr = parser.parse(dmlCode,filePath, position);
-		switch( expr.kind ) {
-		case Node(null) if( expr.children.length == 1 ): expr = expr.children[0];
-		default:
-		}
 		try {
 			for( c in expr.children ) {
 				var prev = @:privateAccess checker.locals.copy();
@@ -760,8 +756,11 @@ class DomkitEditor extends CodeEditor {
 	}
 
 	public function getComponent() {
-		var compReg = ~/<([A-Za-z0-9_]+)/;
-		if( !compReg.match(code) )
+		var compReg = ~/<\/([A-Za-z0-9_-]+)/;
+		var last = code.lastIndexOf("</");
+		if( last < 0 )
+			return null;
+		if( !compReg.match(code.substr(last)) )
 			return null;
 		var name = compReg.matched(1);
 		return checker.components.get(name);

+ 2 - 0
hide/view/Domkit.hx

@@ -104,6 +104,8 @@ class Domkit extends FileView {
 		var allParams = new Map();
 		dmlEditor.checker.params = allParams;
 		var comp = dmlEditor.getComponent();
+		if( comp != null && comp.classDef != null )
+			paramsEditor.checker.checker.setGlobals(comp.classDef, true);
 		paramsEditor.doCheckScript();
 		var checker = cast(paramsEditor.checker,hide.comp.DomkitEditor.DomkitChecker);
 		var tparams = try @:privateAccess checker.typeCode(paramsEditor.code,0) catch( e : hscript.Expr.Error ) null;

+ 42 - 9
hrt/impl/DomkitViewer.hx

@@ -366,7 +366,7 @@ class DomkitViewer extends h2d.Object {
 	function loadComponents( res : hxd.res.Resource ) {
 		var fullText = res.entry.getText();
 		var data = DomkitFile.parse(fullText);
-		var inf = { comps : [], params : null };
+		var inf = { comps : [], params : (null:Dynamic) };
 		handleErrors(res, function() {
 			var parser = new domkit.MarkupParser();
 			parser.allowRawText = true;
@@ -384,13 +384,44 @@ class DomkitViewer extends h2d.Object {
 					}
 				}
 			}
-			var vparams : Dynamic = evalCode(interp,eparams);
-			if( vparams != null ) {
-				for( f in Reflect.fields(vparams) ) {
-					var forceNull = res == resource && definedClasses.indexOf(f) >= 0;
-					interp.variables.set(f, forceNull ? null : Reflect.field(vparams,f));
+			var mainComp = null;
+			for( i in 0...expr.children.length ) {
+				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:
 				}
 			}
+
+			var prev = interp.variables.copy();
+			var mainInst : Dynamic = null;
+			if( mainComp != null ) {
+				var cl = @:privateAccess mainComp.classValue;
+				if( cl != null ) {
+					mainInst = Type.createEmptyInstance(cl);
+					interp.setContext(mainInst);
+				}
+			}
+			var vparams = switch( eparams.e ) {
+			case EObject(fl):
+				[for( f in fl ) {
+					var val : Dynamic = evalCode(interp,f.e);
+					var forceNull = res == resource && definedClasses.indexOf(f.name) >= 0;
+					if( forceNull ) val = null;
+					interp.variables.set(f.name, val);
+					if( mainInst != null ) try Reflect.setProperty(mainInst,f.name, val) catch( e : Dynamic ) {};
+					{ name : f.name, value : val };
+				}];
+			default: throw "assert";
+			}
+			interp.variables = prev;
+			for( f in vparams )
+				interp.variables.set(f.name, f.value);
+
 			for( m in expr.children ) {
 				switch( m.kind ) {
 				case Node(name):
@@ -411,8 +442,8 @@ class DomkitViewer extends h2d.Object {
 						if( compClass != null ) {
 							inst = Type.createEmptyInstance(compClass);
 							interp.setContext(inst);
-							for( f in Reflect.fields(vparams) )
-								try Reflect.setProperty(inst, f, Reflect.field(vparams,f)) catch( e : Dynamic ) {}
+							for( f in vparams )
+								try Reflect.setProperty(inst, f.name, f.value) catch( e : Dynamic ) {}
 						}
 					}
 					var args = [];
@@ -438,7 +469,9 @@ class DomkitViewer extends h2d.Object {
 				default:
 				}
 			}
-			inf.params = vparams;
+			inf.params = {};
+			for( v in vparams )
+				Reflect.setField(inf.params, v.name, v.value);
 		});
 		return inf;
 	}