Browse Source

added enums in DML/Params support

Nicolas Cannasse 7 months ago
parent
commit
0e9e052692
3 changed files with 50 additions and 9 deletions
  1. 23 7
      hide/comp/DomkitEditor.hx
  2. 3 0
      hide/view/Domkit.hx
  3. 24 2
      hrt/impl/DomkitViewer.hx

+ 23 - 7
hide/comp/DomkitEditor.hx

@@ -53,6 +53,7 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 	var t_string : Type;
 	var parsers : Array<domkit.CssValue.ValueParser>;
 	var lastVariables : Map<String, domkit.CssValue> = new Map();
+	public var usedEnums : Array<{ path : String, constrs : Array<String> }> = [];
 	public var params : Map<String, Type> = new Map();
 	public var components : Map<String, TypedComponent>;
 	public var properties : Map<String, Array<TypedProperty>>;
@@ -60,6 +61,7 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 
 	public function new(config) {
 		super(config,"domkit");
+		checker.onTopDownEnum = onEnumUsed;
 		parsers = [new h2d.domkit.BaseComponents.CustomParser()];
 		var dcfg : Array<String> = config.get("domkit.parsers");
 		if( dcfg != null ) {
@@ -74,6 +76,20 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 		}
 	}
 
+	function onEnumUsed(e:hscript.Checker.CEnum,f:String) {
+		for( e2 in usedEnums )
+			if( e2.path == e.name ) {
+				if( e2.constrs.indexOf(f) < 0 ) {
+					e2.constrs.push(f);
+					e2.constrs.sort(Reflect.compare);
+				}
+				return true;
+			}
+		usedEnums.push({ path : e.name, constrs : [f] });
+		usedEnums.sort(function(e1,e2) return Reflect.compare(e1.path,e2.path));
+		return true;
+	}
+
 	override function initTypes() {
 		if( !super.initTypes() )
 			return false;
@@ -401,9 +417,9 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 		}
 	}
 
-	function typeCode( code : String, pos : Int ) : Type {
+	function typeCode( code : String, pos : Int, ?et ) : Type {
 		var e = parseCode(code, pos);
-		return @:privateAccess checker.typeExpr(e, Value);
+		return @:privateAccess checker.typeExpr(e, et == null ? Value : WithType(et));
 	}
 
 	function unify( t1 : Type, t2 : Type, comp : TypedComponent, prop : String, pos : { pmin : Int, pmax : Int } ) {
@@ -589,7 +605,7 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 					domkitError("Too many arguments (require "+[for( a in c.arguments ) a.name].join(",")+")",a.pmin,a.pmax);
 				var t = switch( a.value ) {
 				case RawValue(_): t_string;
-				case Code(code): typeCode(code, a.pmin);
+				case Code(code): typeCode(code, a.pmin, arg.t);
 				};
 				unify(t, arg.t, c, arg.name, a);
 			}
@@ -648,22 +664,22 @@ class DomkitChecker extends ScriptEditor.ScriptChecker {
 						domkitError(c.name+" does not have property "+a.name, a.pmin, a.pmax);
 					var pt = switch( a.value ) {
 					case RawValue(_): t_string;
-					case Code(code): typeCode(code, a.vmin);
+					case Code(code): typeCode(code, a.vmin, t);
 					}
-					unify(t, pt, c, a.name, a);
+					unify(pt, t, c, a.name, a);
 					continue;
 				}
 				switch( a.value ) {
 				case RawValue(str):
 					typeProperty(pname, a.vmin, a.pmax, new domkit.CssParser().parseValue(str), c);
 				case Code(code):
-					var t = typeCode(code, a.vmin);
+					var t = typeCode(code, a.vmin, p.type);
 					unify(t, p.type, c, pname, a);
 				}
 			}
 			if( e.condition != null ) {
 				var cond = e.condition;
-			 	var t = typeCode(cond.cond, cond.pmin);
+			 	var t = typeCode(cond.cond, cond.pmin, TBool);
 				unify(t, TBool, c, "if", cond);
 			}
 			for( c in e.children )

+ 3 - 0
hide/view/Domkit.hx

