Skip to content

Commit c546988

Browse files
authored
fix(37456): omit type arguments from JsxSelfClosingElement, JsxOpeningElement nodes (#37739)
1 parent a98adef commit c546988

File tree

6 files changed

+220
-2
lines changed

6 files changed

+220
-2
lines changed

src/compiler/binder.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3542,6 +3542,10 @@ namespace ts {
35423542
case SyntaxKind.ElementAccessExpression:
35433543
return computeElementAccess(<ElementAccessExpression>node, subtreeFlags);
35443544

3545+
case SyntaxKind.JsxSelfClosingElement:
3546+
case SyntaxKind.JsxOpeningElement:
3547+
return computeJsxOpeningLikeElement(<JsxOpeningLikeElement>node, subtreeFlags);
3548+
35453549
default:
35463550
return computeOther(node, kind, subtreeFlags);
35473551
}
@@ -3591,6 +3595,15 @@ namespace ts {
35913595
return transformFlags & ~TransformFlags.ArrayLiteralOrCallOrNewExcludes;
35923596
}
35933597

3598+
function computeJsxOpeningLikeElement(node: JsxOpeningLikeElement, subtreeFlags: TransformFlags) {
3599+
let transformFlags = subtreeFlags | TransformFlags.AssertJsx;
3600+
if (node.typeArguments) {
3601+
transformFlags |= TransformFlags.AssertTypeScript;
3602+
}
3603+
node.transformFlags = transformFlags | TransformFlags.HasComputedFlags;
3604+
return transformFlags & ~TransformFlags.NodeExcludes;
3605+
}
3606+
35943607
function computeBinaryExpression(node: BinaryExpression, subtreeFlags: TransformFlags) {
35953608
let transformFlags = subtreeFlags;
35963609
const operatorTokenKind = node.operatorToken.kind;
@@ -4124,8 +4137,6 @@ namespace ts {
41244137
break;
41254138

41264139
case SyntaxKind.JsxElement:
4127-
case SyntaxKind.JsxSelfClosingElement:
4128-
case SyntaxKind.JsxOpeningElement:
41294140
case SyntaxKind.JsxText:
41304141
case SyntaxKind.JsxClosingElement:
41314142
case SyntaxKind.JsxFragment:

src/compiler/transformers/ts.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,12 @@ namespace ts {
540540
// TypeScript namespace or external module import.
541541
return visitImportEqualsDeclaration(<ImportEqualsDeclaration>node);
542542

543+
case SyntaxKind.JsxSelfClosingElement:
544+
return visitJsxSelfClosingElement(<JsxSelfClosingElement>node);
545+
546+
case SyntaxKind.JsxOpeningElement:
547+
return visitJsxJsxOpeningElement(<JsxOpeningElement>node);
548+
543549
default:
544550
// node contains some other TypeScript syntax
545551
return visitEachChild(node, visitor, context);
@@ -2271,6 +2277,22 @@ namespace ts {
22712277
visitNode(node.template, visitor, isExpression));
22722278
}
22732279

2280+
function visitJsxSelfClosingElement(node: JsxSelfClosingElement) {
2281+
return updateJsxSelfClosingElement(
2282+
node,
2283+
visitNode(node.tagName, visitor, isJsxTagNameExpression),
2284+
/*typeArguments*/ undefined,
2285+
visitNode(node.attributes, visitor, isJsxAttributes));
2286+
}
2287+
2288+
function visitJsxJsxOpeningElement(node: JsxOpeningElement) {
2289+
return updateJsxOpeningElement(
2290+
node,
2291+
visitNode(node.tagName, visitor, isJsxTagNameExpression),
2292+
/*typeArguments*/ undefined,
2293+
visitNode(node.attributes, visitor, isJsxAttributes));
2294+
}
2295+
22742296
/**
22752297
* Determines whether to emit an enum declaration.
22762298
*
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//// [foo.tsx]
2+
import React = require('react');
3+
4+
type TypeProps = { foo?: boolean; };
5+
interface InterfaceProps { foo?: boolean; }
6+
7+
function Foo<T>() {
8+
return null;
9+
}
10+
11+
<>
12+
<Foo<unknown> />
13+
<Foo<string> />
14+
<Foo<boolean> />
15+
<Foo<object> />
16+
<Foo<null> />
17+
<Foo<any> />
18+
<Foo<never> />
19+
<Foo<undefined> />
20+
<Foo<TypeProps> />
21+
<Foo<InterfaceProps> />
22+
</>
23+
24+
//// [foo.jsx]
25+
"use strict";
26+
exports.__esModule = true;
27+
var React = require("react");
28+
function Foo() {
29+
return null;
30+
}
31+
<>
32+
<Foo />
33+
<Foo />
34+
<Foo />
35+
<Foo />
36+
<Foo />
37+
<Foo />
38+
<Foo />
39+
<Foo />
40+
<Foo />
41+
<Foo />
42+
</>;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
=== tests/cases/conformance/jsx/foo.tsx ===
2+
import React = require('react');
3+
>React : Symbol(React, Decl(foo.tsx, 0, 0))
4+
5+
type TypeProps = { foo?: boolean; };
6+
>TypeProps : Symbol(TypeProps, Decl(foo.tsx, 0, 32))
7+
>foo : Symbol(foo, Decl(foo.tsx, 2, 18))
8+
9+
interface InterfaceProps { foo?: boolean; }
10+
>InterfaceProps : Symbol(InterfaceProps, Decl(foo.tsx, 2, 36))
11+
>foo : Symbol(InterfaceProps.foo, Decl(foo.tsx, 3, 26))
12+
13+
function Foo<T>() {
14+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
15+
>T : Symbol(T, Decl(foo.tsx, 5, 13))
16+
17+
return null;
18+
}
19+
20+
<>
21+
<Foo<unknown> />
22+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
23+
24+
<Foo<string> />
25+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
26+
27+
<Foo<boolean> />
28+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
29+
30+
<Foo<object> />
31+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
32+
33+
<Foo<null> />
34+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
35+
36+
<Foo<any> />
37+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
38+
39+
<Foo<never> />
40+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
41+
42+
<Foo<undefined> />
43+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
44+
45+
<Foo<TypeProps> />
46+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
47+
>TypeProps : Symbol(TypeProps, Decl(foo.tsx, 0, 32))
48+
49+
<Foo<InterfaceProps> />
50+
>Foo : Symbol(Foo, Decl(foo.tsx, 3, 43))
51+
>InterfaceProps : Symbol(InterfaceProps, Decl(foo.tsx, 2, 36))
52+
53+
</>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
=== tests/cases/conformance/jsx/foo.tsx ===
2+
import React = require('react');
3+
>React : typeof React
4+
5+
type TypeProps = { foo?: boolean; };
6+
>TypeProps : TypeProps
7+
>foo : boolean
8+
9+
interface InterfaceProps { foo?: boolean; }
10+
>foo : boolean
11+
12+
function Foo<T>() {
13+
>Foo : <T>() => any
14+
15+
return null;
16+
>null : null
17+
}
18+
19+
<>
20+
><> <Foo<unknown> /> <Foo<string> /> <Foo<boolean> /> <Foo<object> /> <Foo<null> /> <Foo<any> /> <Foo<never> /> <Foo<undefined> /> <Foo<TypeProps> /> <Foo<InterfaceProps> /></> : JSX.Element
21+
22+
<Foo<unknown> />
23+
><Foo<unknown> /> : JSX.Element
24+
>Foo : <T>() => any
25+
26+
<Foo<string> />
27+
><Foo<string> /> : JSX.Element
28+
>Foo : <T>() => any
29+
30+
<Foo<boolean> />
31+
><Foo<boolean> /> : JSX.Element
32+
>Foo : <T>() => any
33+
34+
<Foo<object> />
35+
><Foo<object> /> : JSX.Element
36+
>Foo : <T>() => any
37+
38+
<Foo<null> />
39+
><Foo<null> /> : JSX.Element
40+
>Foo : <T>() => any
41+
>null : null
42+
43+
<Foo<any> />
44+
><Foo<any> /> : JSX.Element
45+
>Foo : <T>() => any
46+
47+
<Foo<never> />
48+
><Foo<never> /> : JSX.Element
49+
>Foo : <T>() => any
50+
51+
<Foo<undefined> />
52+
><Foo<undefined> /> : JSX.Element
53+
>Foo : <T>() => any
54+
55+
<Foo<TypeProps> />
56+
><Foo<TypeProps> /> : JSX.Element
57+
>Foo : <T>() => any
58+
59+
<Foo<InterfaceProps> />
60+
><Foo<InterfaceProps> /> : JSX.Element
61+
>Foo : <T>() => any
62+
63+
</>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// @filename: foo.tsx
2+
// @jsx: preserve
3+
// @noLib: true
4+
// @skipLibCheck: true
5+
// @libFiles: react.d.ts,lib.d.ts
6+
7+
import React = require('react');
8+
9+
type TypeProps = { foo?: boolean; };
10+
interface InterfaceProps { foo?: boolean; }
11+
12+
function Foo<T>() {
13+
return null;
14+
}
15+
16+
<>
17+
<Foo<unknown> />
18+
<Foo<string> />
19+
<Foo<boolean> />
20+
<Foo<object> />
21+
<Foo<null> />
22+
<Foo<any> />
23+
<Foo<never> />
24+
<Foo<undefined> />
25+
<Foo<TypeProps> />
26+
<Foo<InterfaceProps> />
27+
</>

0 commit comments

Comments
 (0)