Browse Source

[js] Fix enums parameters generation to make it compatible with advanced JS minification tools (#11328)

* [js] don't use enum parameters names in the generated code

* cleanup

---------

Co-authored-by: a.v.kuzmenko <[email protected]>
Aleksandr Kuzmenko 1 year ago
parent
commit
f47841dcf0
3 changed files with 12 additions and 11 deletions
  1. 2 2
      src/generators/genjs.ml
  2. 5 2
      std/js/Boot.hx
  3. 5 7
      std/js/_std/Type.hx

+ 2 - 2
src/generators/genjs.ml

@@ -1664,11 +1664,11 @@ let generate_enum ctx e =
 			let sargs = String.concat "," (List.map (fun (n,_,_) -> ident n) args) in begin
 			if as_objects then begin
 				let sfields = String.concat "," (List.map (fun (n,_,_) -> (ident n) ^ ":" ^ (ident n) ) args) in
-				let sparams = String.concat "," (List.map (fun (n,_,_) -> "\"" ^ (ident n) ^ "\"" ) args) in
+				let sparams = String.concat "," (List.map (fun (n,_,_) -> "this." ^ (ident n) ) args) in
 				print ctx "($_=function(%s) { return {_hx_index:%d,%s,__enum__:\"%s\"" sargs f.ef_index sfields dotp;
 				if has_enum_feature then
 					spr ctx ",toString:$estr";
-				print ctx "}; },$_._hx_name=\"%s\",$_.__params__ = [%s],$_)" f.ef_name sparams
+				print ctx ",__params__:function(){ return [%s];}}; },$_._hx_name=\"%s\",$_)" sparams f.ef_name
 			end else begin
 				print ctx "function(%s) { var $x = [\"%s\",%d,%s]; $x.__enum__ = %s;" sargs f.ef_name f.ef_index sargs p;
 				if has_enum_feature then

+ 5 - 2
std/js/Boot.hx

@@ -71,9 +71,12 @@ class Boot {
 						var e = $hxEnums[o.__enum__];
 						var con = e.__constructs__[o._hx_index];
 						var n = con._hx_name;
-						if (con.__params__) {
+						if (o.__params__) {
 							s += "\t";
-							return n + "(" + [for (p in (con.__params__ : Array<String>)) __string_rec(o[p], s)].join(",") + ")";
+							var params:Array<Any> = o.__params__();
+							for (i in 0...params.length)
+								params[i] = __string_rec(params[i], s);
+							return n + "(" + params.join(",") + ")";
 						} else {
 							return n;
 						}

+ 5 - 7
std/js/_std/Type.hx

@@ -289,10 +289,10 @@ enum ValueType {
 				#else
 				if (a._hx_index != b._hx_index)
 					return false;
-				var enm = $hxEnums[e];
-				var params:Array<String> = enm.__constructs__[a._hx_index].__params__;
-				for (f in params) {
-					if (!enumEq(a[f], b[f])) {
+				var aparams:Array<Any> = a.__params__();
+				var bparams:Array<Any> = b.__params__();
+				for (i in 0...aparams.length) {
+					if (!enumEq(aparams[i], bparams[i])) {
 						return false;
 					}
 				}
@@ -318,9 +318,7 @@ enum ValueType {
 	#else
 	public static function enumParameters(e:EnumValue):Array<Dynamic>
 		untyped {
-			var enm:Enum<Dynamic> = $hxEnums[e.__enum__];
-			var params:Array<String> = enm.__constructs__[e._hx_index].__params__;
-			return params != null ? [for (p in params) e[p]] : [];
+			return e.__params__ != null ? e.__params__() : [];
 		}
 	#end