Browse Source

added 'macro @:pos(pos-expr) e' reification to specify an explicit pos for a whole sub expression (fixed issue #1361)

Nicolas Cannasse 12 years ago
parent
commit
c5529cbf17
1 changed files with 17 additions and 6 deletions
  1. 17 6
      ast.ml

+ 17 - 6
ast.ml

@@ -864,6 +864,7 @@ let map_expr loop (e,p) =
 	(e,p)
 
 let reify in_macro =
+	let cur_pos = ref None in
 	let mk_enum ename n vl p =
 		let constr = (EConst (Ident n),p) in
 		match vl with
@@ -1019,6 +1020,10 @@ let reify in_macro =
 			to_obj fields p
 		) m p
 	and to_pos p =
+		match !cur_pos with
+		| Some p ->
+			p
+		| None ->
 		let file = (EConst (String p.pfile),p) in
 		let pmin = (EConst (Int (string_of_int p.pmin)),p) in
 		let pmax = (EConst (Int (string_of_int p.pmax)),p) in
@@ -1118,18 +1123,24 @@ let reify in_macro =
 		| ECheckType (e1,ct) ->
 			expr "ECheckType" [loop e1; to_ctype ct p]
 		| EMeta ((m,ml,p),e1) ->
-			match m with
-			| Meta.Dollar ("" | "e") ->
+			match m, ml with
+			| Meta.Dollar ("" | "e"), _ ->
 				e1
-			| Meta.Dollar "a" ->
+			| Meta.Dollar "a", _ ->
 				expr "EArrayDecl" (match fst e1 with EArrayDecl el -> [to_expr_array el p] | _ -> [e1])
 			(* TODO: can $v and $i be implemented better? *)
-			| Meta.Dollar "v" ->
+			| Meta.Dollar "v", _ ->
 				(ECall ((EField ((EField ((EField ((EConst (Ident "haxe"),p),"macro"),p),"Context"),p),"makeExpr"),p),[e; to_pos (pos e)]),p)
-			| Meta.Dollar "i" ->
+			| Meta.Dollar "i", _ ->
 				(ECall ((EField ((EField ((EField ((EConst (Ident "haxe"),p),"macro"),p),"ExprTools"),p),"asIdent"),p),[e; to_pos (pos e)]),p)
-			| Meta.Dollar "p" ->
+			| Meta.Dollar "p", _ ->
 				(ECall ((EField ((EField ((EField ((EConst (Ident "haxe"),p),"macro"),p),"ExprTools"),p),"toFieldExpr"),p),[e]),p)
+			| Meta.Custom ":pos", [pexpr] ->
+				let old = !cur_pos in
+				cur_pos := Some pexpr;
+				let e = loop e1 in
+				cur_pos := old;
+				e
 			| _ ->
 				expr "EMeta" [to_obj [("name",to_string (Meta.to_string m) p);("params",to_expr_array ml p);("pos",to_pos p)] p;loop e1]
 	in