@@ -14977,9 +14977,11 @@ module Ast_utf8_string_interp : sig
14977
14977
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *)
14978
14978
14979
14979
14980
- type kind =
14980
+
14981
+ type kind =
14981
14982
| String
14982
- | Var
14983
+ | Var of int * int (* int records its border length *)
14984
+
14983
14985
type error = private
14984
14986
| Invalid_code_point
14985
14987
| Unterminated_backslash
@@ -15054,10 +15056,14 @@ type error =
15054
15056
| Unterminated_variable
15055
15057
| Unmatched_paren
15056
15058
| Invalid_syntax_of_var of string
15059
+
15057
15060
type kind =
15058
15061
| 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
+ *)
15061
15067
15062
15068
(** Note the position is about code point *)
15063
15069
type pos = {
@@ -15176,7 +15182,7 @@ let pos_error cxt ~loc error =
15176
15182
(cxt.segment_start,
15177
15183
{ lnum = cxt.pos_lnum ; offset = loc - cxt.pos_bol ; byte_bol = cxt.byte_bol}, error))
15178
15184
15179
- let add_var_segment cxt loc =
15185
+ let add_var_segment cxt loc loffset roffset =
15180
15186
let content = Buffer.contents cxt.buf in
15181
15187
Buffer.clear cxt.buf ;
15182
15188
let next_loc = {
@@ -15187,7 +15193,7 @@ let add_var_segment cxt loc =
15187
15193
cxt.segments <-
15188
15194
{ start = cxt.segment_start;
15189
15195
finish = next_loc ;
15190
- kind = Var;
15196
+ kind = Var (loffset, roffset) ;
15191
15197
content} :: cxt.segments ;
15192
15198
cxt.segment_start <- next_loc
15193
15199
end
@@ -15280,7 +15286,7 @@ and expect_simple_var loc s offset ({buf; s_len} as cxt) =
15280
15286
done;
15281
15287
let added_length = !v - offset in
15282
15288
let loc = added_length + loc in
15283
- add_var_segment cxt loc ;
15289
+ add_var_segment cxt loc 1 0 ;
15284
15290
check_and_transform loc s (added_length + offset) cxt
15285
15291
end
15286
15292
and 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) =
15295
15301
let loc = added_length + 1 + loc in
15296
15302
if !v < s_len && s.[!v] = ')' then
15297
15303
begin
15298
- add_var_segment cxt loc ;
15304
+ add_var_segment cxt loc 2 (-1) ;
15299
15305
check_and_transform loc s (added_length + 1 + offset) cxt
15300
15306
end
15301
15307
else
@@ -15394,7 +15400,7 @@ open Ast_helper
15394
15400
15395
15401
(** Longident.parse "Pervasives.^" *)
15396
15402
let concat_ident : Longident.t =
15397
- Ldot (Lident "Pervasives", "^")
15403
+ Ldot (Lident "Pervasives", "^") (* FIXME: remove deps on `Pervasives` *)
15398
15404
(* JS string concatMany *)
15399
15405
(* Ldot (Ldot (Lident "Js", "String"), "concat") *)
15400
15406
@@ -15420,14 +15426,19 @@ let border = String.length "{j|"
15420
15426
let aux loc (segment : segment) =
15421
15427
match segment with
15422
15428
| {start ; finish; kind ; content}
15423
- ->
15424
- let loc = update border start finish loc in
15429
+ ->
15425
15430
begin match kind with
15426
- | String ->
15431
+ | String ->
15432
+ let loc = update border start finish loc in
15427
15433
Exp.constant
15428
15434
~loc
15429
15435
(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
15431
15442
Exp.apply ~loc
15432
15443
(Exp.ident ~loc {loc ; txt = to_string_ident })
15433
15444
[
@@ -15505,6 +15516,9 @@ let (==*) a b =
15505
15516
)
15506
15517
in
15507
15518
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)
15508
15522
let suites =
15509
15523
__FILE__
15510
15524
>:::
@@ -15551,7 +15565,7 @@ let suites =
15551
15565
"hie $x hi 你好" ==~
15552
15566
[
15553
15567
0,4, String, "hie ";
15554
- 4,6, Var , "x";
15568
+ 4,6, var , "x";
15555
15569
6,12,String, " hi 你好"
15556
15570
]
15557
15571
end;
@@ -15571,7 +15585,7 @@ let suites =
15571
15585
__LOC__ >:: begin fun _ ->
15572
15586
"你好$x" ==~
15573
15587
[0,2,String, "你好";
15574
- 2,4,Var , "x";
15588
+ 2,4,var , "x";
15575
15589
15576
15590
]
15577
15591
end
@@ -15580,47 +15594,47 @@ let suites =
15580
15594
"你好$this" ==~
15581
15595
[
15582
15596
0,2,String, "你好";
15583
- 2,7,Var , "this";
15597
+ 2,7,var , "this";
15584
15598
]
15585
15599
end
15586
15600
;
15587
15601
__LOC__ >:: begin fun _ ->
15588
15602
"你好$(this)" ==~
15589
15603
[
15590
15604
0,2,String, "你好";
15591
- 2,9,Var , "this"
15605
+ 2,9,varParen , "this"
15592
15606
];
15593
15607
15594
15608
"你好$this)" ==~
15595
15609
[
15596
15610
0,2,String, "你好";
15597
- 2,7,Var , "this";
15611
+ 2,7,var , "this";
15598
15612
7,8,String,")"
15599
15613
];
15600
15614
{|\xff\xff你好 $x |} ==~
15601
15615
[
15602
15616
0,11,String, {|\xff\xff你好 |};
15603
- 11,13, Var , "x";
15617
+ 11,13, var , "x";
15604
15618
13,14, String, " "
15605
15619
];
15606
15620
{|\xff\xff你好 $x 不吃亏了buckle $y $z = $sum|}
15607
15621
==~
15608
15622
[(0, 11, String,{|\xff\xff你好 |} );
15609
- (11, 13, Var , "x");
15623
+ (11, 13, var , "x");
15610
15624
(13, 25, String,{| 不吃亏了buckle |} );
15611
- (25, 27, Var , "y");
15625
+ (25, 27, var , "y");
15612
15626
(27, 28, String, " ");
15613
- (28, 30, Var , "z");
15627
+ (28, 30, var , "z");
15614
15628
(30, 33, String, " = ");
15615
- (33, 37, Var , "sum");
15629
+ (33, 37, var , "sum");
15616
15630
]
15617
15631
end
15618
15632
;
15619
15633
__LOC__ >:: begin fun _ ->
15620
15634
"你好 $(this_is_a_var) x" ==~
15621
15635
[
15622
15636
0,3,String, "你好 ";
15623
- 3,19,Var , "this_is_a_var";
15637
+ 3,19,varParen , "this_is_a_var";
15624
15638
19,22, String, " x"
15625
15639
]
15626
15640
end
@@ -15630,17 +15644,17 @@ let suites =
15630
15644
"hi\n$x\n" ==*
15631
15645
[
15632
15646
0,0,1,0,String, "hi\\n";
15633
- 1,0,1,2,Var , "x" ;
15647
+ 1,0,1,2,var , "x" ;
15634
15648
1,2,2,0,String,"\\n"
15635
15649
];
15636
15650
"$x" ==*
15637
- [0,0,0,2,Var ,"x"];
15651
+ [0,0,0,2,var ,"x"];
15638
15652
15639
15653
15640
15654
"\n$x\n" ==*
15641
15655
[
15642
15656
0,0,1,0,String,"\\n";
15643
- 1,0,1,2,Var ,"x";
15657
+ 1,0,1,2,var ,"x";
15644
15658
1,2,2,0,String,"\\n"
15645
15659
]
15646
15660
end;
@@ -15649,27 +15663,27 @@ let suites =
15649
15663
"\n$(x_this_is_cool) " ==*
15650
15664
[
15651
15665
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";
15653
15667
1,17,1,18,String, " "
15654
15668
]
15655
15669
end;
15656
15670
__LOC__ >:: begin fun _ ->
15657
15671
" $x + $y = $sum " ==*
15658
15672
[
15659
15673
0,0,0,1,String , " ";
15660
- 0,1,0,3,Var , "x";
15674
+ 0,1,0,3,var , "x";
15661
15675
0,3,0,6,String, " + ";
15662
- 0,6,0,8,Var , "y";
15676
+ 0,6,0,8,var , "y";
15663
15677
0,8,0,11,String, " = ";
15664
- 0,11,0,15,Var , "sum";
15678
+ 0,11,0,15,var , "sum";
15665
15679
0,15,0,16,String, " "
15666
15680
]
15667
15681
end;
15668
15682
__LOC__ >:: begin fun _ ->
15669
15683
"中文 | $a " ==*
15670
15684
[
15671
15685
0,0,0,5,String, "中文 | ";
15672
- 0,5,0,7,Var , "a";
15686
+ 0,5,0,7,var , "a";
15673
15687
0,7,0,8,String, " "
15674
15688
]
15675
15689
end
@@ -15678,14 +15692,14 @@ let suites =
15678
15692
{|Hello \\$world|} ==*
15679
15693
[
15680
15694
0,0,0,8,String,"Hello \\\\";
15681
- 0,8,0,14,Var , "world"
15695
+ 0,8,0,14,var , "world"
15682
15696
]
15683
15697
end
15684
15698
;
15685
15699
__LOC__ >:: begin fun _ ->
15686
15700
{|$x)|} ==*
15687
15701
[
15688
- 0,0,0,2,Var ,"x";
15702
+ 0,0,0,2,var ,"x";
15689
15703
0,2,0,3,String,")"
15690
15704
]
15691
15705
end;
0 commit comments