@@ -14977,9 +14977,11 @@ module Ast_utf8_string_interp : sig
1497714977 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *)
1497814978
1497914979
14980- type kind =
14980+
14981+ type kind =
1498114982 | String
14982- | Var
14983+ | Var of int * int (* int records its border length *)
14984+
1498314985type error = private
1498414986 | Invalid_code_point
1498514987 | Unterminated_backslash
@@ -15054,10 +15056,14 @@ type error =
1505415056 | Unterminated_variable
1505515057 | Unmatched_paren
1505615058 | Invalid_syntax_of_var of string
15059+
1505715060type kind =
1505815061 | String
15059- | Var
15060-
15062+ | Var of int * int
15063+ (* [Var (loffset, roffset)]
15064+ For parens it used to be (2,-1)
15065+ for non-parens it used to be (1,0)
15066+ *)
1506115067
1506215068(** Note the position is about code point *)
1506315069type pos = {
@@ -15176,7 +15182,7 @@ let pos_error cxt ~loc error =
1517615182 (cxt.segment_start,
1517715183 { lnum = cxt.pos_lnum ; offset = loc - cxt.pos_bol ; byte_bol = cxt.byte_bol}, error))
1517815184
15179- let add_var_segment cxt loc =
15185+ let add_var_segment cxt loc loffset roffset =
1518015186 let content = Buffer.contents cxt.buf in
1518115187 Buffer.clear cxt.buf ;
1518215188 let next_loc = {
@@ -15187,7 +15193,7 @@ let add_var_segment cxt loc =
1518715193 cxt.segments <-
1518815194 { start = cxt.segment_start;
1518915195 finish = next_loc ;
15190- kind = Var;
15196+ kind = Var (loffset, roffset) ;
1519115197 content} :: cxt.segments ;
1519215198 cxt.segment_start <- next_loc
1519315199 end
@@ -15280,7 +15286,7 @@ and expect_simple_var loc s offset ({buf; s_len} as cxt) =
1528015286 done;
1528115287 let added_length = !v - offset in
1528215288 let loc = added_length + loc in
15283- add_var_segment cxt loc ;
15289+ add_var_segment cxt loc 1 0 ;
1528415290 check_and_transform loc s (added_length + offset) cxt
1528515291 end
1528615292and expect_var_paren loc s offset ({buf; s_len} as cxt) =
@@ -15295,7 +15301,7 @@ and expect_var_paren loc s offset ({buf; s_len} as cxt) =
1529515301 let loc = added_length + 1 + loc in
1529615302 if !v < s_len && s.[!v] = ')' then
1529715303 begin
15298- add_var_segment cxt loc ;
15304+ add_var_segment cxt loc 2 (-1) ;
1529915305 check_and_transform loc s (added_length + 1 + offset) cxt
1530015306 end
1530115307 else
@@ -15394,7 +15400,7 @@ open Ast_helper
1539415400
1539515401(** Longident.parse "Pervasives.^" *)
1539615402let concat_ident : Longident.t =
15397- Ldot (Lident "Pervasives", "^")
15403+ Ldot (Lident "Pervasives", "^") (* FIXME: remove deps on `Pervasives` *)
1539815404 (* JS string concatMany *)
1539915405 (* Ldot (Ldot (Lident "Js", "String"), "concat") *)
1540015406
@@ -15420,14 +15426,19 @@ let border = String.length "{j|"
1542015426let aux loc (segment : segment) =
1542115427 match segment with
1542215428 | {start ; finish; kind ; content}
15423- ->
15424- let loc = update border start finish loc in
15429+ ->
1542515430 begin match kind with
15426- | String ->
15431+ | String ->
15432+ let loc = update border start finish loc in
1542715433 Exp.constant
1542815434 ~loc
1542915435 (Const_string (content, escaped))
15430- | Var ->
15436+ | Var (soffset, foffset) ->
15437+ let loc = {
15438+ loc with
15439+ loc_start = update_position (soffset + border) start loc.loc_start ;
15440+ loc_end = update_position (foffset + border) finish loc.loc_start
15441+ } in
1543115442 Exp.apply ~loc
1543215443 (Exp.ident ~loc {loc ; txt = to_string_ident })
1543315444 [
@@ -15505,6 +15516,9 @@ let (==*) a b =
1550515516 )
1550615517 in
1550715518 OUnit.assert_equal segments b
15519+
15520+ let varParen : Ast_utf8_string_interp.kind = Var (2,-1)
15521+ let var : Ast_utf8_string_interp.kind = Var (1,0)
1550815522let suites =
1550915523 __FILE__
1551015524 >:::
@@ -15551,7 +15565,7 @@ let suites =
1555115565 "hie $x hi 你好" ==~
1555215566 [
1555315567 0,4, String, "hie ";
15554- 4,6, Var , "x";
15568+ 4,6, var , "x";
1555515569 6,12,String, " hi 你好"
1555615570 ]
1555715571 end;
@@ -15571,7 +15585,7 @@ let suites =
1557115585 __LOC__ >:: begin fun _ ->
1557215586 "你好$x" ==~
1557315587 [0,2,String, "你好";
15574- 2,4,Var , "x";
15588+ 2,4,var , "x";
1557515589
1557615590 ]
1557715591 end
@@ -15580,47 +15594,47 @@ let suites =
1558015594 "你好$this" ==~
1558115595 [
1558215596 0,2,String, "你好";
15583- 2,7,Var , "this";
15597+ 2,7,var , "this";
1558415598 ]
1558515599 end
1558615600 ;
1558715601 __LOC__ >:: begin fun _ ->
1558815602 "你好$(this)" ==~
1558915603 [
1559015604 0,2,String, "你好";
15591- 2,9,Var , "this"
15605+ 2,9,varParen , "this"
1559215606 ];
1559315607
1559415608 "你好$this)" ==~
1559515609 [
1559615610 0,2,String, "你好";
15597- 2,7,Var , "this";
15611+ 2,7,var , "this";
1559815612 7,8,String,")"
1559915613 ];
1560015614 {|\xff\xff你好 $x |} ==~
1560115615 [
1560215616 0,11,String, {|\xff\xff你好 |};
15603- 11,13, Var , "x";
15617+ 11,13, var , "x";
1560415618 13,14, String, " "
1560515619 ];
1560615620 {|\xff\xff你好 $x 不吃亏了buckle $y $z = $sum|}
1560715621 ==~
1560815622 [(0, 11, String,{|\xff\xff你好 |} );
15609- (11, 13, Var , "x");
15623+ (11, 13, var , "x");
1561015624 (13, 25, String,{| 不吃亏了buckle |} );
15611- (25, 27, Var , "y");
15625+ (25, 27, var , "y");
1561215626 (27, 28, String, " ");
15613- (28, 30, Var , "z");
15627+ (28, 30, var , "z");
1561415628 (30, 33, String, " = ");
15615- (33, 37, Var , "sum");
15629+ (33, 37, var , "sum");
1561615630 ]
1561715631 end
1561815632 ;
1561915633 __LOC__ >:: begin fun _ ->
1562015634 "你好 $(this_is_a_var) x" ==~
1562115635 [
1562215636 0,3,String, "你好 ";
15623- 3,19,Var , "this_is_a_var";
15637+ 3,19,varParen , "this_is_a_var";
1562415638 19,22, String, " x"
1562515639 ]
1562615640 end
@@ -15630,17 +15644,17 @@ let suites =
1563015644 "hi\n$x\n" ==*
1563115645 [
1563215646 0,0,1,0,String, "hi\\n";
15633- 1,0,1,2,Var , "x" ;
15647+ 1,0,1,2,var , "x" ;
1563415648 1,2,2,0,String,"\\n"
1563515649 ];
1563615650 "$x" ==*
15637- [0,0,0,2,Var ,"x"];
15651+ [0,0,0,2,var ,"x"];
1563815652
1563915653
1564015654 "\n$x\n" ==*
1564115655 [
1564215656 0,0,1,0,String,"\\n";
15643- 1,0,1,2,Var ,"x";
15657+ 1,0,1,2,var ,"x";
1564415658 1,2,2,0,String,"\\n"
1564515659 ]
1564615660 end;
@@ -15649,27 +15663,27 @@ let suites =
1564915663 "\n$(x_this_is_cool) " ==*
1565015664 [
1565115665 0,0,1,0,String, "\\n";
15652- 1,0,1,17,Var , "x_this_is_cool";
15666+ 1,0,1,17,varParen , "x_this_is_cool";
1565315667 1,17,1,18,String, " "
1565415668 ]
1565515669 end;
1565615670 __LOC__ >:: begin fun _ ->
1565715671 " $x + $y = $sum " ==*
1565815672 [
1565915673 0,0,0,1,String , " ";
15660- 0,1,0,3,Var , "x";
15674+ 0,1,0,3,var , "x";
1566115675 0,3,0,6,String, " + ";
15662- 0,6,0,8,Var , "y";
15676+ 0,6,0,8,var , "y";
1566315677 0,8,0,11,String, " = ";
15664- 0,11,0,15,Var , "sum";
15678+ 0,11,0,15,var , "sum";
1566515679 0,15,0,16,String, " "
1566615680 ]
1566715681 end;
1566815682 __LOC__ >:: begin fun _ ->
1566915683 "中文 | $a " ==*
1567015684 [
1567115685 0,0,0,5,String, "中文 | ";
15672- 0,5,0,7,Var , "a";
15686+ 0,5,0,7,var , "a";
1567315687 0,7,0,8,String, " "
1567415688 ]
1567515689 end
@@ -15678,14 +15692,14 @@ let suites =
1567815692 {|Hello \\$world|} ==*
1567915693 [
1568015694 0,0,0,8,String,"Hello \\\\";
15681- 0,8,0,14,Var , "world"
15695+ 0,8,0,14,var , "world"
1568215696 ]
1568315697 end
1568415698 ;
1568515699 __LOC__ >:: begin fun _ ->
1568615700 {|$x)|} ==*
1568715701 [
15688- 0,0,0,2,Var ,"x";
15702+ 0,0,0,2,var ,"x";
1568915703 0,2,0,3,String,")"
1569015704 ]
1569115705 end;
0 commit comments