Skip to content

Commit 54994b2

Browse files
committed
Ensure all properties get visited. Fixes microsoft#54984
1 parent 5a62c46 commit 54994b2

File tree

6 files changed

+204
-8
lines changed

6 files changed

+204
-8
lines changed

src/compiler/transformers/jsx.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -472,10 +472,10 @@ export function transformJsx(context: TransformationContext): (x: SourceFile | B
472472
for (const prop of attr.expression.properties) {
473473
if (isSpreadAssignment(prop)) {
474474
finishObjectLiteralIfNeeded();
475-
expressions.push(prop.expression);
475+
expressions.push(Debug.checkDefined(visitNode(prop.expression, visitor, isExpression)));
476476
continue;
477477
}
478-
properties.push(prop);
478+
properties.push(Debug.checkDefined(visitNode(prop, visitor)) as ObjectLiteralElementLike);
479479
}
480480
continue;
481481
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/a.tsx(5,13): error TS2304: Cannot find name 'Comp'.
2+
/a.tsx(9,13): error TS2304: Cannot find name 'Comp'.
3+
/a.tsx(13,13): error TS2304: Cannot find name 'Comp'.
4+
/a.tsx(17,13): error TS2304: Cannot find name 'Comp'.
5+
/a.tsx(19,15): error TS1049: A 'set' accessor must have exactly one parameter.
6+
/a.tsx(19,25): error TS2408: Setters cannot return a value.
7+
8+
9+
==== /a.tsx (6 errors) ====
10+
declare const React: any;
11+
12+
const t1 = <div {...<span />} />;
13+
const t2 = <div {...<span className="foo" />} />;
14+
const t3 = <Comp
15+
~~~~
16+
!!! error TS2304: Cannot find name 'Comp'.
17+
right={<div>x</div>}
18+
{...{ wrong: <div>x</div>}}
19+
/>;
20+
const t4 = <Comp
21+
~~~~
22+
!!! error TS2304: Cannot find name 'Comp'.
23+
right={<div>x</div>}
24+
{...{ wrong() { return <div>x</div>; }}}
25+
/>;
26+
const t5 = <Comp
27+
~~~~
28+
!!! error TS2304: Cannot find name 'Comp'.
29+
right={<div>x</div>}
30+
{...{ get wrong() { return <div>x</div>; }}}
31+
/>;
32+
const t6 = <Comp
33+
~~~~
34+
!!! error TS2304: Cannot find name 'Comp'.
35+
right={<div>x</div>}
36+
{...{ set wrong() { return <div>x</div>; }}}
37+
~~~~~
38+
!!! error TS1049: A 'set' accessor must have exactly one parameter.
39+
~~~~~~
40+
!!! error TS2408: Setters cannot return a value.
41+
/>;
42+

tests/baselines/reference/jsxSpreadTag.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,28 @@ declare const React: any;
55

66
const t1 = <div {...<span />} />;
77
const t2 = <div {...<span className="foo" />} />;
8+
const t3 = <Comp
9+
right={<div>x</div>}
10+
{...{ wrong: <div>x</div>}}
11+
/>;
12+
const t4 = <Comp
13+
right={<div>x</div>}
14+
{...{ wrong() { return <div>x</div>; }}}
15+
/>;
16+
const t5 = <Comp
17+
right={<div>x</div>}
18+
{...{ get wrong() { return <div>x</div>; }}}
19+
/>;
20+
const t6 = <Comp
21+
right={<div>x</div>}
22+
{...{ set wrong() { return <div>x</div>; }}}
23+
/>;
824

925

1026
//// [a.js]
1127
const t1 = React.createElement("div", Object.assign({}, React.createElement("span", null)));
1228
const t2 = React.createElement("div", Object.assign({}, React.createElement("span", { className: "foo" })));
29+
const t3 = React.createElement(Comp, { right: React.createElement("div", null, "x"), wrong: React.createElement("div", null, "x") });
30+
const t4 = React.createElement(Comp, { right: React.createElement("div", null, "x"), wrong() { return React.createElement("div", null, "x"); } });
31+
const t5 = React.createElement(Comp, { right: React.createElement("div", null, "x"), get wrong() { return React.createElement("div", null, "x"); } });
32+
const t6 = React.createElement(Comp, { right: React.createElement("div", null, "x"), set wrong() { return React.createElement("div", null, "x"); } });

tests/baselines/reference/jsxSpreadTag.symbols

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,44 @@ const t2 = <div {...<span className="foo" />} />;
1111
>t2 : Symbol(t2, Decl(a.tsx, 3, 5))
1212
>className : Symbol(className, Decl(a.tsx, 3, 25))
1313

14+
const t3 = <Comp
15+
>t3 : Symbol(t3, Decl(a.tsx, 4, 5))
16+
17+
right={<div>x</div>}
18+
>right : Symbol(right, Decl(a.tsx, 4, 16))
19+
20+
{...{ wrong: <div>x</div>}}
21+
>wrong : Symbol(wrong, Decl(a.tsx, 6, 9))
22+
23+
/>;
24+
const t4 = <Comp
25+
>t4 : Symbol(t4, Decl(a.tsx, 8, 5))
26+
27+
right={<div>x</div>}
28+
>right : Symbol(right, Decl(a.tsx, 8, 16))
29+
30+
{...{ wrong() { return <div>x</div>; }}}
31+
>wrong : Symbol(wrong, Decl(a.tsx, 10, 9))
32+
33+
/>;
34+
const t5 = <Comp
35+
>t5 : Symbol(t5, Decl(a.tsx, 12, 5))
36+
37+
right={<div>x</div>}
38+
>right : Symbol(right, Decl(a.tsx, 12, 16))
39+
40+
{...{ get wrong() { return <div>x</div>; }}}
41+
>wrong : Symbol(wrong, Decl(a.tsx, 14, 9))
42+
43+
/>;
44+
const t6 = <Comp
45+
>t6 : Symbol(t6, Decl(a.tsx, 16, 5))
46+
47+
right={<div>x</div>}
48+
>right : Symbol(right, Decl(a.tsx, 16, 16))
49+
50+
{...{ set wrong() { return <div>x</div>; }}}
51+
>wrong : Symbol(wrong, Decl(a.tsx, 18, 9))
52+
53+
/>;
54+

tests/baselines/reference/jsxSpreadTag.types

Lines changed: 83 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,94 @@ declare const React: any;
55
>React : any
66

77
const t1 = <div {...<span />} />;
8-
>t1 : error
9-
><div {...<span />} /> : error
8+
>t1 : any
9+
><div {...<span />} /> : any
1010
>div : any
11-
><span /> : error
11+
><span /> : any
1212
>span : any
1313

1414
const t2 = <div {...<span className="foo" />} />;
15-
>t2 : error
16-
><div {...<span className="foo" />} /> : error
15+
>t2 : any
16+
><div {...<span className="foo" />} /> : any
1717
>div : any
18-
><span className="foo" /> : error
18+
><span className="foo" /> : any
1919
>span : any
2020
>className : string
2121

22+
const t3 = <Comp
23+
>t3 : any
24+
><Comp right={<div>x</div>} {...{ wrong: <div>x</div>}}/> : any
25+
>Comp : any
26+
27+
right={<div>x</div>}
28+
>right : any
29+
><div>x</div> : any
30+
>div : any
31+
>div : any
32+
33+
{...{ wrong: <div>x</div>}}
34+
>{ wrong: <div>x</div>} : { wrong: any; }
35+
>wrong : any
36+
><div>x</div> : any
37+
>div : any
38+
>div : any
39+
40+
/>;
41+
const t4 = <Comp
42+
>t4 : any
43+
><Comp right={<div>x</div>} {...{ wrong() { return <div>x</div>; }}}/> : any
44+
>Comp : any
45+
46+
right={<div>x</div>}
47+
>right : any
48+
><div>x</div> : any
49+
>div : any
50+
>div : any
51+
52+
{...{ wrong() { return <div>x</div>; }}}
53+
>{ wrong() { return <div>x</div>; }} : { wrong(): any; }
54+
>wrong : () => any
55+
><div>x</div> : any
56+
>div : any
57+
>div : any
58+
59+
/>;
60+
const t5 = <Comp
61+
>t5 : any
62+
><Comp right={<div>x</div>} {...{ get wrong() { return <div>x</div>; }}}/> : any
63+
>Comp : any
64+
65+
right={<div>x</div>}
66+
>right : any
67+
><div>x</div> : any
68+
>div : any
69+
>div : any
70+
71+
{...{ get wrong() { return <div>x</div>; }}}
72+
>{ get wrong() { return <div>x</div>; }} : { readonly wrong: any; }
73+
>wrong : any
74+
><div>x</div> : any
75+
>div : any
76+
>div : any
77+
78+
/>;
79+
const t6 = <Comp
80+
>t6 : any
81+
><Comp right={<div>x</div>} {...{ set wrong() { return <div>x</div>; }}}/> : any
82+
>Comp : any
83+
84+
right={<div>x</div>}
85+
>right : any
86+
><div>x</div> : any
87+
>div : any
88+
>div : any
89+
90+
{...{ set wrong() { return <div>x</div>; }}}
91+
>{ set wrong() { return <div>x</div>; }} : { wrong: any; }
92+
>wrong : any
93+
><div>x</div> : any
94+
>div : any
95+
>div : any
96+
97+
/>;
98+

tests/cases/compiler/jsxSpreadTag.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,19 @@ declare const React: any;
66

77
const t1 = <div {...<span />} />;
88
const t2 = <div {...<span className="foo" />} />;
9+
const t3 = <Comp
10+
right={<div>x</div>}
11+
{...{ wrong: <div>x</div>}}
12+
/>;
13+
const t4 = <Comp
14+
right={<div>x</div>}
15+
{...{ wrong() { return <div>x</div>; }}}
16+
/>;
17+
const t5 = <Comp
18+
right={<div>x</div>}
19+
{...{ get wrong() { return <div>x</div>; }}}
20+
/>;
21+
const t6 = <Comp
22+
right={<div>x</div>}
23+
{...{ set wrong() { return <div>x</div>; }}}
24+
/>;

0 commit comments

Comments
 (0)