Skip to content

Commit f3dbf56

Browse files
committed
Fix for parsing prop=!value
This was misparsed as `=!` infix op, which is not disallowed.
1 parent 3d0c49c commit f3dbf56

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

mlx/lexer.mll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,8 @@ let identchar_latin1 =
340340

341341
let symbolchar =
342342
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~']
343+
let symbolchar_no_prefix =
344+
['$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~']
343345
let symbolchar_no_greater =
344346
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '?' '@' '^' '|' '~']
345347
let symbolchar_no_less =
@@ -576,7 +578,9 @@ rule token = parse
576578
{ PREFIXOP op }
577579
| ['~' '?'] symbolchar_or_hash + as op
578580
{ PREFIXOP op }
579-
| ['=' '<' '|' '&' '$'] symbolchar * as op
581+
| ['<' '|' '&' '$'] symbolchar * as op
582+
{ INFIXOP0 op }
583+
| '=' symbolchar_no_prefix * as op
580584
{ INFIXOP0 op }
581585
| ">" symbolchar_no_less * as op
582586
{ INFIXOP0 op }

ocamlmerlin_mlx/preprocess/lexer_raw.mll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ let symbolchar =
354354
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~']
355355
let symbolcharnopercent =
356356
['!' '$' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~']
357+
let symbolchar_no_prefix =
358+
['$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~']
357359
let symbolchar_no_greater =
358360
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '?' '@' '^' '|' '~']
359361
let symbolchar_no_less =
@@ -608,7 +610,10 @@ rule token state = parse
608610
{ return (PREFIXOP op) }
609611
| ['~' '?'] symbolchar_or_hash + as op
610612
{ return (PREFIXOP op) }
611-
| ['=' '<' '|' '&' '$'] symbolchar * as op
613+
| ['<' '|' '&' '$'] symbolchar * as op
614+
{ return (keyword_or state op
615+
(INFIXOP0 op)) }
616+
| '=' symbolchar_no_prefix * as op
612617
{ return (keyword_or state op
613618
(INFIXOP0 op)) }
614619
| ">" symbolchar_no_less * as op

test/mlx.t

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
MERLIN
6060
let _ = Hello.Ok.createElement () ~children:[ world ] [@JSX]
6161

62+
Expected error (tag mismatch):
63+
6264
$ echo 'let _ = <one>world</two>' | ./mlx
6365
BATCH
6466
File "*stdin*", line 1, characters 18-24:
@@ -71,3 +73,45 @@
7173
Error: Syntax error: '</one>' expected
7274
This '<one>' might be unmatched
7375

76+
Some tests for prop expressions:
77+
78+
$ echo 'let _ = <element prop=`Some />' | ./mlx
79+
BATCH
80+
let _ = element () ~children:[] ~prop:`Some [@JSX]
81+
MERLIN
82+
let _ = element () ~children:[] ~prop:`Some [@JSX]
83+
$ echo 'let _ = <element prop=Some.value />' | ./mlx
84+
BATCH
85+
let _ = element () ~children:[] ~prop:Some.value [@JSX]
86+
MERLIN
87+
let _ = element () ~children:[] ~prop:Some.value [@JSX]
88+
$ echo 'let _ = <element prop=() />' | ./mlx
89+
BATCH
90+
let _ = element () ~children:[] ~prop:() [@JSX]
91+
MERLIN
92+
let _ = element () ~children:[] ~prop:() [@JSX]
93+
$ echo 'let _ = <element prop=(1+2) />' | ./mlx
94+
BATCH
95+
let _ = element () ~children:[] ~prop:(1 + 2) [@JSX]
96+
MERLIN
97+
let _ = element () ~children:[] ~prop:(1 + 2) [@JSX]
98+
$ echo 'let _ = <element prop=[] />' | ./mlx
99+
BATCH
100+
let _ = element () ~children:[] ~prop:[] [@JSX]
101+
MERLIN
102+
let _ = element () ~children:[] ~prop:[] [@JSX]
103+
$ echo 'let _ = <element prop=name#obj />' | ./mlx
104+
BATCH
105+
let _ = element () ~children:[] ~prop:name#obj [@JSX]
106+
MERLIN
107+
let _ = element () ~children:[] ~prop:name#obj [@JSX]
108+
$ echo 'let _ = <element prop=!ref />' | ./mlx
109+
BATCH
110+
let _ = element () ~children:[] ~prop:!ref [@JSX]
111+
MERLIN
112+
let _ = element () ~children:[] ~prop:!ref [@JSX]
113+
$ echo 'let _ = <element prop=!?ref />' | ./mlx
114+
BATCH
115+
let _ = element () ~children:[] ~prop:!?ref [@JSX]
116+
MERLIN
117+
let _ = element () ~children:[] ~prop:!?ref [@JSX]

0 commit comments

Comments
 (0)