Browse Source

do not lose real expression position in format string (see #2244)

Simon Krajewski 9 năm trước cách đây
mục cha
commit
b3f869d8a2
2 tập tin đã thay đổi với 18 bổ sung4 xóa
  1. 11 0
      tests/unit/src/unit/issues/Issue2244.hx
  2. 7 4
      typer.ml

+ 11 - 0
tests/unit/src/unit/issues/Issue2244.hx

@@ -0,0 +1,11 @@
+package unit.issues;
+
+import unit.Test;
+
+class Issue2244 extends Test{
+	function test() {
+		var x = "foo";
+		var y = '${ '${x}'}';
+		eq("foo", y);
+	}
+}

+ 7 - 4
typer.ml

@@ -2816,14 +2816,17 @@ and format_string ctx s p =
 	let e = ref None in
 	let e = ref None in
 	let pmin = ref p.pmin in
 	let pmin = ref p.pmin in
 	let min = ref (p.pmin + 1) in
 	let min = ref (p.pmin + 1) in
-	let add enext len =
-		let p = { p with pmin = !min; pmax = !min + len } in
+	let add_expr (enext,p) len =
 		min := !min + len;
 		min := !min + len;
 		match !e with
 		match !e with
 		| None -> e := Some (enext,p)
 		| None -> e := Some (enext,p)
 		| Some prev ->
 		| Some prev ->
 			e := Some (EBinop (OpAdd,prev,(enext,p)),punion (pos prev) p)
 			e := Some (EBinop (OpAdd,prev,(enext,p)),punion (pos prev) p)
 	in
 	in
+	let add enext len =
+		let p = { p with pmin = !min; pmax = !min + len } in
+		add_expr (enext,p) len
+	in
 	let add_sub start pos =
 	let add_sub start pos =
 		let len = pos - start in
 		let len = pos - start in
 		if len > 0 || !e = None then add (EConst (String (String.sub s start len))) len
 		if len > 0 || !e = None then add (EConst (String (String.sub s start len))) len
@@ -2891,7 +2894,7 @@ and format_string ctx s p =
 		if warn_escape then warn (pos + 1) slen;
 		if warn_escape then warn (pos + 1) slen;
 		min := !min + 2;
 		min := !min + 2;
 		if slen > 0 then
 		if slen > 0 then
-			add (fst (parse_expr_string ctx scode { p with pmin = !pmin + pos + 2; pmax = !pmin + send + 1 } true)) slen;
+			add_expr (parse_expr_string ctx scode { p with pmin = !pmin + pos + 2; pmax = !pmin + send + 1 } true) slen;
 		min := !min + 1;
 		min := !min + 1;
 		parse (send + 1) (send + 1)
 		parse (send + 1) (send + 1)
 	in
 	in
@@ -2977,7 +2980,7 @@ and type_expr ctx (e,p) (with_type:with_type) =
 		let opt = mk (TConst (TString opt)) ctx.t.tstring p in
 		let opt = mk (TConst (TString opt)) ctx.t.tstring p in
 		let t = Typeload.load_core_type ctx "EReg" in
 		let t = Typeload.load_core_type ctx "EReg" in
 		mk (TNew ((match t with TInst (c,[]) -> c | _ -> assert false),[],[str;opt])) t p
 		mk (TNew ((match t with TInst (c,[]) -> c | _ -> assert false),[],[str;opt])) t p
-	| EConst (String s) when Lexer.is_fmt_string p ->
+	| EConst (String s) when s <> "" && Lexer.is_fmt_string p ->
 		type_expr ctx (format_string ctx s p) with_type
 		type_expr ctx (format_string ctx s p) with_type
 	| EConst c ->
 	| EConst c ->
 		Codegen.type_constant ctx.com c p
 		Codegen.type_constant ctx.com c p