Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit 0897bfe

Browse files
committed
Fix location of template expressions.
See rescript-lang/rescript-vscode#483
1 parent 3e8bafb commit 0897bfe

File tree

5 files changed

+75
-77
lines changed

5 files changed

+75
-77
lines changed

src/res_core.ml

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ let parseTemplateConstant ~prefix (p : Parser.t) =
815815
let startPos = p.startPos in
816816
Parser.nextTemplateLiteralToken p;
817817
match p.token with
818-
| TemplateTail txt ->
818+
| TemplateTail (txt, _) ->
819819
Parser.next p;
820820
Parsetree.Pconst_string (txt, prefix)
821821
| _ ->
@@ -2147,36 +2147,34 @@ and parseTemplateExpr ?(prefix = "js") p =
21472147
let op = Location.mknoloc (Longident.Lident "^") in
21482148
Ast_helper.Exp.ident op
21492149
in
2150-
let rec parseParts acc =
2150+
let concat (e1 : Parsetree.expression) (e2 : Parsetree.expression) =
2151+
let loc = mkLoc e1.pexp_loc.loc_start e2.pexp_loc.loc_end in
2152+
Ast_helper.Exp.apply ~attrs:[templateLiteralAttr] ~loc hiddenOperator
2153+
[(Nolabel, e1); (Nolabel, e2)]
2154+
in
2155+
let rec parseParts (acc : Parsetree.expression) =
21512156
let startPos = p.Parser.startPos in
21522157
Parser.nextTemplateLiteralToken p;
21532158
match p.token with
2154-
| TemplateTail txt ->
2159+
| TemplateTail (txt, lastPos) ->
21552160
Parser.next p;
2156-
let loc = mkLoc startPos p.prevEndPos in
2161+
let loc = mkLoc startPos lastPos in
21572162
let str =
21582163
Ast_helper.Exp.constant ~attrs:[templateLiteralAttr] ~loc
21592164
(Pconst_string (txt, Some prefix))
21602165
in
2161-
Ast_helper.Exp.apply ~attrs:[templateLiteralAttr] ~loc hiddenOperator
2162-
[(Nolabel, acc); (Nolabel, str)]
2163-
| TemplatePart txt ->
2166+
concat acc str
2167+
| TemplatePart (txt, lastPos) ->
21642168
Parser.next p;
2165-
let loc = mkLoc startPos p.prevEndPos in
2169+
let loc = mkLoc startPos lastPos in
21662170
let expr = parseExprBlock p in
2167-
let fullLoc = mkLoc startPos p.prevEndPos in
21682171
let str =
21692172
Ast_helper.Exp.constant ~attrs:[templateLiteralAttr] ~loc
21702173
(Pconst_string (txt, Some prefix))
21712174
in
21722175
let next =
2173-
let a =
2174-
Ast_helper.Exp.apply ~attrs:[templateLiteralAttr] ~loc:fullLoc
2175-
hiddenOperator
2176-
[(Nolabel, acc); (Nolabel, str)]
2177-
in
2178-
Ast_helper.Exp.apply ~loc:fullLoc hiddenOperator
2179-
[(Nolabel, a); (Nolabel, expr)]
2176+
let a = concat acc str in
2177+
concat a expr
21802178
in
21812179
parseParts next
21822180
| token ->
@@ -2186,25 +2184,20 @@ and parseTemplateExpr ?(prefix = "js") p =
21862184
let startPos = p.startPos in
21872185
Parser.nextTemplateLiteralToken p;
21882186
match p.token with
2189-
| TemplateTail txt ->
2187+
| TemplateTail (txt, lastPos) ->
21902188
Parser.next p;
21912189
Ast_helper.Exp.constant ~attrs:[templateLiteralAttr]
2192-
~loc:(mkLoc startPos p.prevEndPos)
2190+
~loc:(mkLoc startPos lastPos)
21932191
(Pconst_string (txt, Some prefix))
2194-
| TemplatePart txt ->
2192+
| TemplatePart (txt, lastPos) ->
21952193
Parser.next p;
2196-
let constantLoc = mkLoc startPos p.prevEndPos in
2194+
let constantLoc = mkLoc startPos lastPos in
21972195
let expr = parseExprBlock p in
2198-
let fullLoc = mkLoc startPos p.prevEndPos in
21992196
let str =
22002197
Ast_helper.Exp.constant ~attrs:[templateLiteralAttr] ~loc:constantLoc
22012198
(Pconst_string (txt, Some prefix))
22022199
in
2203-
let next =
2204-
Ast_helper.Exp.apply ~attrs:[templateLiteralAttr] ~loc:fullLoc
2205-
hiddenOperator
2206-
[(Nolabel, str); (Nolabel, expr)]
2207-
in
2200+
let next = concat str expr in
22082201
parseParts next
22092202
| token ->
22102203
Parser.err p (Diagnostics.unexpected token p.breadcrumbs);

