type component = {displayName: string}; let module Bar = { let createElement c::c=? children => { displayName: "test" }; }; let module Nesting = { let createElement children => { displayName: "test" }; }; let module Much = { let createElement children => { displayName: "test" }; }; let module Foo = { let createElement a::a=? b::b=? children => { displayName: "test" }; }; let module One = { let createElement test::test=? foo::foo=? children => { displayName: "test" }; let createElementobvioustypo test::test children => { displayName: "test" }; }; let module Two = { let createElement foo::foo=? children => { displayName: "test" }; }; let module Sibling = { let createElement foo::foo=? (children: list component) => { displayName: "test" }; }; let module Test = { let createElement yo::yo=? children => { displayName: "test" }; }; let module So = { let createElement children => { displayName: "test" }; }; let module Foo2 = { let createElement children => { displayName: "test" }; }; let module Text = { let createElement children => { displayName: "test" }; }; let module Exp = { let createElement children => { displayName: "test" }; }; let module Pun = { let createElement intended::intended=? children => { displayName: "test" }; }; let module Namespace = { let module Foo = { let createElement intended::intended=? anotherOptional::x=100 children => { displayName: "test" }; }; }; let module LotsOfArguments = { let createElement argument1::argument1=? argument2::argument2=? argument3::argument3=? argument4::argument4=? argument5::argument5=? argument6::argument6=? children => { displayName: "test" }; }; let div argument1::argument1=? children => { displayName: "test" }; let module List1 = { let createElement children => { displayName: "test" }; }; let module List2 = { let createElement children => { displayName: "test" }; }; let module List3 = { let createElement children => { displayName: "test" }; }; let (/><) a b => a + b; let (><) a b => a + b; let (/>) a b => a + b; let (><\/) a b => a + b; let tag1 = 5 />< 6; let tag2 = 5 >< 7; let tag3 = 5 /> 7; let tag4 = 5 ><\/ 7; let b = 2; let selfClosing = ; let selfClosing2 = ; let selfClosing3 = ; let a = a + 2) /> ; let a3 = ; let a4 = ; let a5 = "testing a string here" ; let a6 = "testing a string here" "another string" (2 + 4) ; let intended = true; let punning = ; let namespace = ; let c = ; let d = ; let spaceBefore = ; let spaceBefore2 = ; let siblingNotSpaced = ; let jsxInList = []; let jsxInList2 = []; let jsxInListA = []; let jsxInListB = []; let jsxInListC = []; let jsxInListD = []; let jsxInList3 = [, , ]; let jsxInList4 = [, , ]; let jsxInList5 = [, ]; let jsxInList6 = [, ]; let jsxInList7 = [, ]; let jsxInList8 = [, ]; let testFunc b => b; let jsxInFnCall = testFunc ; let lotsOfArguments = ; let lowerCase =
; let b = 0; let d = 0; /* * Should pun the first example: */ let a = 5 ; let a = 5 ; let a = 5 ; let a = 0.55 ; let a = Foo.createElement "" [@JSX]; let ident = a ; let fragment1 = <> ; let fragment2 = <> ; let fragment3 = <> ; let fragment4 = <> ; let fragment5 = <> ; let fragment6 = <> ; let fragment7 = <> ; let fragment8 = <> ; let fragment9 = <> 2 2 2 2 ; let fragment10 = <> 2.2 3.2 4.6 1.2 ; let fragment11 = <> "str" ; let fragment12 = <> (6 + 2) (6 + 2) (6 + 2) ; let fragment13 = <> fragment11 fragment11 ; let listOfItems1 = 1 2 3 4 5 ; let listOfItems2 = 1.0 2.8 3.8 4.0 5.1 ; let listOfItems3 = fragment11 fragment11 ; /* * Several sequential simple jsx expressions must be separated with a space. */ let thisIsRight a b => (); let tagOne children => (); let tagTwo children => (); /* thisIsWrong ; */ thisIsRight ; /* thisIsWrong ; */ thisIsRight ; let a children => (); let b children => (); let thisIsOkay = ; let thisIsAlsoOkay = ; /* Doesn't make any sense, but suppose you defined an infix operator to compare jsx */ < ; > ; < ; > ; let listOfListOfJsx = [<> ]; let listOfListOfJsx = [<> ]; let listOfListOfJsx = [ <> , <> ]; let listOfListOfJsx = [ <> , <> , ...listOfListOfJsx ]; let sameButWithSpaces = [<> ]; let sameButWithSpaces = [<> ]; let sameButWithSpaces = [ <> , <> ]; let sameButWithSpaces = [ <> , <> , ...sameButWithSpaces ]; /* * Test named tag right next to an open bracket. */ let listOfJsx = []; let listOfJsx = []; let listOfJsx = [, ]; let listOfJsx = [, , ...listOfJsx]; let sameButWithSpaces = []; let sameButWithSpaces = []; let sameButWithSpaces = [, ]; let sameButWithSpaces = [ , , ...sameButWithSpaces ]; /** * Test no conflict with polymorphic variant types. */ type thisType = [ | `Foo | `Bar]; type t 'a = [< thisType] as 'a; let asd = "a" "b" [@foo]; let asd2 = One.createElementobvioustypo test::false ["a", "b"] [@JSX] [@foo]; let span test::(test: bool) foo::(foo: int) children => 1; let asd = "a" "b" [@foo]; /* "video" call doesn't end with a list, so the expression isn't converted to JSX */ let video test::(test: bool) children => children; let asd2 = video test::false 10 [@JSX] [@foo]; let div children => 1; ((fun () => div) ()) [] [@JSX]; let myFun () => <> ; let myFun () => <> ; let myFun () => <> ; /** * Children should wrap without forcing attributes to. */ ; /** * Failing test cases: */ /* let res = ) > */ /* */ /* ; */ /* let res = ) />; */