From 2f287ffcdbc7e5cf1885aa5d6e3eb2c218909d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Cha=CC=81varri?= Date: Mon, 31 Aug 2020 01:14:39 +0200 Subject: [PATCH 1/2] Parse elements --- src/res_core.ml | 4 ++-- .../grammar/expressions/__snapshots__/parse.spec.js.snap | 1 + tests/parsing/grammar/expressions/jsx.js | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/res_core.ml b/src/res_core.ml index 7474c61f..c0844bfc 100644 --- a/src/res_core.ml +++ b/src/res_core.ml @@ -618,7 +618,7 @@ let verifyJsxOpeningClosingName p nameExpr = let closing = match p.Parser.token with | Lident lident -> Parser.next p; Longident.Lident lident | Uident _ -> - (parseModuleLongIdent ~lowercase:false p).txt + (parseModuleLongIdent ~lowercase:true p).txt | _ -> Longident.Lident "" in match nameExpr.Parsetree.pexp_desc with @@ -2422,7 +2422,7 @@ and parseJsxName p = let loc = mkLoc identStart identEnd in Location.mkloc (Longident.Lident ident) loc | Uident _ -> - let longident = parseModuleLongIdent ~lowercase:false p in + let longident = parseModuleLongIdent ~lowercase:true p in Location.mkloc (Longident.Ldot (longident.txt, "createElement")) longident.loc | _ -> let msg = "A jsx name should start with a lowercase or uppercase identifier, like: div in
or Navbar in " diff --git a/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap b/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap index 9b0b4860..04de62f7 100644 --- a/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap @@ -542,6 +542,7 @@ let _ = [@JSX ]) let _ = ((Navbar.createElement ~children:[] ())[@JSX ]) let _ = ((Nav.Navbar.createElement ~children:[] ())[@JSX ]) +let _ = ((Nav.navbar.createElement ~children:[] ())[@JSX ]) let _ = ((el ~punned:((punned)[@ns.namedArgLoc ]) ~children:[] ())[@JSX ]) let _ = ((el ?punned:((punned)[@ns.namedArgLoc ]) ~children:[] ())[@JSX ]) let _ = ((el ~punned:((punned)[@ns.namedArgLoc ]) ~children:[] ())[@JSX ]) diff --git a/tests/parsing/grammar/expressions/jsx.js b/tests/parsing/grammar/expressions/jsx.js index 12dac708..31dbe3ac 100644 --- a/tests/parsing/grammar/expressions/jsx.js +++ b/tests/parsing/grammar/expressions/jsx.js @@ -20,6 +20,7 @@ let _ =
Js.log("click")}>
let _ = let _ = +let _ = // punning let _ = From 6987427a7f9deeeb0d22cdee58b64eb2dd31b4d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Cha=CC=81varri?= Date: Thu, 3 Sep 2020 23:47:12 +0200 Subject: [PATCH 2/2] jsx: add parse, print and error tests --- .../__snapshots__/parse.spec.js.snap | 76 +++++++++++++++++++ tests/parsing/errors/expressions/jsx.js | 6 ++ .../__snapshots__/parse.spec.js.snap | 38 +++++++++- tests/parsing/grammar/expressions/jsx.js | 19 ++++- .../expr/__snapshots__/render.spec.js.snap | 2 + tests/printer/expr/jsx.js | 4 + 6 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 tests/parsing/errors/expressions/jsx.js diff --git a/tests/parsing/errors/expressions/__snapshots__/parse.spec.js.snap b/tests/parsing/errors/expressions/__snapshots__/parse.spec.js.snap index 216e3097..2904b2f2 100644 --- a/tests/parsing/errors/expressions/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/errors/expressions/__snapshots__/parse.spec.js.snap @@ -324,6 +324,82 @@ module LicenseList = struct end I'm not sure what to parse here when looking at \\"}\\". +========================================================" +`; + +exports[`jsx.js 1`] = ` +"=====Parsetree========================================== +let x = ((di ~children:[] ())[@JSX ]) - (v / ([%rescript.exprhole ])) +let x = ((Unclosed.createElement ~children:[] ())[@JSX ]) +let x = + ((Foo.Bar.createElement ~children:[] ())[@JSX ]) > ([%rescript.exprhole ]) +let x = + ((Foo.Bar.Baz.createElement ~children:[] ())[@JSX ]) > + ([%rescript.exprhole ]) +let x = + ((Foo.bar.createElement ~children:[] ())[@JSX ]) > ([%rescript.exprhole ]) +let x = + ((Foo.bar.createElement ~baz:((baz)[@ns.namedArgLoc ]) ~children:[] ()) + [@JSX ]) +=====Errors============================================= + + Syntax error! + parsing/errors/expressions/jsx.js 1:12 + 1 │ let x = + 2 │ let x = ; + 3 │ let x = ; + + I'm not sure what to parse here when looking at \\"-\\". + + Syntax error! + parsing/errors/expressions/jsx.js 2:20 + 1 │ let x = + 2 │ let x = ; + 3 │ let x = ; + 4 │ let x = + + Did you forget a \` + 2 │ let x = ; + 3 │ let x = ; + 4 │ let x = + 5 │ let x = + + Missing + + Syntax error! + parsing/errors/expressions/jsx.js 4:9-34 + 2 │ let x = ; + 3 │ let x = ; + 4 │ let x = + 5 │ let x = + 6 │ let x = + + Missing + + Syntax error! + parsing/errors/expressions/jsx.js 5:9-27 + 3 │ let x = ; + 4 │ let x = + 5 │ let x = + 6 │ let x = + 7 │ + + Missing + + Syntax error! + parsing/errors/expressions/jsx.js 6:17 + 4 │ let x = + 5 │ let x = + 6 │ let x = + 7 │ + + I'm not sure what to parse here when looking at \\".\\". + + ========================================================" `; diff --git a/tests/parsing/errors/expressions/jsx.js b/tests/parsing/errors/expressions/jsx.js new file mode 100644 index 00000000..b0fc1e86 --- /dev/null +++ b/tests/parsing/errors/expressions/jsx.js @@ -0,0 +1,6 @@ +let x = +let x = ; +let x = ; +let x = +let x = +let x = diff --git a/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap b/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap index 04de62f7..7023a8fe 100644 --- a/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap +++ b/tests/parsing/grammar/expressions/__snapshots__/parse.spec.js.snap @@ -541,8 +541,42 @@ let _ = ~children:[] ()) [@JSX ]) let _ = ((Navbar.createElement ~children:[] ())[@JSX ]) -let _ = ((Nav.Navbar.createElement ~children:[] ())[@JSX ]) -let _ = ((Nav.navbar.createElement ~children:[] ())[@JSX ]) +let _ = ((Navbar.createElement ~children:[] ())[@JSX ]) +let _ = ((Navbar.createElement ~children:[] ())[@JSX ]) +let _ = + ((Navbar.createElement ~className:((\\"menu\\")[@ns.namedArgLoc ]) ~children:[] + ()) + [@JSX ]) +let _ = ((Dot.Up.createElement ~children:[] ())[@JSX ]) +let _ = ((Dot.Up.createElement ~children:[] ())[@JSX ]) +let _ = ((Dot.Up.createElement ~children:[] ())[@JSX ]) +let _ = + ((Dot.Up.createElement + ~children:[((Dot.low.createElement ~children:[] ())[@JSX ])] ()) + [@JSX ]) +let _ = + ((Dot.Up.createElement + ~children:[((Dot.Up.createElement ~children:[] ())[@JSX ])] ()) + [@JSX ]) +let _ = + ((Dot.Up.createElement ~className:((\\"menu\\")[@ns.namedArgLoc ]) ~children:[] + ()) + [@JSX ]) +let _ = ((Dot.low.createElement ~children:[] ())[@JSX ]) +let _ = ((Dot.low.createElement ~children:[] ())[@JSX ]) +let _ = ((Dot.low.createElement ~children:[] ())[@JSX ]) +let _ = + ((Dot.low.createElement + ~children:[((Dot.Up.createElement ~children:[] ())[@JSX ])] ()) + [@JSX ]) +let _ = + ((Dot.low.createElement + ~children:[((Dot.low.createElement ~children:[] ())[@JSX ])] ()) + [@JSX ]) +let _ = + ((Dot.low.createElement ~className:((\\"menu\\")[@ns.namedArgLoc ]) + ~children:[] ()) + [@JSX ]) let _ = ((el ~punned:((punned)[@ns.namedArgLoc ]) ~children:[] ())[@JSX ]) let _ = ((el ?punned:((punned)[@ns.namedArgLoc ]) ~children:[] ())[@JSX ]) let _ = ((el ~punned:((punned)[@ns.namedArgLoc ]) ~children:[] ())[@JSX ]) diff --git a/tests/parsing/grammar/expressions/jsx.js b/tests/parsing/grammar/expressions/jsx.js index 31dbe3ac..9de13d8b 100644 --- a/tests/parsing/grammar/expressions/jsx.js +++ b/tests/parsing/grammar/expressions/jsx.js @@ -18,9 +18,24 @@ let _ =
let _ =
Js.log("click")}>
let _ =
Js.log("click")}>
+let _ = let _ = -let _ = -let _ = +let _ = +let _ = + +let _ = +let _ = +let _ = +let _ = +let _ = +let _ = + +let _ = +let _ = +let _ = +let _ = +let _ = +let _ = // punning let _ = diff --git a/tests/printer/expr/__snapshots__/render.spec.js.snap b/tests/printer/expr/__snapshots__/render.spec.js.snap index 8ca27d96..18fe902a 100644 --- a/tests/printer/expr/__snapshots__/render.spec.js.snap +++ b/tests/printer/expr/__snapshots__/render.spec.js.snap @@ -2420,6 +2420,8 @@ exports[`jsx.js 1`] = ` let x = let x = let x = +let x = +let x = let x =
let x = let x = +let x = +let x = let x =