Skip to content

Commit 7c1a037

Browse files
committed
AST: represent concatenation internally as "++" instead of "^".
1 parent 43389c9 commit 7c1a037

File tree

19 files changed

+86
-87
lines changed

19 files changed

+86
-87
lines changed

compiler/syntax/src/res_core.ml

+2-3
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,7 @@ let build_longident words =
391391

392392
let make_infix_operator (p : Parser.t) token start_pos end_pos =
393393
let stringified_token =
394-
if token = Token.PlusPlus then "^"
395-
else if token = Token.BangEqual then "<>"
394+
if token = Token.BangEqual then "<>"
396395
else if token = Token.BangEqualEqual then "!="
397396
else if token = Token.Equal then (
398397
(* TODO: could have a totally different meaning like x->fooSet(y)*)
@@ -2327,7 +2326,7 @@ and parse_template_expr ?prefix p =
23272326
in
23282327

23292328
let hidden_operator =
2330-
let op = Location.mknoloc (Longident.Lident "^") in
2329+
let op = Location.mknoloc (Longident.Lident "++") in
23312330
Ast_helper.Exp.ident op
23322331
in
23332332
let concat (e1 : Parsetree.expression) (e2 : Parsetree.expression) =

compiler/syntax/src/res_parens.ml

+2-2
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ let rhs_binary_expr_operand parent_operator rhs =
162162
args = [(_, _left); (_, _right)];
163163
}
164164
when ParsetreeViewer.is_binary_operator operator
165-
&& not (operator_loc.loc_ghost && operator = "^") ->
165+
&& not (operator_loc.loc_ghost && operator = "++") ->
166166
let prec_parent = ParsetreeViewer.operator_precedence parent_operator in
167167
let prec_child = ParsetreeViewer.operator_precedence operator in
168168
prec_parent == prec_child
@@ -180,7 +180,7 @@ let flatten_operand_rhs parent_operator rhs =
180180
args = [(_, _left); (_, _right)];
181181
}
182182
when ParsetreeViewer.is_binary_operator operator
183-
&& not (operator_loc.loc_ghost && operator = "^") ->
183+
&& not (operator_loc.loc_ghost && operator = "++") ->
184184
let prec_parent = ParsetreeViewer.operator_precedence parent_operator in
185185
let prec_child = ParsetreeViewer.operator_precedence operator in
186186
prec_parent >= prec_child || rhs.pexp_attributes <> []

compiler/syntax/src/res_parsetree_viewer.ml

+5-5
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ let operator_precedence operator =
271271
| "||" -> 2
272272
| "&&" -> 3
273273
| "=" | "==" | "<" | ">" | "!=" | "<>" | "!==" | "<=" | ">=" | "|>" -> 4
274-
| "+" | "+." | "-" | "-." | "^" -> 5
274+
| "+" | "+." | "-" | "-." | "++" -> 5
275275
| "*" | "*." | "/" | "/." | "%" -> 6
276276
| "**" -> 7
277277
| "#" | "##" | "->" -> 8
@@ -297,8 +297,8 @@ let is_unary_expression expr =
297297
let is_binary_operator operator =
298298
match operator with
299299
| ":=" | "||" | "&&" | "=" | "==" | "<" | ">" | "!=" | "!==" | "<=" | ">="
300-
| "|>" | "+" | "+." | "-" | "-." | "^" | "*" | "*." | "/" | "/." | "**" | "->"
301-
| "<>" | "%" ->
300+
| "|>" | "+" | "+." | "-" | "-." | "++" | "*" | "*." | "/" | "/." | "**"
301+
| "->" | "<>" | "%" ->
302302
true
303303
| _ -> false
304304

@@ -314,7 +314,7 @@ let is_binary_expression expr =
314314
args = [(Nolabel, _operand1); (Nolabel, _operand2)];
315315
}
316316
when is_binary_operator operator
317-
&& not (operator_loc.loc_ghost && operator = "^")
317+
&& not (operator_loc.loc_ghost && operator = "++")
318318
(* template literal *) ->
319319
true
320320
| _ -> false
@@ -643,7 +643,7 @@ let is_template_literal expr =
643643
match expr.pexp_desc with
644644
| Pexp_apply
645645
{
646-
funct = {pexp_desc = Pexp_ident {txt = Longident.Lident "^"}};
646+
funct = {pexp_desc = Pexp_ident {txt = Longident.Lident "++"}};
647647
args = [(Nolabel, _); (Nolabel, _)];
648648
}
649649
when has_template_literal_attr expr.pexp_attributes ->