src/res_scanner.ml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -587,12 +587,15 @@ let scanTemplateLiteralToken scanner =
587587
let startPos = position scanner in
588588

589589
let rec scan () =
590+
let lastPos = position scanner in
590591
match scanner.ch with
591592
| '`' ->
592593
next scanner;
593-
Token.TemplateTail
594-
((String.sub [@doesNotRaise]) scanner.src startOff
595-
(scanner.offset - 1 - startOff))
594+
let contents =
595+
(String.sub [@doesNotRaise]) scanner.src startOff
596+
(scanner.offset - 1 - startOff)
597+
in
598+
Token.TemplateTail (contents, lastPos)
596599
| '$' -> (
597600
match peek scanner with
598601
| '{' ->
@@ -601,7 +604,7 @@ let scanTemplateLiteralToken scanner =
601604
(String.sub [@doesNotRaise]) scanner.src startOff
602605
(scanner.offset - 2 - startOff)
603606
in
604-
Token.TemplatePart contents
607+
Token.TemplatePart (contents, lastPos)
605608
| _ ->
606609
next scanner;
607610
scan ())
@@ -617,9 +620,11 @@ let scanTemplateLiteralToken scanner =
617620
| ch when ch = hackyEOFChar ->
618621
let endPos = position scanner in
619622
scanner.err ~startPos ~endPos Diagnostics.unclosedTemplate;
620-
Token.TemplateTail
621-
((String.sub [@doesNotRaise]) scanner.src startOff
622-
(max (scanner.offset - 1 - startOff) 0))
623+
let contents =
624+
(String.sub [@doesNotRaise]) scanner.src startOff
625+
(max (scanner.offset - 1 - startOff) 0)
626+
in
627+
Token.TemplateTail (contents, lastPos)
623628
| _ ->
624629
next scanner;
625630
scan ()

src/res_token.ml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ type t =
8888
| PercentPercent
8989
| Comment of Comment.t
9090
| List
91-
| TemplateTail of string
92-
| TemplatePart of string
91+
| TemplateTail of string * Lexing.position
92+
| TemplatePart of string * Lexing.position
9393
| Backtick
9494
| BarGreater
9595
| Try
@@ -198,8 +198,8 @@ let toString = function
198198
| PercentPercent -> "%%"
199199
| Comment c -> "Comment" ^ Comment.toString c
200200
| List -> "list{"
201-
| TemplatePart text -> text ^ "${"
202-
| TemplateTail text -> "TemplateTail(" ^ text ^ ")"
201+
| TemplatePart (text, _) -> text ^ "${"
202+
| TemplateTail (text, _) -> "TemplateTail(" ^ text ^ ")"
203203
| Backtick -> "`"
204204
| BarGreater -> "|>"
205205
| Try -> "try"

tests/parsing/errors/structure/expected/gh16B.res.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ let log msg =
1919
(((((({js|> Server: |js})[@res.template ]) ^ msg)[@res.template ]) ^
2020
(({js||js})[@res.template ]))[@res.template ])
2121
;;log
22-
(((((((((((({js|Running on: |js})[@res.template ]) ^ address.address)
23-
[@res.template ]) ^ (({js|:|js})[@res.template ]))
24-
[@res.template ]) ^ (address.port |. string_of_int))
25-
^ (({js| (|js})[@res.template ]))
26-
[@res.template ]) ^ address.family)
27-
^ (({js|)|js})[@res.template ]))[@res.template ])
22+
(((((((((((((({js|Running on: |js})[@res.template ]) ^ address.address)
23+
[@res.template ]) ^ (({js|:|js})[@res.template ]))
24+
[@res.template ]) ^ (address.port |. string_of_int))
25+
[@res.template ]) ^ (({js| (|js})[@res.template ]))
26+
[@res.template ]) ^ address.family)
27+
[@res.template ]) ^ (({js|)|js})[@res.template ]))[@res.template ])
2828
module ClientSet =
2929
struct
3030
module T =

