Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions formatTest/typeCheckedTests/expected_output/jsx.re
Original file line number Diff line number Diff line change
Expand Up @@ -613,3 +613,14 @@ let w =
let foo = None;

let g = <Two ?foo />;

/* https://github.com/facebook/reason/issues/1428 */
<Foo> ...element </Foo>;

<Foo> ...((a) => 1) </Foo>;

<Foo> ...<Foo2 /> </Foo>;

<Foo> ...[|a|] </Foo>;

<Foo> ...(1, 2) </Foo>;
11 changes: 11 additions & 0 deletions formatTest/typeCheckedTests/input/jsx.re
Original file line number Diff line number Diff line change
Expand Up @@ -411,3 +411,14 @@ let w =
let foo = None;

let g = <Two ?foo />;

/* https://github.com/facebook/reason/issues/1428 */
<Foo> ...element </Foo>;

<Foo> ...((a) => 1) </Foo>;

<Foo> ...<Foo2 /> </Foo>;

<Foo> ...[|a|] </Foo>;

<Foo> ...(1, 2) </Foo>;
34 changes: 0 additions & 34 deletions src/reason_parser.messages
Original file line number Diff line number Diff line change
@@ -1,34 +0,0 @@
implementation: PLUSDOT UIDENT ELSE
##
## Ends in an error in state: 1212.
##
## expr -> simple_expr_call . [ error STAR SLASHGREATER SEMI RPAREN RBRACKET RBRACE QUESTION PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LESSDOTDOTGREATER LESS LBRACKETAT INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## expr -> simple_expr_call . DOT label_longident EQUAL expr [ error STAR SLASHGREATER SEMI RPAREN RBRACKET RBRACE QUESTION PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LESSDOTDOTGREATER LESS LBRACKETAT INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## expr -> simple_expr_call . LBRACKET expr RBRACKET EQUAL expr [ error STAR SLASHGREATER SEMI RPAREN RBRACKET RBRACE QUESTION PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LESSDOTDOTGREATER LESS LBRACKETAT INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## expr -> simple_expr_call . DOT LBRACKET expr RBRACKET EQUAL expr [ error STAR SLASHGREATER SEMI RPAREN RBRACKET RBRACE QUESTION PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LESSDOTDOTGREATER LESS LBRACKETAT INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## expr -> simple_expr_call . DOT LBRACE expr RBRACE EQUAL expr [ error STAR SLASHGREATER SEMI RPAREN RBRACKET RBRACE QUESTION PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LESSDOTDOTGREATER LESS LBRACKETAT INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . POSTFIXOP [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . DOT label_longident [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . LBRACKET expr RBRACKET [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . LBRACKET expr error [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . DOT LBRACKET expr RBRACKET [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . DOT LBRACKET expr error [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . DOT LBRACE expr RBRACE [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . SHARP LIDENT [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . SHARPOP simple_expr_no_call [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
## simple_expr_call -> simple_expr_call . labeled_arguments [ error STAR SLASHGREATER SHARPOP SHARP SEMI RPAREN RBRACKET RBRACE QUESTION POSTFIXOP PLUSEQ PLUSDOT PLUS PERCENT OR MINUSDOT MINUS LPAREN LESSDOTDOTGREATER LESS LBRACKETLESS LBRACKETAT LBRACKET LBRACELESS LBRACE INFIXOP4 INFIXOP3 INFIXOP2 INFIXOP1 INFIXOP0 GREATERRBRACE GREATER EOF DOT DOCSTRING COMMA COLONGREATER COLONEQUAL COLON BARRBRACKET BARBAR BAR AND AMPERSAND AMPERAMPER ]
##
## The known suffix of the stack is as follows:
## simple_expr_call
##
## WARNING: This example involves spurious reductions.
## This implies that, although the LR(1) items shown above provide an
## accurate view of the past (what has been recognized so far), they
## may provide an INCOMPLETE view of the future (what was expected next).
## In state 1214, spurious reduction of production constr_longident -> mod_longident
## In state 1352, spurious reduction of production simple_expr_call -> constr_longident
##

