Skip to content

Commit a8db813

Browse files
authored
Merge pull request #11762 from Microsoft/jsxEmit
Set parent of reactnamespace identifier to be parse tree node
2 parents 39a4feb + 202093a commit a8db813

File tree

5 files changed

+390
-1
lines changed

5 files changed

+390
-1
lines changed

src/compiler/factory.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1625,7 +1625,9 @@ namespace ts {
16251625
// flag and setting a parent node.
16261626
const react = createIdentifier(reactNamespace || "React");
16271627
react.flags &= ~NodeFlags.Synthesized;
1628-
react.parent = parent;
1628+
// Set the parent that is in parse tree
1629+
// this makes sure that parent chain is intact for checker to traverse complete scope tree
1630+
react.parent = getParseTreeNode(parent);
16291631
return react;
16301632
}
16311633

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//// [tests/cases/compiler/jsxEmitWithAttributes.ts] ////
2+
3+
//// [Element.ts]
4+
5+
declare namespace JSX {
6+
interface Element {
7+
name: string;
8+
isIntrinsic: boolean;
9+
isCustomElement: boolean;
10+
toString(renderId?: number): string;
11+
bindDOM(renderId?: number): number;
12+
resetComponent(): void;
13+
instantiateComponents(renderId?: number): number;
14+
props: any;
15+
}
16+
}
17+
export namespace Element {
18+
export function isElement(el: any): el is JSX.Element {
19+
return el.markAsChildOfRootElement !== undefined;
20+
}
21+
22+
export function createElement(args: any[]) {
23+
24+
return {
25+
}
26+
}
27+
}
28+
29+
export let createElement = Element.createElement;
30+
31+
function toCamelCase(text: string): string {
32+
return text[0].toLowerCase() + text.substring(1);
33+
}
34+
35+
//// [test.tsx]
36+
import { Element} from './Element';
37+
38+
let c: {
39+
a?: {
40+
b: string
41+
}
42+
};
43+
44+
class A {
45+
view() {
46+
return [
47+
<meta content="helloworld"></meta>,
48+
<meta content={c.a!.b}></meta>
49+
];
50+
}
51+
}
52+
53+
//// [Element.js]
54+
"use strict";
55+
var Element;
56+
(function (Element) {
57+
function isElement(el) {
58+
return el.markAsChildOfRootElement !== undefined;
59+
}
60+
Element.isElement = isElement;
61+
function createElement(args) {
62+
return {};
63+
}
64+
Element.createElement = createElement;
65+
})(Element = exports.Element || (exports.Element = {}));
66+
exports.createElement = Element.createElement;
67+
function toCamelCase(text) {
68+
return text[0].toLowerCase() + text.substring(1);
69+
}
70+
//// [test.js]
71+
"use strict";
72+
const Element_1 = require("./Element");
73+
let c;
74+
class A {
75+
view() {
76+
return [
77+
Element_1.Element.createElement("meta", { content: "helloworld" }),
78+
Element_1.Element.createElement("meta", { content: c.a.b })
79+
];
80+
}
81+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
=== tests/cases/compiler/Element.ts ===
2+
3+
declare namespace JSX {
4+
>JSX : Symbol(JSX, Decl(Element.ts, 0, 0))
5+
6+
interface Element {
7+
>Element : Symbol(Element, Decl(Element.ts, 1, 23))
8+
9+
name: string;
10+
>name : Symbol(Element.name, Decl(Element.ts, 2, 23))
11+
12+
isIntrinsic: boolean;
13+
>isIntrinsic : Symbol(Element.isIntrinsic, Decl(Element.ts, 3, 21))
14+
15+
isCustomElement: boolean;
16+
>isCustomElement : Symbol(Element.isCustomElement, Decl(Element.ts, 4, 29))
17+
18+
toString(renderId?: number): string;
19+
>toString : Symbol(Element.toString, Decl(Element.ts, 5, 33))
20+
>renderId : Symbol(renderId, Decl(Element.ts, 6, 17))
21+
22+
bindDOM(renderId?: number): number;
23+
>bindDOM : Symbol(Element.bindDOM, Decl(Element.ts, 6, 44))
24+
>renderId : Symbol(renderId, Decl(Element.ts, 7, 16))
25+
26+
resetComponent(): void;
27+
>resetComponent : Symbol(Element.resetComponent, Decl(Element.ts, 7, 43))
28+
29+
instantiateComponents(renderId?: number): number;
30+
>instantiateComponents : Symbol(Element.instantiateComponents, Decl(Element.ts, 8, 31))
31+
>renderId : Symbol(renderId, Decl(Element.ts, 9, 30))
32+
33+
props: any;
34+
>props : Symbol(Element.props, Decl(Element.ts, 9, 57))
35+
}
36+
}
37+
export namespace Element {
38+
>Element : Symbol(Element, Decl(Element.ts, 12, 1))
39+
40+
export function isElement(el: any): el is JSX.Element {
41+
>isElement : Symbol(isElement, Decl(Element.ts, 13, 26))
42+
>el : Symbol(el, Decl(Element.ts, 14, 30))
43+
>el : Symbol(el, Decl(Element.ts, 14, 30))
44+
>JSX : Symbol(JSX, Decl(Element.ts, 0, 0))
45+
>Element : Symbol(JSX.Element, Decl(Element.ts, 1, 23))
46+
47+
return el.markAsChildOfRootElement !== undefined;
48+
>el : Symbol(el, Decl(Element.ts, 14, 30))
49+
>undefined : Symbol(undefined)
50+
}
51+
52+
export function createElement(args: any[]) {
53+
>createElement : Symbol(createElement, Decl(Element.ts, 16, 5))
54+
>args : Symbol(args, Decl(Element.ts, 18, 34))
55+
56+
return {
57+
}
58+
}
59+
}
60+
61+
export let createElement = Element.createElement;
62+
>createElement : Symbol(createElement, Decl(Element.ts, 25, 10))
63+
>Element.createElement : Symbol(Element.createElement, Decl(Element.ts, 16, 5))
64+
>Element : Symbol(Element, Decl(Element.ts, 12, 1))
65+
>createElement : Symbol(Element.createElement, Decl(Element.ts, 16, 5))
66+
67+
function toCamelCase(text: string): string {
68+
>toCamelCase : Symbol(toCamelCase, Decl(Element.ts, 25, 49))
69+
>text : Symbol(text, Decl(Element.ts, 27, 21))
70+
71+
return text[0].toLowerCase() + text.substring(1);
72+
>text[0].toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --))
73+
>text : Symbol(text, Decl(Element.ts, 27, 21))
74+
>toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --))
75+
>text.substring : Symbol(String.substring, Decl(lib.es5.d.ts, --, --))
76+
>text : Symbol(text, Decl(Element.ts, 27, 21))
77+
>substring : Symbol(String.substring, Decl(lib.es5.d.ts, --, --))
78+
}
79+
80+
=== tests/cases/compiler/test.tsx ===
81+
import { Element} from './Element';
82+
>Element : Symbol(Element, Decl(test.tsx, 0, 8))
83+
84+
let c: {
85+
>c : Symbol(c, Decl(test.tsx, 2, 3))
86+
87+
a?: {
88+
>a : Symbol(a, Decl(test.tsx, 2, 8))
89+
90+
b: string
91+
>b : Symbol(b, Decl(test.tsx, 3, 6))
92+
}
93+
};
94+
95+
class A {
96+
>A : Symbol(A, Decl(test.tsx, 6, 2))
97+
98+
view() {
99+
>view : Symbol(A.view, Decl(test.tsx, 8, 9))
100+
101+
return [
102+
<meta content="helloworld"></meta>,
103+
>meta : Symbol(unknown)
104+
>content : Symbol(unknown)
105+
>meta : Symbol(unknown)
106+
107+
<meta content={c.a!.b}></meta>
108+
>meta : Symbol(unknown)
109+
>content : Symbol(unknown)
110+
>c.a!.b : Symbol(b, Decl(test.tsx, 3, 6))
111+
>c.a : Symbol(a, Decl(test.tsx, 2, 8))
112+
>c : Symbol(c, Decl(test.tsx, 2, 3))
113+
>a : Symbol(a, Decl(test.tsx, 2, 8))
114+
>b : Symbol(b, Decl(test.tsx, 3, 6))
115+
>meta : Symbol(unknown)
116+
117+
];
118+
}
119+
}
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
=== tests/cases/compiler/Element.ts ===
2+
3+
declare namespace JSX {
4+
>JSX : any
5+
6+
interface Element {
7+
>Element : Element
8+
9+
name: string;
10+
>name : string
11+
12+
isIntrinsic: boolean;
13+
>isIntrinsic : boolean
14+
15+
isCustomElement: boolean;
16+
>isCustomElement : boolean
17+
18+
toString(renderId?: number): string;
19+
>toString : (renderId?: number) => string
20+
>renderId : number
21+
22+
bindDOM(renderId?: number): number;
23+
>bindDOM : (renderId?: number) => number
24+
>renderId : number
25+
26+
resetComponent(): void;
27+
>resetComponent : () => void
28+
29+
instantiateComponents(renderId?: number): number;
30+
>instantiateComponents : (renderId?: number) => number
31+
>renderId : number
32+
33+
props: any;
34+
>props : any
35+
}
36+
}
37+
export namespace Element {
38+
>Element : typeof Element
39+
40+
export function isElement(el: any): el is JSX.Element {
41+
>isElement : (el: any) => el is JSX.Element
42+
>el : any
43+
>el : any
44+
>JSX : any
45+
>Element : JSX.Element
46+
47+
return el.markAsChildOfRootElement !== undefined;
48+
>el.markAsChildOfRootElement !== undefined : boolean
49+
>el.markAsChildOfRootElement : any
50+
>el : any
51+
>markAsChildOfRootElement : any
52+
>undefined : undefined
53+
}
54+
55+
export function createElement(args: any[]) {
56+
>createElement : (args: any[]) => {}
57+
>args : any[]
58+
59+
return {
60+
>{ } : {}
61+
}
62+
}
63+
}
64+
65+
export let createElement = Element.createElement;
66+
>createElement : (args: any[]) => {}
67+
>Element.createElement : (args: any[]) => {}
68+
>Element : typeof Element
69+
>createElement : (args: any[]) => {}
70+
71+
function toCamelCase(text: string): string {
72+
>toCamelCase : (text: string) => string
73+
>text : string
74+
75+
return text[0].toLowerCase() + text.substring(1);
76+
>text[0].toLowerCase() + text.substring(1) : string
77+
>text[0].toLowerCase() : string
78+
>text[0].toLowerCase : () => string
79+
>text[0] : string
80+
>text : string
81+
>0 : 0
82+
>toLowerCase : () => string
83+
>text.substring(1) : string
84+
>text.substring : (start: number, end?: number) => string
85+
>text : string
86+
>substring : (start: number, end?: number) => string
87+
>1 : 1
88+
}
89+
90+
=== tests/cases/compiler/test.tsx ===
91+
import { Element} from './Element';
92+
>Element : typeof Element
93+
94+
let c: {
95+
>c : { a?: { b: string; }; }
96+
97+
a?: {
98+
>a : { b: string; }
99+
100+
b: string
101+
>b : string
102+
}
103+
};
104+
105+
class A {
106+
>A : A
107+
108+
view() {
109+
>view : () => any[]
110+
111+
return [
112+
>[ <meta content="helloworld"></meta>, <meta content={c.a!.b}></meta> ] : any[]
113+
114+
<meta content="helloworld"></meta>,
115+
><meta content="helloworld"></meta> : any
116+
>meta : any
117+
>content : any
118+
>meta : any
119+
120+
<meta content={c.a!.b}></meta>
121+
><meta content={c.a!.b}></meta> : any
122+
>meta : any
123+
>content : any
124+
>c.a!.b : string
125+
>c.a! : { b: string; }
126+
>c.a : { b: string; }
127+
>c : { a?: { b: string; }; }
128+
>a : { b: string; }
129+
>b : string
130+
>meta : any
131+
132+
];
133+
}
134+
}

0 commit comments

Comments
 (0)