Skip to content

Commit 719498e

Browse files
committed
Merge pull request microsoft#3770 from RyanCavanaugh/fix3764
Fix microsoft#3764
2 parents 42168e3 + 363dc03 commit 719498e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+209
-249
lines changed

src/compiler/checker.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7299,6 +7299,16 @@ namespace ts {
72997299
checkGrammarJsxElement(node);
73007300
checkJsxPreconditions(node);
73017301

7302+
// If we're compiling under --jsx react, the symbol 'React' should
7303+
// be marked as 'used' so we don't incorrectly elide its import. And if there
7304+
// is no 'React' symbol in scope, we should issue an error.
7305+
if (compilerOptions.jsx === JsxEmit.React) {
7306+
let reactSym = resolveName(node.tagName, 'React', SymbolFlags.Value, Diagnostics.Cannot_find_name_0, 'React');
7307+
if (reactSym) {
7308+
getSymbolLinks(reactSym).referenced = true;
7309+
}
7310+
}
7311+
73027312
let targetAttributesType = getJsxElementAttributesType(node);
73037313

73047314
if (getNodeLinks(node).jsxFlags & JsxFlags.ClassElement) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//// [tests/cases/conformance/jsx/tsxElementResolution19.tsx] ////
2+
3+
//// [react.d.ts]
4+
5+
declare module "react" {
6+
7+
}
8+
9+
//// [file1.tsx]
10+
declare module JSX {
11+
interface Element { }
12+
}
13+
export class MyClass { }
14+
15+
//// [file2.tsx]
16+
17+
// Should not elide React import
18+
import * as React from 'react';
19+
import {MyClass} from './file1';
20+
21+
<MyClass />;
22+
23+
24+
//// [file1.js]
25+
define(["require", "exports"], function (require, exports) {
26+
var MyClass = (function () {
27+
function MyClass() {
28+
}
29+
return MyClass;
30+
})();
31+
exports.MyClass = MyClass;
32+
});
33+
//// [file2.js]
34+
define(["require", "exports", 'react', './file1'], function (require, exports, React, file1_1) {
35+
React.createElement(file1_1.MyClass, null);
36+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
=== tests/cases/conformance/jsx/react.d.ts ===
2+
3+
No type information for this code.declare module "react" {
4+
No type information for this code.
5+
No type information for this code.}
6+
No type information for this code.
7+
No type information for this code.=== tests/cases/conformance/jsx/file1.tsx ===
8+
declare module JSX {
9+
>JSX : Symbol(JSX, Decl(file1.tsx, 0, 0))
10+
11+
interface Element { }
12+
>Element : Symbol(Element, Decl(file1.tsx, 0, 20))
13+
}
14+
export class MyClass { }
15+
>MyClass : Symbol(MyClass, Decl(file1.tsx, 2, 1))
16+
17+
=== tests/cases/conformance/jsx/file2.tsx ===
18+
19+
// Should not elide React import
20+
import * as React from 'react';
21+
>React : Symbol(React, Decl(file2.tsx, 2, 6))
22+
23+
import {MyClass} from './file1';
24+
>MyClass : Symbol(MyClass, Decl(file2.tsx, 3, 8))
25+
26+
<MyClass />;
27+
>MyClass : Symbol(MyClass, Decl(file2.tsx, 3, 8))
28+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
=== tests/cases/conformance/jsx/react.d.ts ===
2+
3+
No type information for this code.declare module "react" {
4+
No type information for this code.
5+
No type information for this code.}
6+
No type information for this code.
7+
No type information for this code.=== tests/cases/conformance/jsx/file1.tsx ===
8+
declare module JSX {
9+
>JSX : any
10+
11+
interface Element { }
12+
>Element : Element
13+
}
14+
export class MyClass { }
15+
>MyClass : MyClass
16+
17+
=== tests/cases/conformance/jsx/file2.tsx ===
18+
19+
// Should not elide React import
20+
import * as React from 'react';
21+
>React : typeof React
22+
23+
import {MyClass} from './file1';
24+
>MyClass : typeof MyClass
25+
26+
<MyClass />;
27+
><MyClass /> : any
28+
>MyClass : typeof MyClass
29+

tests/baselines/reference/tsxReactEmit1.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ declare module JSX {
55
[s: string]: any;
66
}
77
}
8+
declare var React: any;
89

910
var p;
1011
var selfClosed1 = <div />;

tests/baselines/reference/tsxReactEmit1.symbols

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -12,133 +12,135 @@ declare module JSX {
1212
>s : Symbol(s, Decl(tsxReactEmit1.tsx, 3, 3))
1313
}
1414
}
15+
declare var React: any;
16+
>React : Symbol(React, Decl(tsxReactEmit1.tsx, 6, 11))
1517

1618
var p;
17-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
19+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
1820

1921
var selfClosed1 = <div />;
20-
>selfClosed1 : Symbol(selfClosed1, Decl(tsxReactEmit1.tsx, 8, 3))
22+
>selfClosed1 : Symbol(selfClosed1, Decl(tsxReactEmit1.tsx, 9, 3))
2123
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
2224

2325
var selfClosed2 = <div x="1" />;
24-
>selfClosed2 : Symbol(selfClosed2, Decl(tsxReactEmit1.tsx, 9, 3))
26+
>selfClosed2 : Symbol(selfClosed2, Decl(tsxReactEmit1.tsx, 10, 3))
2527
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
2628
>x : Symbol(unknown)
2729

2830
var selfClosed3 = <div x='1' />;
29-
>selfClosed3 : Symbol(selfClosed3, Decl(tsxReactEmit1.tsx, 10, 3))
31+
>selfClosed3 : Symbol(selfClosed3, Decl(tsxReactEmit1.tsx, 11, 3))
3032
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
3133
>x : Symbol(unknown)
3234

3335
var selfClosed4 = <div x="1" y='0' />;
34-
>selfClosed4 : Symbol(selfClosed4, Decl(tsxReactEmit1.tsx, 11, 3))
36+
>selfClosed4 : Symbol(selfClosed4, Decl(tsxReactEmit1.tsx, 12, 3))
3537
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
3638
>x : Symbol(unknown)
3739
>y : Symbol(unknown)
3840

3941
var selfClosed5 = <div x={0} y='0' />;
40-
>selfClosed5 : Symbol(selfClosed5, Decl(tsxReactEmit1.tsx, 12, 3))
42+
>selfClosed5 : Symbol(selfClosed5, Decl(tsxReactEmit1.tsx, 13, 3))
4143
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
4244
>x : Symbol(unknown)
4345
>y : Symbol(unknown)
4446

4547
var selfClosed6 = <div x={"1"} y='0' />;
46-
>selfClosed6 : Symbol(selfClosed6, Decl(tsxReactEmit1.tsx, 13, 3))
48+
>selfClosed6 : Symbol(selfClosed6, Decl(tsxReactEmit1.tsx, 14, 3))
4749
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
4850
>x : Symbol(unknown)
4951
>y : Symbol(unknown)
5052

5153
var selfClosed7 = <div x={p} y='p' b />;
52-
>selfClosed7 : Symbol(selfClosed7, Decl(tsxReactEmit1.tsx, 14, 3))
54+
>selfClosed7 : Symbol(selfClosed7, Decl(tsxReactEmit1.tsx, 15, 3))
5355
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
5456
>x : Symbol(unknown)
5557
>y : Symbol(unknown)
5658
>b : Symbol(unknown)
5759

5860
var openClosed1 = <div></div>;
59-
>openClosed1 : Symbol(openClosed1, Decl(tsxReactEmit1.tsx, 16, 3))
61+
>openClosed1 : Symbol(openClosed1, Decl(tsxReactEmit1.tsx, 17, 3))
6062
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
6163

6264
var openClosed2 = <div n='m'>foo</div>;
63-
>openClosed2 : Symbol(openClosed2, Decl(tsxReactEmit1.tsx, 17, 3))
65+
>openClosed2 : Symbol(openClosed2, Decl(tsxReactEmit1.tsx, 18, 3))
6466
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
6567
>n : Symbol(unknown)
6668

6769
var openClosed3 = <div n='m'>{p}</div>;
68-
>openClosed3 : Symbol(openClosed3, Decl(tsxReactEmit1.tsx, 18, 3))
70+
>openClosed3 : Symbol(openClosed3, Decl(tsxReactEmit1.tsx, 19, 3))
6971
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
7072
>n : Symbol(unknown)
7173

7274
var openClosed4 = <div n='m'>{p < p}</div>;
73-
>openClosed4 : Symbol(openClosed4, Decl(tsxReactEmit1.tsx, 19, 3))
75+
>openClosed4 : Symbol(openClosed4, Decl(tsxReactEmit1.tsx, 20, 3))
7476
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
7577
>n : Symbol(unknown)
76-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
77-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
78+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
79+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
7880

7981
var openClosed5 = <div n='m' b>{p > p}</div>;
80-
>openClosed5 : Symbol(openClosed5, Decl(tsxReactEmit1.tsx, 20, 3))
82+
>openClosed5 : Symbol(openClosed5, Decl(tsxReactEmit1.tsx, 21, 3))
8183
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
8284
>n : Symbol(unknown)
8385
>b : Symbol(unknown)
84-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
85-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
86+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
87+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
8688

8789
class SomeClass {
88-
>SomeClass : Symbol(SomeClass, Decl(tsxReactEmit1.tsx, 20, 45))
90+
>SomeClass : Symbol(SomeClass, Decl(tsxReactEmit1.tsx, 21, 45))
8991

9092
f() {
91-
>f : Symbol(f, Decl(tsxReactEmit1.tsx, 22, 17))
93+
>f : Symbol(f, Decl(tsxReactEmit1.tsx, 23, 17))
9294

9395
var rewrites1 = <div>{() => this}</div>;
94-
>rewrites1 : Symbol(rewrites1, Decl(tsxReactEmit1.tsx, 24, 5))
96+
>rewrites1 : Symbol(rewrites1, Decl(tsxReactEmit1.tsx, 25, 5))
9597
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
96-
>this : Symbol(SomeClass, Decl(tsxReactEmit1.tsx, 20, 45))
98+
>this : Symbol(SomeClass, Decl(tsxReactEmit1.tsx, 21, 45))
9799

98100
var rewrites2 = <div>{[p, ...p, p]}</div>;
99-
>rewrites2 : Symbol(rewrites2, Decl(tsxReactEmit1.tsx, 25, 5))
101+
>rewrites2 : Symbol(rewrites2, Decl(tsxReactEmit1.tsx, 26, 5))
100102
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
101-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
102-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
103-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
103+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
104+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
105+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
104106

105107
var rewrites3 = <div>{{p}}</div>;
106-
>rewrites3 : Symbol(rewrites3, Decl(tsxReactEmit1.tsx, 26, 5))
108+
>rewrites3 : Symbol(rewrites3, Decl(tsxReactEmit1.tsx, 27, 5))
107109
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
108-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 26, 25))
110+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 27, 25))
109111