tests/parsing/grammar/expressions/expected/es6template.res.txt

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,46 +33,46 @@ let s =
3333
(({js| after|js})[@res.template ]))
3434
[@res.template ])
3535
let s =
36-
((((((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^ (({js||js})
37-
[@res.template ]))
38-
[@res.template ]) ^ bar)
39-
^ (({js||js})[@res.template ]))
36+
(((((((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^ (({js||js})
37+
[@res.template ]))
38+
[@res.template ]) ^ bar)
39+
[@res.template ]) ^ (({js||js})[@res.template ]))
4040
[@res.template ])
4141
let s =
42-
(((((((((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^
43-
(({js||js})[@res.template ]))
44-
[@res.template ]) ^ bar)
45-
^ (({js||js})[@res.template ]))
46-
[@res.template ]) ^ baz)
47-
^ (({js||js})[@res.template ]))
42+
(((((((((((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^
43+
(({js||js})[@res.template ]))
44+
[@res.template ]) ^ bar)
45+
[@res.template ]) ^ (({js||js})[@res.template ]))
46+
[@res.template ]) ^ baz)
47+
[@res.template ]) ^ (({js||js})[@res.template ]))
4848
[@res.template ])
4949
let s =
50-
((((((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^ (({js| |js})
51-
[@res.template ]))
52-
[@res.template ]) ^ bar)
53-
^ (({js||js})[@res.template ]))
50+
(((((((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^ (({js| |js})
51+
[@res.template ]))
52+
[@res.template ]) ^ bar)
53+
[@res.template ]) ^ (({js||js})[@res.template ]))
5454
[@res.template ])
5555
let s =
56-
(((((((((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^
57-
(({js| |js})[@res.template ]))
58-
[@res.template ]) ^ bar)
59-
^ (({js| |js})[@res.template ]))
60-
[@res.template ]) ^ baz)
61-
^ (({js||js})[@res.template ]))
56+
(((((((((((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^
57+
(({js| |js})[@res.template ]))
58+
[@res.template ]) ^ bar)
59+
[@res.template ]) ^ (({js| |js})[@res.template ]))
60+
[@res.template ]) ^ baz)
61+
[@res.template ]) ^ (({js||js})[@res.template ]))
6262
[@res.template ])
6363
let s =
64-
((((((((({js| before |js})[@res.template ]) ^ foo)[@res.template ]) ^
65-
(({js| |js})[@res.template ]))
66-
[@res.template ]) ^ bar)
67-
^ (({js| after |js})[@res.template ]))
64+
(((((((((({js| before |js})[@res.template ]) ^ foo)[@res.template ]) ^
65+
(({js| |js})[@res.template ]))
66+
[@res.template ]) ^ bar)
67+
[@res.template ]) ^ (({js| after |js})[@res.template ]))
6868
[@res.template ])
6969
let s =
70-
(((((((((((({js|before |js})[@res.template ]) ^ foo)[@res.template ]) ^
71-
(({js| middle |js})[@res.template ]))
72-
[@res.template ]) ^ bar)
73-
^ (({js| |js})[@res.template ]))
74-
[@res.template ]) ^ baz)
75-
^ (({js| wow |js})[@res.template ]))
70+
(((((((((((((({js|before |js})[@res.template ]) ^ foo)[@res.template ]) ^
71+
(({js| middle |js})[@res.template ]))
72+
[@res.template ]) ^ bar)
73+
[@res.template ]) ^ (({js| |js})[@res.template ]))
74+
[@res.template ]) ^ baz)
75+
[@res.template ]) ^ (({js| wow |js})[@res.template ]))
7676
[@res.template ])
7777
let s =
7878
(({js|
@@ -93,10 +93,10 @@ let s = (({js|$dollar without $braces $interpolation|js})[@res.template ])
9393
let s = (({json|null|json})[@res.template ])
9494
let x = (({js|foo\`bar\$\\foo|js})[@res.template ])
9595
let x =
96-
((((((((({js|foo\`bar\$\\foo|js})[@res.template ]) ^ a)[@res.template ]) ^
97-
(({js| \` |js})[@res.template ]))
98-
[@res.template ]) ^ b)
99-
^ (({js| \` xx|js})[@res.template ]))
96+
(((((((((({js|foo\`bar\$\\foo|js})[@res.template ]) ^ a)[@res.template ]) ^
97+
(({js| \` |js})[@res.template ]))
98+
[@res.template ]) ^ b)
99+
[@res.template ]) ^ (({js| \` xx|js})[@res.template ]))
100100
[@res.template ])
101101
let thisIsFine = (({js|$something|js})[@res.template ])
102102
let thisIsAlsoFine = (({js|fine\$|js})[@res.template ])

0 commit comments

Comments
 (0)