compiler/syntax/src/res_printer.ml

+2-3
Original file line numberDiff line numberDiff line change
@@ -3557,7 +3557,7 @@ and print_template_literal ~state expr cmt_tbl =
35573557
match expr.pexp_desc with
35583558
| Pexp_apply
35593559
{
3560-
funct = {pexp_desc = Pexp_ident {txt = Longident.Lident "^"}};
3560+
funct = {pexp_desc = Pexp_ident {txt = Longident.Lident "++"}};
35613561
args = [(Nolabel, arg1); (Nolabel, arg2)];
35623562
} ->
35633563
let lhs = walk_expr arg1 in
@@ -3664,7 +3664,6 @@ and print_binary_expression ~state (expr : Parsetree.expression) cmt_tbl =
36643664
let print_binary_operator ~inline_rhs operator =
36653665
let operator_txt =
36663666
match operator with
3667-
| "^" -> "++"
36683667
| "=" -> "=="
36693668
| "==" -> "==="
36703669
| "<>" -> "!="
@@ -3800,7 +3799,7 @@ and print_binary_expression ~state (expr : Parsetree.expression) cmt_tbl =
38003799
match expr.pexp_desc with
38013800
| Pexp_apply
38023801
{
3803-
funct = {pexp_desc = Pexp_ident {txt = Longident.Lident "^"; loc}};
3802+
funct = {pexp_desc = Pexp_ident {txt = Longident.Lident "++"; loc}};
38043803
args = [(Nolabel, _); (Nolabel, _)];
38053804
}
38063805
when loc.loc_ghost ->

runtime/Pervasives.res

+1-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ let classify_float = (x: float): fpclass =>
230230

231231
/* String and byte sequence operations -- more in modules String and Bytes */
232232

233-
external \"^": (string, string) => string = "%string_concat"
233+
external \"++": (string, string) => string = "%string_concat"
234234

235235
/* Character operations -- more in module Char */
236236

runtime/Pervasives_mini.res

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ external \"/.": (float, float) => float = "%divfloat"
7878

7979
/* String operations */
8080

81-
external \"^": (string, string) => string = "%string_concat"
81+
external \"++": (string, string) => string = "%string_concat"
8282

8383
/* Unit operations */
8484

tests/build_tests/super_errors/expected/primitives2.res.expected

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
3 │
88

99
This has type: int
10-
But this function argument is expecting: string
10+
But it's expected to have type: string
1111

1212
You can convert int to string with Belt.Int.toString.

tests/build_tests/super_errors/expected/unicode_location.res.expected

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
3 │
99

1010
This has type: int
11-
But this function argument is expecting: string
11+
But it's expected to have type: string
1212

