Browse Source

support @:native on enum constructors (closes #9806)

Aleksandr Kuzmenko 5 years ago
parent
commit
e797d90879
3 changed files with 36 additions and 1 deletions
  1. 1 1
      src/core/tType.ml
  2. 20 0
      src/filters/filters.ml
  3. 15 0
      tests/unit/src/unit/issues/Issue9806.hx

+ 1 - 1
src/core/tType.ml

@@ -248,7 +248,7 @@ and tclass = {
 }
 }
 
 
 and tenum_field = {
 and tenum_field = {
-	ef_name : string;
+	mutable ef_name : string;
 	mutable ef_type : t;
 	mutable ef_type : t;
 	ef_pos : pos;
 	ef_pos : pos;
 	ef_name_pos : pos;
 	ef_name_pos : pos;

+ 20 - 0
src/filters/filters.ml

@@ -419,6 +419,26 @@ let apply_native_paths ctx t =
 			c.cl_meta <- meta :: c.cl_meta;
 			c.cl_meta <- meta :: c.cl_meta;
 			c.cl_path <- path;
 			c.cl_path <- path;
 		| TEnumDecl e ->
 		| TEnumDecl e ->
+			let did_change = ref false in
+			let field _ ef = try
+				let meta,name = get_real_name ef.ef_meta ef.ef_name in
+				ef.ef_name <- name;
+				ef.ef_meta <- meta :: ef.ef_meta;
+				did_change := true;
+			with Not_found ->
+				()
+			in
+			PMap.iter field e.e_constrs;
+			if !did_change then begin
+				let names = ref [] in
+				e.e_constrs <- PMap.fold
+					(fun ef map ->
+						names := ef.ef_name :: !names;
+						PMap.add ef.ef_name ef map
+					)
+					e.e_constrs PMap.empty;
+				e.e_names <- !names;
+			end;
 			let meta,path = get_real_path e.e_meta e.e_path in
 			let meta,path = get_real_path e.e_meta e.e_path in
 			e.e_meta <- meta :: e.e_meta;
 			e.e_meta <- meta :: e.e_meta;
 			e.e_path <- path;
 			e.e_path <- path;

+ 15 - 0
tests/unit/src/unit/issues/Issue9806.hx

@@ -0,0 +1,15 @@
+package unit.issues;
+
+class Issue9806 extends unit.Test {
+	function test() {
+		eq('Two', Type.enumConstructor(One));
+		eq('TheirEnum', Type.getEnumName(MyEnum));
+		aeq(['Two'], Type.getEnumConstructs(MyEnum));
+	}
+}
+
+@:native('TheirEnum')
+private enum MyEnum {
+	@:native('Two')
+	One;
+}