소스 검색

[macro] support maps in Context.makeExpr

closes #10259
Simon Krajewski 4 년 전
부모
커밋
cc0098f4a4
3개의 변경된 파일60개의 추가작업 그리고 0개의 파일을 삭제
  1. 22 0
      src/macro/eval/evalMain.ml
  2. 16 0
      tests/unit/src/unit/issues/Issue10259.hx
  3. 22 0
      tests/unit/src/unit/issues/misc/Issue10259Macro.hx

+ 22 - 0
src/macro/eval/evalMain.ml

@@ -431,6 +431,10 @@ let rec value_to_expr v p =
 		in
 		make_path mt
 	in
+	let make_map_entry e_key v =
+		let e_value = value_to_expr v p in
+		(EBinop(OpArrow,e_key,e_value),p)
+	in
 	match vresolve v with
 	| VNull -> (EConst (Ident "null"),p)
 	| VTrue -> (EConst (Ident "true"),p)
@@ -464,6 +468,24 @@ let rec value_to_expr v p =
 				let args = List.map (fun v -> value_to_expr v p) (Array.to_list e.eargs) in
 				(ECall (epath, args), p)
 		end
+	| VInstance {ikind = IIntMap m} ->
+		let el = IntHashtbl.fold (fun k v acc ->
+			let e_key = (EConst (Int (string_of_int k)),p) in
+			(make_map_entry e_key v) :: acc
+		) m [] in
+		(EArrayDecl el,p)
+	| VInstance {ikind = IStringMap m} ->
+		let el = StringHashtbl.fold (fun k (_,v) acc ->
+			let e_key = (EConst (String(k,SDoubleQuotes)),p) in
+			(make_map_entry e_key v) :: acc
+		) m [] in
+		(EArrayDecl el,p)
+	| VInstance {ikind = IObjectMap m} ->
+		let el = Hashtbl.fold (fun k v acc ->
+			let e_key = value_to_expr k p in
+			(make_map_entry e_key v) :: acc
+		) m [] in
+		(EArrayDecl el,p)
 	| _ -> exc_string ("Cannot convert " ^ (value_string v) ^ " to expr")
 
 let encode_obj = encode_obj_s

+ 16 - 0
tests/unit/src/unit/issues/Issue10259.hx

@@ -0,0 +1,16 @@
+package unit.issues;
+
+import unit.issues.misc.Issue10259Macro;
+import utest.Assert;
+
+class Issue10259 extends Test {
+	function test() {
+		final maps = Issue10259Macro.getMaps();
+
+		Assert.same([1 => 2], maps.intMap);
+		Assert.same(["1" => 2], maps.stringMap);
+		// Not sure if this is specified to actually work x)
+		eq(1, maps.objectMap.keys().next().x);
+		eq(2, maps.objectMap.iterator().next());
+	}
+}

+ 22 - 0
tests/unit/src/unit/issues/misc/Issue10259Macro.hx

@@ -0,0 +1,22 @@
+package unit.issues.misc;
+
+import haxe.macro.Context;
+import haxe.macro.Expr;
+
+class Issue10259Macro {
+	macro static public function getMaps() {
+		final p = Context.currentPos();
+		final intMap = Context.makeExpr([1 => 2], p);
+		final stringMap = Context.makeExpr(["1" => 2], p);
+		final objectMap = Context.makeExpr([
+			{x: 1}
+			=> 2
+		], p);
+
+		return macro {
+			intMap: $intMap,
+			stringMap: $stringMap,
+			objectMap: $objectMap
+		}
+	}
+}