Skip to content

Commit 00d4b4c

Browse files
committed
Correctly identify JSX Expressions as Expression parent nodes
Fixes bug microsoft#4404
1 parent 65f4ac6 commit 00d4b4c

21 files changed

+82
-5
lines changed

src/compiler/utilities.ts

+1
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,7 @@ namespace ts {
978978
case SyntaxKind.ComputedPropertyName:
979979
return node === (<ComputedPropertyName>parent).expression;
980980
case SyntaxKind.Decorator:
981+
case SyntaxKind.JsxExpression:
981982
return true;
982983
case SyntaxKind.ExpressionWithTypeArguments:
983984
return (<ExpressionWithTypeArguments>parent).expression === node && isExpressionWithTypeArgumentsInClassExtendsClause(parent);

tests/baselines/reference/jsxHash.types

+3
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,21 @@ var t02 = <a>{0}#</a>;
33
>t02 : any
44
><a>{0}#</a> : any
55
>a : any
6+
>0 : number
67
>a : any
78

89
var t03 = <a>#{0}</a>;
910
>t03 : any
1011
><a>#{0}</a> : any
1112
>a : any
13+
>0 : number
1214
>a : any
1315

1416
var t04 = <a>#{0}#</a>;
1517
>t04 : any
1618
><a>#{0}#</a> : any
1719
>a : any
20+
>0 : number
1821
>a : any
1922

2023
var t05 = <a>#<i></i></a>;

tests/baselines/reference/jsxImportInAttribute.symbols

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ let x = Test; // emit test_1.default
99

1010
<anything attr={Test} />; // ?
1111
>attr : Symbol(unknown)
12+
>Test : Symbol(Test, Decl(consumer.tsx, 1, 6))
1213

1314
=== tests/cases/compiler/component.d.ts ===
1415

tests/baselines/reference/jsxImportInAttribute.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ let x = Test; // emit test_1.default
1111
><anything attr={Test} /> : any
1212
>anything : any
1313
>attr : any
14-
>Test : any
14+
>Test : typeof Test
1515

1616
=== tests/cases/compiler/component.d.ts ===
1717

tests/baselines/reference/jsxReactTestSuite.symbols

+3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ declare var hasOwnProperty:any;
4646
<div><br /></div>
4747
<Component>{foo}<br />{bar}</Component>
4848
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
49+
>foo : Symbol(foo, Decl(jsxReactTestSuite.tsx, 7, 11))
50+
>bar : Symbol(bar, Decl(jsxReactTestSuite.tsx, 8, 11))
4951
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
5052

5153
<br />
@@ -159,6 +161,7 @@ var x =
159161
<Component x={y} />;
160162
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
161163
>x : Symbol(unknown)
164+
>y : Symbol(y, Decl(jsxReactTestSuite.tsx, 9, 11))
162165

163166
<x-component />;
164167

tests/baselines/reference/jsxReactTestSuite.types

+6
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ var x =
251251
>y : any
252252

253253
={2 } z />;
254+
>2 : number
254255
>z : any
255256

256257
<Component
@@ -287,25 +288,29 @@ var x =
287288
>Component : any
288289
>x : any
289290
>y : any
291+
>2 : number
290292

291293
<Component { ... x } y={2} z />;
292294
><Component { ... x } y={2} z /> : any
293295
>Component : any
294296
>x : any
295297
>y : any
298+
>2 : number
296299
>z : any
297300

298301
<Component x={1} {...y} />;
299302
><Component x={1} {...y} /> : any
300303
>Component : any
301304
>x : any
305+
>1 : number
302306
>y : any
303307

304308

305309
<Component x={1} y="2" {...z} {...z}><Child /></Component>;
306310
><Component x={1} y="2" {...z} {...z}><Child /></Component> : any
307311
>Component : any
308312
>x : any
313+
>1 : number
309314
>y : any
310315
>z : any
311316
>z : any
@@ -326,6 +331,7 @@ var x =
326331
>2 : number
327332
>z : any
328333
>z : any
334+
>3 : number
329335
>Component : any
330336

331337

tests/baselines/reference/tsxElementResolution13.types

+1
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ var obj1: Obj1;
2525
><obj1 x={10} /> : JSX.Element
2626
>obj1 : Obj1
2727
>x : any
28+
>10 : number
2829

tests/baselines/reference/tsxElementResolution14.types

+1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ var obj1: Obj1;
2020
><obj1 x={10} /> : JSX.Element
2121
>obj1 : Obj1
2222
>x : any
23+
>10 : number
2324

tests/baselines/reference/tsxElementResolution9.types

+1
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,5 @@ var Obj3: Obj3;
6767
><Obj3 x={42} /> : JSX.Element
6868
>Obj3 : Obj3
6969
>x : any
70+
>42 : number
7071

tests/baselines/reference/tsxEmit1.symbols

+5
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ var selfClosed7 = <div x={p} y='p' />;
5252
>selfClosed7 : Symbol(selfClosed7, Decl(tsxEmit1.tsx, 14, 3))
5353
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit1.tsx, 1, 22))
5454
>x : Symbol(unknown)
55+
>p : Symbol(p, Decl(tsxEmit1.tsx, 7, 3))
5556
>y : Symbol(unknown)
5657

