Skip to content

Commit 19b208c

Browse files
committed
Merge pull request #5040 from RyanCavanaugh/fix4688
Identify JSX Spread Attributes as Expression parents
2 parents cc95dca + c781492 commit 19b208c

File tree

9 files changed

+47
-0
lines changed

9 files changed

+47
-0
lines changed

src/compiler/utilities.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,7 @@ namespace ts {
985985
return node === (<ComputedPropertyName>parent).expression;
986986
case SyntaxKind.Decorator:
987987
case SyntaxKind.JsxExpression:
988+
case SyntaxKind.JsxSpreadAttribute:
988989
return true;
989990
case SyntaxKind.ExpressionWithTypeArguments:
990991
return (<ExpressionWithTypeArguments>parent).expression === node && isExpressionWithTypeArgumentsInClassExtendsClause(parent);

tests/baselines/reference/jsxReactTestSuite.symbols

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ var x =
145145

146146
<Component { ... x } y
147147
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
148+
>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
148149
>y : Symbol(unknown)
149150

150151
={2 } z />;
@@ -167,25 +168,31 @@ var x =
167168

168169
<Component {...x} />;
169170
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
171+
>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
170172

171173
<Component { ...x } y={2} />;
172174
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
175+
>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
173176
>y : Symbol(unknown)
174177

175178
<Component { ... x } y={2} z />;
176179
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
180+
>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
177181
>y : Symbol(unknown)
178182
>z : Symbol(unknown)
179183

180184
<Component x={1} {...y} />;
181185
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
182186
>x : Symbol(unknown)
187+
>y : Symbol(y, Decl(jsxReactTestSuite.tsx, 9, 11))
183188

184189

185190
<Component x={1} y="2" {...z} {...z}><Child /></Component>;
186191
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
187192
>x : Symbol(unknown)
188193
>y : Symbol(unknown)
194+
>z : Symbol(z, Decl(jsxReactTestSuite.tsx, 11, 11))
195+
>z : Symbol(z, Decl(jsxReactTestSuite.tsx, 11, 11))
189196
>Child : Symbol(Child, Decl(jsxReactTestSuite.tsx, 5, 11))
190197
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
191198

tests/baselines/reference/tsxAttributeResolution8.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ var x: any;
2020
// Should be OK
2121
<test1 {...x} />
2222
>test1 : Symbol(JSX.IntrinsicElements.test1, Decl(tsxAttributeResolution8.tsx, 2, 30))
23+
>x : Symbol(x, Decl(tsxAttributeResolution8.tsx, 7, 3))
2324

tests/baselines/reference/tsxEmit2.symbols

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ 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+
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
2425
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
2526
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
2627

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

@@ -35,12 +37,14 @@ var spreads3 = <div x={p3} {...p1}>{p2}</div>;
3537
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
3638
>x : Symbol(unknown)
3739
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
40+
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
3841
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
3942
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
4043

4144
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
4245
>spreads4 : Symbol(spreads4, Decl(tsxEmit2.tsx, 11, 3))
4346
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
47+
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
4448
>x : Symbol(unknown)
4549
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
4650
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
@@ -51,6 +55,7 @@ var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
5155
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
5256
>x : Symbol(unknown)
5357
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
58+
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
5459
>y : Symbol(unknown)
5560
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
5661
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))

tests/baselines/reference/tsxExternalModuleEmit2.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ declare var Foo, React;
2626
// Should see mod_1['default'] in emit here
2727
<Foo {...Main}></Foo>;
2828
>Foo : Symbol(Foo, Decl(app.tsx, 1, 11))
29+
>Main : Symbol(Main, Decl(app.tsx, 0, 6))
2930
>Foo : Symbol(Foo, Decl(app.tsx, 1, 11))
3031

3132

tests/baselines/reference/tsxReactEmit2.symbols

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ 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+
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
2627
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
2728
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
2829

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

@@ -37,12 +39,14 @@ var spreads3 = <div x={p3} {...p1}>{p2}</div>;
3739
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
3840
>x : Symbol(unknown)
3941
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
42+
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
4043
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
4144
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
4245

4346
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
4447
>spreads4 : Symbol(spreads4, Decl(tsxReactEmit2.tsx, 12, 3))
4548
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
49+
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
4650
>x : Symbol(unknown)
4751
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
4852
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
@@ -53,6 +57,7 @@ var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
5357
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
5458
>x : Symbol(unknown)
5559
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
60+
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
5661
>y : Symbol(unknown)
5762
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
5863
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))

tests/baselines/reference/tsxReactEmit5.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,6 @@ var spread1 = <div x='' {...foo} y='' />;
3131
>spread1 : Symbol(spread1, Decl(react-consumer.tsx, 4, 3))
3232
>div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 2, 22))
3333
>x : Symbol(unknown)
34+
>foo : Symbol(foo, Decl(react-consumer.tsx, 3, 3))
3435
>y : Symbol(unknown)
3536

tests/baselines/reference/tsxReactEmit6.symbols

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ namespace M {
3434
>spread1 : Symbol(spread1, Decl(react-consumer.tsx, 8, 4))
3535
>div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 2, 22))
3636
>x : Symbol(unknown)
37+
>foo : Symbol(foo, Decl(react-consumer.tsx, 7, 4))
3738
>y : Symbol(unknown)
3839
}
3940

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//@Filename: file.tsx
4+
//// declare module JSX {
5+
//// interface Element { }
6+
//// interface IntrinsicElements {
7+
//// }
8+
//// interface ElementAttributesProperty { props }
9+
//// }
10+
//// class MyClass {
11+
//// props: {
12+
//// name?: string;
13+
//// size?: number;
14+
//// }
15+
//// }
16+
////
17+
//// var [|/*dst*/nn|]: {name?: string; size?: number};
18+
//// var x = <MyClass {...[|n/*src*/n|]}></MyClass>;
19+
20+
goTo.marker('src');
21+
goTo.definition();
22+
verify.caretAtMarker('dst');
23+
24+
goTo.marker('src');
25+
verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false);

0 commit comments

Comments
 (0)