110112
var rewrites4 = <div a={() => this}></div>;
111-
>rewrites4 : Symbol(rewrites4, Decl(tsxReactEmit1.tsx, 28, 5))
113+
>rewrites4 : Symbol(rewrites4, Decl(tsxReactEmit1.tsx, 29, 5))
112114
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
113115
>a : Symbol(unknown)
114-
>this : Symbol(SomeClass, Decl(tsxReactEmit1.tsx, 20, 45))
116+
>this : Symbol(SomeClass, Decl(tsxReactEmit1.tsx, 21, 45))
115117

116118
var rewrites5 = <div a={[p, ...p, p]}></div>;
117-
>rewrites5 : Symbol(rewrites5, Decl(tsxReactEmit1.tsx, 29, 5))
119+
>rewrites5 : Symbol(rewrites5, Decl(tsxReactEmit1.tsx, 30, 5))
118120
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
119121
>a : Symbol(unknown)
120-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
121-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
122-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 7, 3))
122+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
123+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
124+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 8, 3))
123125

124126
var rewrites6 = <div a={{p}}></div>;
125-
>rewrites6 : Symbol(rewrites6, Decl(tsxReactEmit1.tsx, 30, 5))
127+
>rewrites6 : Symbol(rewrites6, Decl(tsxReactEmit1.tsx, 31, 5))
126128
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
127129
>a : Symbol(unknown)
128-
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 30, 27))
130+
>p : Symbol(p, Decl(tsxReactEmit1.tsx, 31, 27))
129131
}
130132
}
131133

