Skip to content

Commit b82fe52

Browse files
authored
Merge pull request #13191 from Microsoft/fix13157
Aggregate transform flags for ExpressionWithTypeArguments
2 parents 01a7ba8 + d7b61b2 commit b82fe52

File tree

5 files changed

+136
-1
lines changed

5 files changed

+136
-1
lines changed

src/compiler/visitor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1328,7 +1328,7 @@ namespace ts {
13281328
function aggregateTransformFlagsForSubtree(node: Node): TransformFlags {
13291329
// We do not transform ambient declarations or types, so there is no need to
13301330
// recursively aggregate transform flags.
1331-
if (hasModifier(node, ModifierFlags.Ambient) || isTypeNode(node)) {
1331+
if (hasModifier(node, ModifierFlags.Ambient) || (isTypeNode(node) && node.kind !== SyntaxKind.ExpressionWithTypeArguments)) {
13321332
return TransformFlags.None;
13331333
}
13341334

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//// [jsxInExtendsClause.tsx]
2+
// https://github.com/Microsoft/TypeScript/issues/13157
3+
declare namespace React {
4+
interface ComponentClass<P> { new (): Component<P, {}>; }
5+
class Component<A, B> {}
6+
}
7+
declare function createComponentClass<P>(factory: () => React.ComponentClass<P>): React.ComponentClass<P>;
8+
class Foo extends createComponentClass(() => class extends React.Component<{}, {}> {
9+
render() {
10+
return <span>Hello, world!</span>;
11+
}
12+
}) {}
13+
14+
//// [jsxInExtendsClause.js]
15+
var __extends = (this && this.__extends) || function (d, b) {
16+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
17+
function __() { this.constructor = d; }
18+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
19+
};
20+
var Foo = (function (_super) {
21+
__extends(Foo, _super);
22+
function Foo() {
23+
return _super.apply(this, arguments) || this;
24+
}
25+
return Foo;
26+
}(createComponentClass(function () { return (function (_super) {
27+
__extends(class_1, _super);
28+
function class_1() {
29+
return _super.apply(this, arguments) || this;
30+
}
31+
class_1.prototype.render = function () {
32+
return React.createElement("span", null, "Hello, world!");
33+
};
34+
return class_1;
35+
}(React.Component)); })));
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
=== tests/cases/compiler/jsxInExtendsClause.tsx ===
2+
// https://github.com/Microsoft/TypeScript/issues/13157
3+
declare namespace React {
4+
>React : Symbol(React, Decl(jsxInExtendsClause.tsx, 0, 0))
5+
6+
interface ComponentClass<P> { new (): Component<P, {}>; }
7+
>ComponentClass : Symbol(ComponentClass, Decl(jsxInExtendsClause.tsx, 1, 25))
8+
>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 2, 27))
9+
>Component : Symbol(Component, Decl(jsxInExtendsClause.tsx, 2, 59))
10+
>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 2, 27))
11+
12+
class Component<A, B> {}
13+
>Component : Symbol(Component, Decl(jsxInExtendsClause.tsx, 2, 59))
14+
>A : Symbol(A, Decl(jsxInExtendsClause.tsx, 3, 18))
15+
>B : Symbol(B, Decl(jsxInExtendsClause.tsx, 3, 20))
16+
}
17+
declare function createComponentClass<P>(factory: () => React.ComponentClass<P>): React.ComponentClass<P>;
18+
>createComponentClass : Symbol(createComponentClass, Decl(jsxInExtendsClause.tsx, 4, 1))
19+
>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 5, 38))
20+
>factory : Symbol(factory, Decl(jsxInExtendsClause.tsx, 5, 41))
21+
>React : Symbol(React, Decl(jsxInExtendsClause.tsx, 0, 0))
22+
>ComponentClass : Symbol(React.ComponentClass, Decl(jsxInExtendsClause.tsx, 1, 25))
23+
>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 5, 38))
24+
>React : Symbol(React, Decl(jsxInExtendsClause.tsx, 0, 0))
25+
>ComponentClass : Symbol(React.ComponentClass, Decl(jsxInExtendsClause.tsx, 1, 25))
26+
>P : Symbol(P, Decl(jsxInExtendsClause.tsx, 5, 38))
27+
28+
class Foo extends createComponentClass(() => class extends React.Component<{}, {}> {
29+
>Foo : Symbol(Foo, Decl(jsxInExtendsClause.tsx, 5, 106))
30+
>createComponentClass : Symbol(createComponentClass, Decl(jsxInExtendsClause.tsx, 4, 1))
31+
>React.Component : Symbol(React.Component, Decl(jsxInExtendsClause.tsx, 2, 59))
32+
>React : Symbol(React, Decl(jsxInExtendsClause.tsx, 0, 0))
33+
>Component : Symbol(React.Component, Decl(jsxInExtendsClause.tsx, 2, 59))
34+
35+
render() {
36+
>render : Symbol((Anonymous class).render, Decl(jsxInExtendsClause.tsx, 6, 84))
37+
38+
return <span>Hello, world!</span>;
39+
>span : Symbol(unknown)
40+
>span : Symbol(unknown)
41+
}
42+
}) {}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
=== tests/cases/compiler/jsxInExtendsClause.tsx ===
2+
// https://github.com/Microsoft/TypeScript/issues/13157
3+
declare namespace React {
4+
>React : typeof React
5+
6+
interface ComponentClass<P> { new (): Component<P, {}>; }
7+
>ComponentClass : ComponentClass<P>
8+
>P : P
9+
>Component : Component<A, B>
10+
>P : P
11+
12+
class Component<A, B> {}
13+
>Component : Component<A, B>
14+
>A : A
15+
>B : B
16+
}
17+
declare function createComponentClass<P>(factory: () => React.ComponentClass<P>): React.ComponentClass<P>;
18+
>createComponentClass : <P>(factory: () => React.ComponentClass<P>) => React.ComponentClass<P>
19+
>P : P
20+
>factory : () => React.ComponentClass<P>
21+
>React : any
22+
>ComponentClass : React.ComponentClass<P>
23+
>P : P
24+
>React : any
25+
>ComponentClass : React.ComponentClass<P>
26+
>P : P
27+
28+
class Foo extends createComponentClass(() => class extends React.Component<{}, {}> {
29+
>Foo : Foo
30+
>createComponentClass(() => class extends React.Component<{}, {}> { render() { return <span>Hello, world!</span>; }}) : React.Component<{}, {}>
31+
>createComponentClass : <P>(factory: () => React.ComponentClass<P>) => React.ComponentClass<P>
32+
>() => class extends React.Component<{}, {}> { render() { return <span>Hello, world!</span>; }} : () => typeof (Anonymous class)
33+
>class extends React.Component<{}, {}> { render() { return <span>Hello, world!</span>; }} : typeof (Anonymous class)
34+
>React.Component : React.Component<{}, {}>
35+
>React : typeof React
36+
>Component : typeof React.Component
37+
38+
render() {
39+
>render : () => any
40+
41+
return <span>Hello, world!</span>;
42+
><span>Hello, world!</span> : any
43+
>span : any
44+
>span : any
45+
}
46+
}) {}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// @jsx: react
2+
// https://github.com/Microsoft/TypeScript/issues/13157
3+
declare namespace React {
4+
interface ComponentClass<P> { new (): Component<P, {}>; }
5+
class Component<A, B> {}
6+
}
7+
declare function createComponentClass<P>(factory: () => React.ComponentClass<P>): React.ComponentClass<P>;
8+
class Foo extends createComponentClass(() => class extends React.Component<{}, {}> {
9+
render() {
10+
return <span>Hello, world!</span>;
11+
}
12+
}) {}

0 commit comments

Comments
 (0)