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

Commit b7a52b4

Browse files
authored
Merge pull request #229 from github/use-tsx-for-js-and-flow
Use TSX parser instead of Typescript parser for JavaScript and JSX
2 parents 5a7c4f0 + 73909f7 commit b7a52b4

13 files changed

+123
-7
lines changed

src/Language/TSX/Assignment.hs

+1-1
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

+1-1
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

src/Parsing/Parser.hs

+6-2
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,13 @@ someASTParser :: Language -> Maybe SomeASTParser
191191
someASTParser Go = Just (SomeASTParser (ASTParser tree_sitter_go :: Parser (AST [] Go.Grammar)))
192192
someASTParser Haskell = Just (SomeASTParser (ASTParser tree_sitter_haskell :: Parser (AST [] Haskell.Grammar)))
193193
someASTParser Java = Just (SomeASTParser (ASTParser tree_sitter_java :: Parser (AST [] Java.Grammar)))
194-
someASTParser JavaScript = Just (SomeASTParser (ASTParser tree_sitter_typescript :: Parser (AST [] TypeScript.Grammar)))
195194
someASTParser JSON = Just (SomeASTParser (ASTParser tree_sitter_json :: Parser (AST [] JSON.Grammar)))
196-
someASTParser JSX = Just (SomeASTParser (ASTParser tree_sitter_typescript :: Parser (AST [] TypeScript.Grammar)))
195+
196+
-- Use the TSX parser for `.js` and `.jsx` files in case they use Flow type-annotation syntax.
197+
-- The TSX and Flow syntaxes are the same, whereas the normal TypeScript syntax is different.
198+
someASTParser JavaScript = Just (SomeASTParser (ASTParser tree_sitter_tsx :: Parser (AST [] TSX.Grammar)))
199+
someASTParser JSX = Just (SomeASTParser (ASTParser tree_sitter_tsx :: Parser (AST [] TSX.Grammar)))
200+
197201
someASTParser Python = Just (SomeASTParser (ASTParser tree_sitter_python :: Parser (AST [] Python.Grammar)))
198202
someASTParser Ruby = Just (SomeASTParser (ASTParser tree_sitter_ruby :: Parser (AST [] Ruby.Grammar)))
199203
someASTParser TypeScript = Just (SomeASTParser (ASTParser tree_sitter_typescript :: Parser (AST [] TypeScript.Grammar)))
+5
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+
}
+5
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+
}
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)))))))
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)))))))
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)))))))
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)))))))

test/fixtures/tsx/corpus/jsx-elements.diffA-B.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
(JsxElement
77
(JsxOpeningElement
88
(Identifier)
9+
(Empty)
910
{+(JsxAttribute
1011
{+(Identifier)+}
1112
{+(JsxExpression
@@ -31,7 +32,8 @@
3132
{-(JsxOpeningElement
3233
{-(NestedIdentifier
3334
{-(Identifier)-}
34-
{-(Identifier)-})-})-}
35+
{-(Identifier)-})-}
36+
{-(Empty)-})-}
3537
{-(JsxClosingElement
3638
{-(NestedIdentifier
3739
{-(Identifier)-}

test/fixtures/tsx/corpus/jsx-elements.diffB-A.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
(JsxElement
77
(JsxOpeningElement
88
(Identifier)
9+
(Empty)
910
{+(JsxExpression
1011
{+(Call
1112
{+(Identifier)+}
@@ -31,7 +32,8 @@
3132
{+(JsxOpeningElement
3233
{+(NestedIdentifier
3334
{+(Identifier)+}
34-
{+(Identifier)+})+})+}
35+
{+(Identifier)+})+}
36+
{+(Empty)+})+}
3537
{+(JsxClosingElement
3638
{+(NestedIdentifier
3739
{+(Identifier)+}

test/fixtures/tsx/corpus/jsx-elements.parseA.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
(JsxElement
77
(JsxOpeningElement
88
(Identifier)
9+
(Empty)
910
(JsxExpression
1011
(Call
1112
(Identifier)
@@ -25,7 +26,8 @@
2526
(JsxOpeningElement
2627
(NestedIdentifier
2728
(Identifier)
28-
(Identifier)))
29+
(Identifier))
30+
(Empty))
2931
(JsxClosingElement
3032
(NestedIdentifier
3133
(Identifier)

test/fixtures/tsx/corpus/jsx-elements.parseB.txt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
(JsxElement
77
(JsxOpeningElement
88
(Identifier)
9+
(Empty)
910
(JsxAttribute
1011
(Identifier)
1112
(JsxExpression

0 commit comments

Comments
 (0)