132134
var whitespace1 = <div> </div>;
133-
>whitespace1 : Symbol(whitespace1, Decl(tsxReactEmit1.tsx, 34, 3))
135+
>whitespace1 : Symbol(whitespace1, Decl(tsxReactEmit1.tsx, 35, 3))
134136
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
135137

136138
var whitespace2 = <div> {p} </div>;
137-
>whitespace2 : Symbol(whitespace2, Decl(tsxReactEmit1.tsx, 35, 3))
139+
>whitespace2 : Symbol(whitespace2, Decl(tsxReactEmit1.tsx, 36, 3))
138140
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
139141

140142
var whitespace3 = <div>
141-
>whitespace3 : Symbol(whitespace3, Decl(tsxReactEmit1.tsx, 36, 3))
143+
>whitespace3 : Symbol(whitespace3, Decl(tsxReactEmit1.tsx, 37, 3))
142144
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit1.tsx, 1, 22))
143145

144146
{p}

tests/baselines/reference/tsxReactEmit1.types

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ declare module JSX {
1212
>s : string
1313
}
1414
}
15+
declare var React: any;
16+
>React : any
1517

1618
var p;
1719
>p : any

tests/baselines/reference/tsxReactEmit2.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ declare module JSX {
55
[s: string]: any;
66
}
77
}
8+
declare var React: any;
89