5758
var openClosed1 = <div></div>;
@@ -69,6 +70,7 @@ var openClosed3 = <div n='m'>{p}</div>;
6970
>openClosed3 : Symbol(openClosed3, Decl(tsxEmit1.tsx, 18, 3))
7071
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit1.tsx, 1, 22))
7172
>n : Symbol(unknown)
73+
>p : Symbol(p, Decl(tsxEmit1.tsx, 7, 3))
7274
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit1.tsx, 1, 22))
7375

7476
var openClosed4 = <div n='m'>{p < p}</div>;
@@ -146,13 +148,16 @@ var whitespace1 = <div> </div>;
146148
var whitespace2 = <div> {p} </div>;
147149
>whitespace2 : Symbol(whitespace2, Decl(tsxEmit1.tsx, 35, 3))
148150
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit1.tsx, 1, 22))
151+
>p : Symbol(p, Decl(tsxEmit1.tsx, 7, 3))
149152
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit1.tsx, 1, 22))
150153

151154
var whitespace3 = <div>
152155
>whitespace3 : Symbol(whitespace3, Decl(tsxEmit1.tsx, 36, 3))
153156
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit1.tsx, 1, 22))
154157

155158
{p}
159+
>p : Symbol(p, Decl(tsxEmit1.tsx, 7, 3))
160+
156161
</div>;
157162
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit1.tsx, 1, 22))
158163

tests/baselines/reference/tsxEmit1.types

+2
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@ var selfClosed5 = <div x={0} y='0' />;
4545
><div x={0} y='0' /> : JSX.Element
4646
>div : any
4747
>x : any
48+
>0 : number
4849
>y : any
4950

5051
var selfClosed6 = <div x={"1"} y='0' />;
5152
>selfClosed6 : JSX.Element
5253
><div x={"1"} y='0' /> : JSX.Element
5354
>div : any
5455
>x : any
56+
>"1" : string
5557
>y : any
5658

5759
var selfClosed7 = <div x={p} y='p' />;

tests/baselines/reference/tsxEmit2.symbols

+9
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,38 @@ var p1, p2, p3;
2121
var spreads1 = <div {...p1}>{p2}</div>;
2222
>spreads1 : Symbol(spreads1, Decl(tsxEmit2.tsx, 8, 3))
2323
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
24+
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
2425
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
2526

2627
var spreads2 = <div {...p1}>{p2}</div>;
2728
>spreads2 : Symbol(spreads2, Decl(tsxEmit2.tsx, 9, 3))
2829
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
30+
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
2931
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
3032

3133
var spreads3 = <div x={p3} {...p1}>{p2}</div>;
3234
>spreads3 : Symbol(spreads3, Decl(tsxEmit2.tsx, 10, 3))
3335
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
3436
>x : Symbol(unknown)
37+
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
38+
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
3539
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
3640

3741
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
3842
>spreads4 : Symbol(spreads4, Decl(tsxEmit2.tsx, 11, 3))
3943
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
4044
>x : Symbol(unknown)
45+
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
46+
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
4147
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
4248

4349
var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
4450
>spreads5 : Symbol(spreads5, Decl(tsxEmit2.tsx, 12, 3))
4551
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
4652
>x : Symbol(unknown)
53+
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
4754
>y : Symbol(unknown)
55+
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
56+
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
4857
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
4958

tests/baselines/reference/tsxExternalModuleEmit2.symbols

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ declare var Foo, React;
2020
<Foo handler={Main}></Foo>;
2121
>Foo : Symbol(Foo, Decl(app.tsx, 1, 11))
2222
>handler : Symbol(unknown)
23+
>Main : Symbol(Main, Decl(app.tsx, 0, 6))
2324
>Foo : Symbol(Foo, Decl(app.tsx, 1, 11))
2425

2526
// Should see mod_1['default'] in emit here

tests/baselines/reference/tsxReactEmit1.symbols

+5
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ var selfClosed7 = <div x={p} y='p' b />;
5454
>selfClosed7 : Symbol(selfClosed7, Decl(tsxReactEmit1.tsx, 15, 3))
5555
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
5656
>x : Symbol(unknown)
57+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
5758
>y : Symbol(unknown)
5859
>b : Symbol(unknown)
5960

@@ -72,6 +73,7 @@ var openClosed3 = <div n='m'>{p}</div>;
7273
>openClosed3 : Symbol(openClosed3, Decl(tsxReactEmit1.tsx, 19, 3))
7374
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
7475
>n : Symbol(unknown)
76+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
7577
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
7678