When applying a function, don't forget to wrap the arguments in parens.
Example: `let two = add(1, 1);`

25 changes: 25 additions & 0 deletions src/reason_parser.mly
Original file line number Diff line number Diff line change
Expand Up @@ -2460,6 +2460,19 @@ jsx:
(Nolabel, mkexp_constructor_unit loc loc)
] loc
}
| jsx_start_tag_and_args GREATER DOTDOTDOT simple_expr_no_call LESSSLASHIDENTGREATER
(* <Foo> ...bar </Foo> or <Foo> ...((a) => 1) </Foo> *)
{ let (component, start) = $1 in
let loc = mklocation $symbolstartpos $endpos in
(* TODO: Make this tag check simply a warning *)
let endName = Longident.parse $5 in
let _ = ensureTagsAreEqual start endName loc in
let child = $4 in
component [
(Labelled "children", child);
(Nolabel, mkexp_constructor_unit loc loc)
] loc
}
;

jsx_without_leading_less:
Expand Down Expand Up @@ -2488,6 +2501,18 @@ jsx_without_leading_less:
(Nolabel, mkexp_constructor_unit loc loc)
] loc
}
| jsx_start_tag_and_args_without_leading_less GREATER DOTDOTDOT simple_expr_no_call LESSSLASHIDENTGREATER {
let (component, start) = $1 in
let loc = mklocation $symbolstartpos $endpos in
(* TODO: Make this tag check simply a warning *)
let endName = Longident.parse $5 in
let _ = ensureTagsAreEqual start endName loc in
let child = $4 in
component [
(Labelled "children", child);
(Nolabel, mkexp_constructor_unit loc loc)
] loc
}
;

/*
Expand Down
11 changes: 8 additions & 3 deletions src/reason_pprint_ast.ml
Original file line number Diff line number Diff line change
Expand Up @@ -3365,8 +3365,8 @@ class printer ()= object(self:'self)
the tag, then it would be consistent with array spread:
[...list] evaluates to the thing as list.
*)
let hasLabelledChildrenListLiteral = List.exists (function
| (Labelled "children", {pexp_desc = Pexp_construct ({txt = Lident "::" | Lident "[]"}, _)}) -> true
let hasLabelledChildrenLiteral = List.exists (function
| (Labelled "children", _) -> true
| _ -> false
) l in
let rec hasSingleNonLabelledUnitAndIsAtTheEnd l = match l with
Expand All @@ -3375,7 +3375,7 @@ class printer ()= object(self:'self)
| (Nolabel, _) :: rest -> false
| _ :: rest -> hasSingleNonLabelledUnitAndIsAtTheEnd rest
in
if hasLabelledChildrenListLiteral && hasSingleNonLabelledUnitAndIsAtTheEnd l then
if hasLabelledChildrenLiteral && hasSingleNonLabelledUnitAndIsAtTheEnd l then
let moduleNameList = List.rev (List.tl (List.rev (Longident.flatten loc.txt))) in
if List.length moduleNameList > 0 then
if Longident.last loc.txt = "createElement" then
Expand Down Expand Up @@ -3932,6 +3932,10 @@ class printer ()= object(self:'self)
processArguments tail processedAttrs None
| (Labelled "children", {pexp_desc = Pexp_construct ({txt = Lident"::"}, Some {pexp_desc = Pexp_tuple(components)} )}) :: tail ->
processArguments tail processedAttrs (self#formatChildren components [])
| (Labelled "children", expr) :: tail ->
let childLayout = self#simplifyUnparseExpr expr in
let dotdotdotChild = makeList ~break:Never [atom "..."; childLayout] in
processArguments tail processedAttrs (Some [dotdotdotChild])
| (Optional lbl, expression) :: tail ->
let nextAttr =
match expression.pexp_desc with
Expand Down Expand Up @@ -5237,6 +5241,7 @@ class printer ()= object(self:'self)
| [] -> match processedRev with
| [] -> None
| _::_ -> Some (List.rev processedRev)

method direction_flag = function
| Upto -> atom "to"
| Downto -> atom "downto"
Expand Down