910
var p1, p2, p3;
1011
var spreads1 = <div {...p1}>{p2}</div>;

tests/baselines/reference/tsxReactEmit2.symbols

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,34 @@ declare module JSX {
1212
>s : Symbol(s, Decl(tsxReactEmit2.tsx, 3, 3))
1313
}
1414
}
15+
declare var React: any;
16+
>React : Symbol(React, Decl(tsxReactEmit2.tsx, 6, 11))
1517

1618
var p1, p2, p3;
17-
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 7, 3))
18-
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 7, 7))
19-
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 7, 11))
19+
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
20+
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
21+
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
2022

2123
var spreads1 = <div {...p1}>{p2}</div>;
22-
>spreads1 : Symbol(spreads1, Decl(tsxReactEmit2.tsx, 8, 3))
24+
>spreads1 : Symbol(spreads1, Decl(tsxReactEmit2.tsx, 9, 3))
2325
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
2426

2527
var spreads2 = <div {...p1}>{p2}</div>;
26-
>spreads2 : Symbol(spreads2, Decl(tsxReactEmit2.tsx, 9, 3))
28+
>spreads2 : Symbol(spreads2, Decl(tsxReactEmit2.tsx, 10, 3))
2729
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
2830

2931
var spreads3 = <div x={p3} {...p1}>{p2}</div>;
30-
>spreads3 : Symbol(spreads3, Decl(tsxReactEmit2.tsx, 10, 3))
32+
>spreads3 : Symbol(spreads3, Decl(tsxReactEmit2.tsx, 11, 3))
3133
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
3234
>x : Symbol(unknown)
3335

3436
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
35-
>spreads4 : Symbol(spreads4, Decl(tsxReactEmit2.tsx, 11, 3))
37+
>spreads4 : Symbol(spreads4, Decl(tsxReactEmit2.tsx, 12, 3))
3638
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
3739
>x : Symbol(unknown)
3840

3941
var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
40-
>spreads5 : Symbol(spreads5, Decl(tsxReactEmit2.tsx, 12, 3))
42+
>spreads5 : Symbol(spreads5, Decl(tsxReactEmit2.tsx, 13, 3))
4143
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
4244
>x : Symbol(unknown)
4345
>y : Symbol(unknown)

tests/baselines/reference/tsxReactEmit2.types

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ declare module JSX {
1212
>s : string
1313
}
1414
}
15+
declare var React: any;
16+
>React : any
1517

1618
var p1, p2, p3;
1719
>p1 : any

0 commit comments

Comments
 (0)