소스 검색

[macro] retreive enum field by name instead of decoding TypedExpr (fixes #9812)

Aleksandr Kuzmenko 5 년 전
부모
커밋
bfe90107b3
2개의 변경된 파일29개의 추가작업 그리고 10개의 파일을 삭제
  1. 8 10
      src/macro/macroApi.ml
  2. 21 0
      tests/unit/src/unit/issues/Issue9812.hx

+ 8 - 10
src/macro/macroApi.ml

@@ -1334,16 +1334,14 @@ let decode_cfield v =
 	cf
 
 let decode_efield v =
-	{
-		ef_name = decode_string (field v "name");
-		ef_type = decode_type (field v "type");
-		ef_pos = decode_pos (field v "pos");
-		ef_name_pos = decode_pos (field v "namePos");
-		ef_index = decode_int (field v "index");
-		ef_meta = []; (* TODO *)
-		ef_doc = decode_doc (field v "doc");
-		ef_params = decode_type_params (field v "params")
-	}
+	let name = decode_string (field v "name")
+	and t = decode_type (field v "type") in
+	match t with
+	| TEnum (enm,_) ->
+		(try PMap.find name enm.e_constrs
+		with Not_found -> raise Invalid_expr)
+	| _ ->
+		raise Invalid_expr
 
 let decode_field_access v =
 	match decode_enum v with

+ 21 - 0
tests/unit/src/unit/issues/Issue9812.hx

@@ -0,0 +1,21 @@
+package unit.issues;
+
+#if macro
+class Issue9812 {
+	static macro function store(e) {
+		return haxe.macro.Context.storeTypedExpr(haxe.macro.Context.typeExpr(e));
+	}
+}
+#else
+class Issue9812 extends unit.Test {
+	function test() {
+		eq(Foo.Baz, store(Foo.Baz));
+	}
+
+	static macro function store(e:haxe.macro.Expr):haxe.macro.Expr;
+}
+
+private enum Foo {
+	@:native('BAR') Baz;
+}
+#end