Browse Source

added support for CdbType.XXX in mockup (can now compile in @:source)

Nicolas Cannasse 4 months ago
parent
commit
7e099d1ef1
3 changed files with 56 additions and 0 deletions
  1. 3 0
      hide/comp/ScriptEditor.hx
  2. 6 0
      hide/view/Domkit.hx
  3. 47 0
      hrt/impl/DomkitViewer.hx

+ 3 - 0
hide/comp/ScriptEditor.hx

@@ -155,6 +155,7 @@ class ScriptChecker {
 	public var constants : Map<String,Dynamic>;
 	public var evalTo : String;
 	public var checker(default,null) : hscript.Checker;
+	public var cdbEnums : Array<String>;
 	var initDone = false;
 	var apiHash : String;
 
@@ -227,6 +228,7 @@ class ScriptChecker {
 		var contexts = [];
 		var allowGlobalsDefine = false;
 		checkEvents = false;
+		cdbEnums = [];
 
 		for( api in apis ) {
 			for( f in api.globals.keys() ) {
@@ -376,6 +378,7 @@ class ScriptChecker {
 				cl.fields.set(id, { name : id, params : [], canWrite : false, t : kind, isPublic: true, complete : true });
 			}
 			checker.setGlobal(name, TInst(cl,[]));
+			cdbEnums.push(name);
 			return kind;
 		}
 		return null;

+ 6 - 0
hide/view/Domkit.hx

@@ -152,6 +152,12 @@ class Domkit extends FileView {
 		}
 		dmlEditor.check();
 		cssEditor.check();
+		var usedCDB = [];
+		for( c in checker.cdbEnums )
+			if( dmlEditor.code.indexOf(c+".") >= 0 )
+				usedCDB.push(c);
+		if( usedCDB.length > 0 )
+			checker.usedEnums.push({path:"$cdb",constrs:usedCDB});
 	}
 
 	function trimSpaces( code : String ) {

+ 47 - 0
hrt/impl/DomkitViewer.hx

@@ -53,6 +53,41 @@ class DomkitViewer {
 				clearImportNames(c);
 	}
 
+	static function remapCDBCode( map : Map<String, Bool>, code : domkit.MarkupParser.CodeExpr ) {
+		switch( code.expr ) {
+		case EConst(CIdent(name)) if( map.exists(name) ):
+			code.expr = EField({ expr : EConst(CIdent(CDB_MODULE)), pos : code.pos }, name+"Kind");
+		default:
+			haxe.macro.ExprTools.iter(code, remapCDBCode.bind(map));
+		}
+	}
+
+	static function iterCode( m : domkit.MarkupParser.Markup, f : domkit.MarkupParser.CodeExpr -> Void ) {
+		if( m.arguments != null ) {
+			for( a in m.arguments )
+				switch( a.value ) {
+				case Code(code): f(code);
+				default:
+				}
+		}
+		if( m.attributes != null ) {
+			for( a in m.attributes )
+				switch( a.value ) {
+				case Code(code): f(code);
+				default:
+				}
+		}
+		if( m.condition != null )
+			f(m.condition.cond);
+		if( m.children != null )
+			for( c in m.children )
+				iterCode(c, f);
+		switch( m.kind ) {
+		case For(cond): f(cond);
+		default:
+		}
+	}
+
 	public static function loadSource( path : String, pos : Position, fields : Array<Field>, extraParams : Array<Expr> ) {
 		var name = path.split("/").pop().split("_").join("-");
 		var dotPos = name.lastIndexOf(".");
@@ -132,6 +167,16 @@ class DomkitViewer {
 				removeDynParamsRec(m, dynParams);
 			clearImportNames(m);
 
+			if( data.enums != null ) {
+				var enums : Array<{ path : String, constrs : Array<String> }> = haxe.Json.parse(data.enums);
+				for( e in enums )
+					if( e.path == "$cdb" ) {
+						var map = [for( c in e.constrs ) c => true];
+						iterCode(m,remapCDBCode.bind(map));
+						break;
+					}
+			}
+
 			if( hasCSS ) {
 				fields.push({
 					name : "__CSS",
@@ -147,6 +192,8 @@ class DomkitViewer {
 		}
 	}
 
+	public static var CDB_MODULE = "Data";
+
 	public static function init() {
 		domkit.Macros.onSourceLoad = loadSource;
 	}