1313
You can convert int to string with Belt.Int.toString.

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ let wss = Server.make { port = 82 }
1616
let address = wss -> Server.address
1717
let log [arity:1]msg =
1818
Js.log
19-
(((((({js|> Server: |js})[@res.template ]) ^ msg)[@res.template ]) ^
19+
(((((({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-
[@res.template ]) ^ (({js| (|js})[@res.template ]))
26-
[@res.template ]) ^ address.family)
27-
[@res.template ]) ^ (({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/syntax_tests/data/parsing/grammar/expressions/expected/async.res.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
let greetUser async [arity:1]userId =
22
((let name = ((getUserName userId)[@res.await ]) in
3-
({js|Hello |js} ^ name) ^ {js|!|js})
3+
({js|Hello |js} ++ name) ++ {js|!|js})
44
[@res.braces ])
55
;;async fun [arity:1]() -> 123
66
let fetch = ((async fun [arity:1]url -> browserFetch url)[@res.braces ])

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

+40-40
Original file line numberDiff line numberDiff line change
@@ -5,74 +5,74 @@ let s = (({js|multi
55
string
66
|js})[@res.template ])
77
let s =
8-
(((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^ (({js||js})
8+
(((((({js||js})[@res.template ]) ++ foo)[@res.template ]) ++ (({js||js})
99
[@res.template ]))
1010
[@res.template ])
1111
let s =
12-
(((((({js|before|js})[@res.template ]) ^ foo)[@res.template ]) ^
12+
(((((({js|before|js})[@res.template ]) ++ foo)[@res.template ]) ++
1313
(({js||js})[@res.template ]))
1414
[@res.template ])
1515
let s =
16-
(((((({js|before |js})[@res.template ]) ^ foo)[@res.template ]) ^
16+
(((((({js|before |js})[@res.template ]) ++ foo)[@res.template ]) ++
1717
(({js||js})[@res.template ]))
1818
[@res.template ])
1919
let s =
20-
(((((({js|before |js})[@res.template ]) ^ foo)[@res.template ]) ^
20+
(((((({js|before |js})[@res.template ]) ++ foo)[@res.template ]) ++
2121
(({js||js})[@res.template ]))
2222
[@res.template ])
2323
let s =
24-
(((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^ (({js|after|js})
25-
[@res.template ]))
24+
(((((({js||js})[@res.template ]) ++ foo)[@res.template ]) ++
25+
(({js|after|js})[@res.template ]))
2626
[@res.template ])
2727
let s =
28-
(((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^
28+
(((((({js||js})[@res.template ]) ++ foo)[@res.template ]) ++
2929
(({js| after|js})[@res.template ]))
3030
[@res.template ])
3131
let s =
32-
(((((({js||js})[@res.template ]) ^ foo)[@res.template ]) ^
32+
(((((({js||js})[@res.template ]) ++ foo)[@res.template ]) ++
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-
[@res.template ]) ^ (({js||js})[@res.template ]))
36+
(((((((((({js||js})[@res.template ]) ++ foo)[@res.template ]) ++
37+
(({js||js})[@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 ]) ^
42+
(((((((((((((({js||js})[@res.template ]) ++ foo)[@res.template ]) ++
4343
(({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 ]))
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-
[@res.template ]) ^ (({js||js})[@res.template ]))
50+
(((((((((({js||js})[@res.template ]) ++ foo)[@res.template ]) ++
51+
(({js| |js})[@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 ]) ^
56+
(((((((((((((({js||js})[@res.template ]) ++ foo)[@res.template ]) ++
5757
(({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 ]))
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 ]) ^
64+
(((((((((({js| before |js})[@res.template ]) ++ foo)[@res.template ]) ++
6565
(({js| |js})[@res.template ]))
66-
[@res.template ]) ^ bar)
67-
[@res.template ]) ^ (({js| after |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 ]) ^
70+
(((((((((((((({js|before |js})[@res.template ]) ++ foo)[@res.template ]) ++
7171
(({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 ]))
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,15 +93,15 @@ 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-
[@res.template ]) ^ (({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 ])
103103
let isThisFine = (({js|shouldBeFine$|js})[@res.template ])
104-
;;(((((({js|$|js})[@res.template ]) ^ dollarAmountInt)[@res.template ]) ^
104+
;;(((((({js|$|js})[@res.template ]) ++ dollarAmountInt)[@res.template ]) ++
105105
(({js||js})[@res.template ]))[@res.template ])
106-
;;(((((({js|\$|js})[@res.template ]) ^ dollarAmountInt)[@res.template ]) ^
106+
;;(((((({js|\$|js})[@res.template ]) ++ dollarAmountInt)[@res.template ]) ++
107107
(({js||js})[@res.template ]))[@res.template ])

tests/syntax_tests/data/parsing/grammar/expressions/expected/infix.res.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
;;a -> (f b)
2-
;;{js|string1|js} ^ {js|string2|js}
2+
;;{js|string1|js} ++ {js|string2|js}
33
;;a <> b
44
;;a != b
55
;;a = b

tests/syntax_tests/data/parsing/grammar/expressions/expected/jsx.res.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -534,8 +534,9 @@ let _ =
534534
let _ =
535535
((div
536536
~children:[(((let left = limit -> Int.toString in
537-
(((((({js||js})[@res.template ]) ^ left)[@res.template ])
538-
^ (({js| characters left|js})[@res.template ]))
537+
(((((({js||js})[@res.template ]) ++ left)
538+
[@res.template ]) ++ (({js| characters left|js})
539+
[@res.template ]))
539540
[@res.template ]) -> React.string))
540541
[@res.braces ])] ())
541542
[@JSX ])

tests/syntax_tests/data/parsing/grammar/expressions/expected/parenthesized.res.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ let constructor = None
66
let longidentConstructor = Option.None
77
let txt = {js|a string|js}
88
let otherTxt =
9-
(((((({js|foo bar |js})[@res.template ]) ^ txt)[@res.template ]) ^
9+
(((((({js|foo bar |js})[@res.template ]) ++ txt)[@res.template ]) ++
1010
(({js||js})[@res.template ]))
1111
[@res.template ])
1212
let ident = myIdent

tests/syntax_tests/data/parsing/other/expected/stringLiterals.res.txt

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
let s = {js|some unicode é £ |js}
22
let s = (({js|foo|js})[@res.template ])
33
let s =
4-
(((((({js|foo |js})[@res.template ]) ^ bar)[@res.template ]) ^
4+
(((((({js|foo |js})[@res.template ]) ++ bar)[@res.template ]) ++
55
(({js| baz|js})[@res.template ]))
66
[@res.template ])
77
let s =
8-
(((((({js|some unicode é |js})[@res.template ]) ^ bar)[@res.template ]) ^
9-
(({js| £ |js})[@res.template ]))
8+
(((((({js|some unicode é |js})[@res.template ]) ++ bar)[@res.template ])
9+
++ (({js| £ |js})[@res.template ]))
1010
[@res.template ])
1111
let s = ((x [|(({js|foo|js})[@res.template ])|] [||])[@res.taggedTemplate ])
1212
let s =

tests/syntax_tests/data/parsing/recovery/string/expected/es6template.res.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
Did you forget to close this template expression with a backtick?
99

1010
let x =
11-
(((((({js|this contains |js})[@res.template ]) ^ foo)[@res.template ]) ^
11+
(((((({js|this contains |js})[@res.template ]) ++ foo)[@res.template ]) ++
1212
(({js|, missing closing|js})[@res.template ]))
1313
[@res.template ])

tests/tests/src/bs_mutable_set_test.res

+4-4
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ include (
117117
let () = {
118118
let aa = f(I.randomRange(0, 100))
119119
let bb = f(I.randomRange(40, 120))
120-
let cc = \"++"(aa, bb)
120+
let cc = aa ++ bb
121121
b(__LOC__, \"=~"(cc, f(I.randomRange(0, 120))))
122122

123123
b(
@@ -170,15 +170,15 @@ let () = {
170170
}
171171

172172
let () = {
173-
let u = \"++"(I.randomRange(30, 100), I.randomRange(40, 120))
173+
let u = I.randomRange(30, 100) ++ I.randomRange(40, 120)
174174
let v = N.make()
175175
N.mergeMany(v, u)
176176
eq(__LOC__, N.size(v), 91)
177177
eq(__LOC__, N.toArray(v), I.range(30, 120))
178178
}
179179

180180
let () = {
181-
let u = \"++"(I.randomRange(0, 100_000), I.randomRange(0, 100))
181+
let u = I.randomRange(0, 100_000) ++ I.randomRange(0, 100)
182182
let v = N.fromArray(u)
183183
eq(__LOC__, N.size(v), 100_001)
184184
let u = I.randomRange(50_000, 80_000)
@@ -265,7 +265,7 @@ let \"=~" = N.eq
265265
let () = {
266266
let aa = f(I.randomRange(0, 100))
267267
let bb = f(I.randomRange(40, 120))
268-
let cc = \"++"(aa, bb)
268+
let cc = aa ++ bb
269269
b(__LOC__, \"=~"(cc, f(I.randomRange(0, 120))))
270270

271271
b(

tests/tests/src/bs_poly_mutable_set_test.res

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ let \"=~" = N.eq
111111
let () = {
112112
let aa = f(I.randomRange(0, 100))
113113
let bb = f(I.randomRange(40, 120))
114-
let cc = \"++"(aa, bb)
114+
let cc = aa ++ bb
115115
b(__LOC__, \"=~"(cc, f(I.randomRange(0, 120))))
116116

117117
b(

0 commit comments

Comments
 (0)