7779
var openClosed4 = <div n='m'>{p < p}</div>;
@@ -150,13 +152,16 @@ var whitespace1 = <div> </div>;
150152
var whitespace2 = <div> {p} </div>;
151153
>whitespace2 : Symbol(whitespace2, Decl(tsxReactEmit1.tsx, 36, 3))
152154
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
155+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
153156
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
154157

155158
var whitespace3 = <div>
156159
>whitespace3 : Symbol(whitespace3, Decl(tsxReactEmit1.tsx, 37, 3))
157160
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
158161

159162
{p}
163+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
164+
160165
</div>;
161166
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
162167

tests/baselines/reference/tsxReactEmit1.types

+2
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,15 @@ var selfClosed5 = <div x={0} y='0' />;
4747
><div x={0} y='0' /> : JSX.Element
4848
>div : any
4949
>x : any
50+
>0 : number
5051
>y : any
5152

5253
var selfClosed6 = <div x={"1"} y='0' />;
5354
>selfClosed6 : JSX.Element
5455
><div x={"1"} y='0' /> : JSX.Element
5556
>div : any
5657
>x : any
58+
>"1" : string
5759
>y : any
5860

5961
var selfClosed7 = <div x={p} y='p' b />;

tests/baselines/reference/tsxReactEmit2.symbols

+9
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,38 @@ var p1, p2, p3;
2323
var spreads1 = <div {...p1}>{p2}</div>;
2424
>spreads1 : Symbol(spreads1, Decl(tsxReactEmit2.tsx, 9, 3))
2525
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
26+
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
2627
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
2728

2829
var spreads2 = <div {...p1}>{p2}</div>;
2930
>spreads2 : Symbol(spreads2, Decl(tsxReactEmit2.tsx, 10, 3))
3031
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
32+
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
3133
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
3234

3335
var spreads3 = <div x={p3} {...p1}>{p2}</div>;
3436
>spreads3 : Symbol(spreads3, Decl(tsxReactEmit2.tsx, 11, 3))
3537
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
3638
>x : Symbol(unknown)
39+
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
40+
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
3741
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
3842

3943
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
4044
>spreads4 : Symbol(spreads4, Decl(tsxReactEmit2.tsx, 12, 3))
4145
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
4246
>x : Symbol(unknown)
47+
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
48+
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
4349
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
4450

4551
var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
4652
>spreads5 : Symbol(spreads5, Decl(tsxReactEmit2.tsx, 13, 3))
4753
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
4854
>x : Symbol(unknown)
55+
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
4956
>y : Symbol(unknown)
57+
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
58+
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
5059
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
5160

tests/baselines/reference/tsxReactEmitWhitespace.symbols

+5
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,16 @@ var p = 0;
2929
// Emit " ", p, " "
3030
<div> {p} </div>;
3131
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace.tsx, 1, 22))
32+
>p : Symbol(p, Decl(tsxReactEmitWhitespace.tsx, 11, 3))
3233
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace.tsx, 1, 22))
3334

3435
// Emit only p
3536
<div>
3637
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace.tsx, 1, 22))
3738

3839
{p}
40+
>p : Symbol(p, Decl(tsxReactEmitWhitespace.tsx, 11, 3))
41+
3942
</div>;
4043
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace.tsx, 1, 22))
4144

@@ -44,6 +47,8 @@ var p = 0;
4447
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace.tsx, 1, 22))
4548

4649
{p}
50+
>p : Symbol(p, Decl(tsxReactEmitWhitespace.tsx, 11, 3))
51+
4752
</div>;
4853
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmitWhitespace.tsx, 1, 22))
4954

tests/baselines/reference/tsxReactEmitWhitespace.types

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var p = 0;
3232
<div> {p} </div>;
3333
><div> {p} </div> : JSX.Element
3434
>div : any
35-
>p : any
35+
>p : number
3636
>div : any
3737

3838
// Emit only p
@@ -41,7 +41,7 @@ var p = 0;
4141
>div : any
4242

4343
{p}
44-
>p : any
44+
>p : number
4545

4646
</div>;
4747
>div : any
@@ -52,7 +52,7 @@ var p = 0;
5252
>div : any
5353

5454
{p}
55-
>p : any
55+
>p : number
5656

5757
</div>;
5858
>div : any

tests/baselines/reference/tsxTypeErrors.symbols

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var thing = { oops: 100 };
1818
var a3 = <div id={thing} />
1919
>a3 : Symbol(a3, Decl(tsxTypeErrors.tsx, 9, 3))
2020
>id : Symbol(unknown)
21+
>thing : Symbol(thing, Decl(tsxTypeErrors.tsx, 8, 3))
2122

2223
// Mistyped html name (error)
2324
var e1 = <imag src="bar.jpg" />

tests/baselines/reference/tsxTypeErrors.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ var a3 = <div id={thing} />
2626
><div id={thing} /> : any
2727
>div : any
2828
>id : any
29-
>thing : any
29+
>thing : { oops: number; }
3030

3131
// Mistyped html name (error)
3232
var e1 = <imag src="bar.jpg" />

0 commit comments

Comments
 (0)