@@ -39,6 +39,7 @@ class Domkit extends FileView {
 		dmlEditor = new hide.comp.DomkitEditor(config, DML, data.dml, element.find(".dmlEditor"));
 		cssEditor = new hide.comp.DomkitEditor(config, Less, data.css, dmlEditor.checker, element.find(".cssEditor"));
 		checker = new hide.comp.DomkitEditor.DomkitChecker(config);
+		dmlEditor.checker.checker.onTopDownEnum = checker.checker.onTopDownEnum;
 		paramsEditor = new hide.comp.ScriptEditor(data.params, checker, element.find(".paramsEditor"));
 		paramsEditor.saveOnBlur = false;
 		cssEditor.onChanged = dmlEditor.onChanged = paramsEditor.onChanged = check;
@@ -97,6 +98,7 @@ class Domkit extends FileView {
 	}
 
 	function check() {
+		checker.usedEnums = [];
 		modified = prevSave.css != cssEditor.code || prevSave.dml != dmlEditor.code || prevSave.params != paramsEditor.code;
 		defineGlobals(); // redefine if types have been reloaded
 		var allParams = new Map();
@@ -154,6 +156,7 @@ class Domkit extends FileView {
 			css : trimSpaces(cssEditor.code),
 			dml : trimSpaces(dmlEditor.code),
 			params : trimSpaces(paramsEditor.code),
+			enums : checker.usedEnums.length == 0 ? null : haxe.Json.stringify(checker.usedEnums),
 		};
 		var str = hrt.impl.DomkitViewer.toStr(data);
 		prevSave = data;

+ 24 - 2
hrt/impl/DomkitViewer.hx

@@ -262,6 +262,8 @@ class DomkitViewer extends h2d.Object {
 		var parts = ['<css>\n${data.css}\n</css>'];
 		if( data.params != '' && data.params != '{}' )
 			parts.push('<params>\n${data.params}\n</params>');
+		if( data.enums != null )
+			parts.push('<enums>\n${data.enums}\n</enums>');
 		parts.push(data.dml);
 		return parts.join('\n\n');
 	}
@@ -355,6 +357,17 @@ class DomkitViewer extends h2d.Object {
 			var eparams = parseCode(data.params, fullText.indexOf(data.params));
 			var expr = parser.parse(data.dml,res.entry.path, fullText.indexOf(data.dml));
 			var interp = makeInterp();
+			if( data.enums != null ) {
+				var enums : Array<{ path : String, constrs : Array<String> }> = haxe.Json.parse(data.enums);
+				for( e in enums ) {
+					var en = Type.resolveEnum(e.path);
+					if( en == null ) continue;
+					for( c in e.constrs ) {
+						var f : Dynamic = try Type.createEnum(en, c) catch( e : Dynamic ) Reflect.makeVarArgs((args) -> Type.createEnum(en,c,args));
+						if( f != null && !interp.variables.exists(c) ) interp.variables.set(c, f);
+					}
+				}
+			}
 			var vparams : Dynamic = evalCode(interp,eparams);
 			if( vparams != null ) {
 				for( f in Reflect.fields(vparams) ) {
@@ -427,7 +440,7 @@ class DomkitViewer extends h2d.Object {
 		}
 	}
 
-	inline function handleErrors( res : hxd.res.Resource, callb ) {
+	function handleErrors( res : hxd.res.Resource, callb ) {
 		try {
 			callb();
 		} catch( e : domkit.Error ) {
@@ -612,7 +625,7 @@ class DomkitStyle extends h2d.domkit.Style {
 
 #end
 
-typedef DomkitFileData = { css : String, params : String, dml : String };
+typedef DomkitFileData = { css : String, params : String, dml : String, ?enums : String };
 
 class DomkitFile {
 
@@ -636,10 +649,19 @@ class DomkitFile {
 			content = StringTools.trim(content);
 		}
 
+		var enums = null;
+		if( StringTools.startsWith(content,"<enums>") ) {
+			var pos = content.indexOf("</enums>");
+			enums = StringTools.trim(content.substr(7, pos - 8));
+			content = content.substr(pos + 8);
+			content = StringTools.trim(content);
+		}
+
 		return {
 			css : cssText,
 			params : paramsText,
 			dml : content,
+			enums : enums,
 		}
 	}