Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 07ccbb8

Browse files
Handle JSX elements with type arguments
Also, add a unit test for JSX in JavaScript. Co-Authored-By: Rick Winfrey <[email protected]>
1 parent 5d62300 commit 07ccbb8

File tree

8 files changed

+107
-2
lines changed

8 files changed

+107
-2
lines changed

src/Language/TSX/Assignment.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ jsxAttribute' :: Assignment Term
429429
jsxAttribute' = jsxAttribute <|> jsxExpression'
430430

431431
jsxOpeningElement' :: Assignment Term
432-
jsxOpeningElement' = makeTerm <$> symbol Grammar.JsxOpeningElement <*> children (TSX.Syntax.JsxOpeningElement <$> term jsxElementName <*> manyTerm jsxAttribute')
432+
jsxOpeningElement' = makeTerm <$> symbol Grammar.JsxOpeningElement <*> children (TSX.Syntax.JsxOpeningElement <$> term jsxElementName <*> term (typeArguments' <|> emptyTerm) <*> manyTerm jsxAttribute')
433433

434434
jsxElementName :: Assignment Term
435435
jsxElementName = choice [ identifier, nestedIdentifier, jsxNamespaceName ]

src/Language/TSX/Syntax/JSX.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ newtype JsxExpression a = JsxExpression { jsxExpression :: a }
2828

2929
instance Evaluatable JsxExpression
3030

31-
data JsxOpeningElement a = JsxOpeningElement { jsxOpeningElementIdentifier :: !a, jsxAttributes :: ![a] }
31+
data JsxOpeningElement a = JsxOpeningElement { jsxOpeningElementIdentifier :: !a, jsxOpeningElementTypeArguments :: a, jsxAttributes :: ![a] }
3232
deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, NFData1, Ord, Show, ToJSONFields1, Traversable)
3333
deriving (Eq1, Show1, Ord1) via Generically JsxOpeningElement
3434

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function Something() {
2+
return <div>
3+
<Foo>hello</Foo>
4+
</div>;
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function Something() {
2+
return <div>
3+
<Foo<T>>goodbye</Foo>
4+
</div>;
5+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
(Statements
2+
(Function
3+
(Empty)
4+
(Empty)
5+
(Identifier)
6+
(StatementBlock
7+
(Return
8+
(JsxElement
9+
(JsxOpeningElement
10+
(Identifier)
11+
(Empty))
12+
(JsxText)
13+
(JsxElement
14+
(JsxOpeningElement
15+
(Identifier)
16+
{ (Empty)
17+
->(TypeArguments
18+
{+(TypeIdentifier)+}) })
19+
{ (JsxText)
20+
->(JsxText) }
21+
(JsxClosingElement
22+
(Identifier)))
23+
(JsxText)
24+
(JsxClosingElement
25+
(Identifier)))))))
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
(Statements
2+
(Function
3+
(Empty)
4+
(Empty)
5+
(Identifier)
6+
(StatementBlock
7+
(Return
8+
(JsxElement
9+
(JsxOpeningElement
10+
(Identifier)
11+
(Empty))
12+
(JsxText)
13+
(JsxElement
14+
(JsxOpeningElement
15+
(Identifier)
16+
{ (TypeArguments
17+
{-(TypeIdentifier)-})
18+
->(Empty) })
19+
{ (JsxText)
20+
->(JsxText) }
21+
(JsxClosingElement
22+
(Identifier)))
23+
(JsxText)
24+
(JsxClosingElement
25+
(Identifier)))))))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
(Statements
2+
(Function
3+
(Empty)
4+
(Empty)
5+
(Identifier)
6+
(StatementBlock
7+
(Return
8+
(JsxElement
9+
(JsxOpeningElement
10+
(Identifier)
11+
(Empty))
12+
(JsxText)
13+
(JsxElement
14+
(JsxOpeningElement
15+
(Identifier)
16+
(Empty))
17+
(JsxText)
18+
(JsxClosingElement
19+
(Identifier)))
20+
(JsxText)
21+
(JsxClosingElement
22+
(Identifier)))))))
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
(Statements
2+
(Function
3+
(Empty)
4+
(Empty)
5+
(Identifier)
6+
(StatementBlock
7+
(Return
8+
(JsxElement
9+
(JsxOpeningElement
10+
(Identifier)
11+
(Empty))
12+
(JsxText)
13+
(JsxElement
14+
(JsxOpeningElement
15+
(Identifier)
16+
(TypeArguments
17+
(TypeIdentifier)))
18+
(JsxText)
19+
(JsxClosingElement
20+
(Identifier)))
21+
(JsxText)
22+
(JsxClosingElement
23+
(Identifier)))))))

0 commit comments

Comments
 (0)