Merge pull request #5040 from RyanCavanaugh/fix4688
Identify JSX Spread Attributes as Expression parents
This commit is contained in:
commit
19b208cec6
|
@ -985,6 +985,7 @@ namespace ts {
|
|||
return node === (<ComputedPropertyName>parent).expression;
|
||||
case SyntaxKind.Decorator:
|
||||
case SyntaxKind.JsxExpression:
|
||||
case SyntaxKind.JsxSpreadAttribute:
|
||||
return true;
|
||||
case SyntaxKind.ExpressionWithTypeArguments:
|
||||
return (<ExpressionWithTypeArguments>parent).expression === node && isExpressionWithTypeArgumentsInClassExtendsClause(parent);
|
||||
|
|
|
@ -145,6 +145,7 @@ var x =
|
|||
|
||||
<Component { ... x } y
|
||||
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
|
||||
>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
|
||||
>y : Symbol(unknown)
|
||||
|
||||
={2 } z />;
|
||||
|
@ -167,25 +168,31 @@ var x =
|
|||
|
||||
<Component {...x} />;
|
||||
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
|
||||
>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
|
||||
|
||||
<Component { ...x } y={2} />;
|
||||
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
|
||||
>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
|
||||
>y : Symbol(unknown)
|
||||
|
||||
<Component { ... x } y={2} z />;
|
||||
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
|
||||
>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3))
|
||||
>y : Symbol(unknown)
|
||||
>z : Symbol(unknown)
|
||||
|
||||
<Component x={1} {...y} />;
|
||||
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
|
||||
>x : Symbol(unknown)
|
||||
>y : Symbol(y, Decl(jsxReactTestSuite.tsx, 9, 11))
|
||||
|
||||
|
||||
<Component x={1} y="2" {...z} {...z}><Child /></Component>;
|
||||
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
|
||||
>x : Symbol(unknown)
|
||||
>y : Symbol(unknown)
|
||||
>z : Symbol(z, Decl(jsxReactTestSuite.tsx, 11, 11))
|
||||
>z : Symbol(z, Decl(jsxReactTestSuite.tsx, 11, 11))
|
||||
>Child : Symbol(Child, Decl(jsxReactTestSuite.tsx, 5, 11))
|
||||
>Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11))
|
||||
|
||||
|
|
|
@ -20,4 +20,5 @@ var x: any;
|
|||
// Should be OK
|
||||
<test1 {...x} />
|
||||
>test1 : Symbol(JSX.IntrinsicElements.test1, Decl(tsxAttributeResolution8.tsx, 2, 30))
|
||||
>x : Symbol(x, Decl(tsxAttributeResolution8.tsx, 7, 3))
|
||||
|
||||
|
|
|
@ -21,12 +21,14 @@ var p1, p2, p3;
|
|||
var spreads1 = <div {...p1}>{p2}</div>;
|
||||
>spreads1 : Symbol(spreads1, Decl(tsxEmit2.tsx, 8, 3))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
|
||||
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
|
||||
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
|
||||
|
||||
var spreads2 = <div {...p1}>{p2}</div>;
|
||||
>spreads2 : Symbol(spreads2, Decl(tsxEmit2.tsx, 9, 3))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
|
||||
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
|
||||
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
|
||||
|
||||
|
@ -35,12 +37,14 @@ var spreads3 = <div x={p3} {...p1}>{p2}</div>;
|
|||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
|
||||
>x : Symbol(unknown)
|
||||
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
|
||||
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
|
||||
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
|
||||
|
||||
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
|
||||
>spreads4 : Symbol(spreads4, Decl(tsxEmit2.tsx, 11, 3))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
|
||||
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
|
||||
>x : Symbol(unknown)
|
||||
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
|
||||
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
|
||||
|
@ -51,6 +55,7 @@ var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
|
|||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22))
|
||||
>x : Symbol(unknown)
|
||||
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
|
||||
>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3))
|
||||
>y : Symbol(unknown)
|
||||
>p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11))
|
||||
>p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7))
|
||||
|
|
|
@ -26,6 +26,7 @@ declare var Foo, React;
|
|||
// Should see mod_1['default'] in emit here
|
||||
<Foo {...Main}></Foo>;
|
||||
>Foo : Symbol(Foo, Decl(app.tsx, 1, 11))
|
||||
>Main : Symbol(Main, Decl(app.tsx, 0, 6))
|
||||
>Foo : Symbol(Foo, Decl(app.tsx, 1, 11))
|
||||
|
||||
|
||||
|
|
|
@ -23,12 +23,14 @@ var p1, p2, p3;
|
|||
var spreads1 = <div {...p1}>{p2}</div>;
|
||||
>spreads1 : Symbol(spreads1, Decl(tsxReactEmit2.tsx, 9, 3))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
|
||||
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
|
||||
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
|
||||
|
||||
var spreads2 = <div {...p1}>{p2}</div>;
|
||||
>spreads2 : Symbol(spreads2, Decl(tsxReactEmit2.tsx, 10, 3))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
|
||||
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
|
||||
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
|
||||
|
||||
|
@ -37,12 +39,14 @@ var spreads3 = <div x={p3} {...p1}>{p2}</div>;
|
|||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
|
||||
>x : Symbol(unknown)
|
||||
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
|
||||
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
|
||||
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
|
||||
|
||||
var spreads4 = <div {...p1} x={p3} >{p2}</div>;
|
||||
>spreads4 : Symbol(spreads4, Decl(tsxReactEmit2.tsx, 12, 3))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
|
||||
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
|
||||
>x : Symbol(unknown)
|
||||
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
|
||||
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
|
||||
|
@ -53,6 +57,7 @@ var spreads5 = <div x={p2} {...p1} y={p3}>{p2}</div>;
|
|||
>div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22))
|
||||
>x : Symbol(unknown)
|
||||
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
|
||||
>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3))
|
||||
>y : Symbol(unknown)
|
||||
>p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11))
|
||||
>p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7))
|
||||
|
|
|
@ -31,5 +31,6 @@ var spread1 = <div x='' {...foo} y='' />;
|
|||
>spread1 : Symbol(spread1, Decl(react-consumer.tsx, 4, 3))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 2, 22))
|
||||
>x : Symbol(unknown)
|
||||
>foo : Symbol(foo, Decl(react-consumer.tsx, 3, 3))
|
||||
>y : Symbol(unknown)
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@ namespace M {
|
|||
>spread1 : Symbol(spread1, Decl(react-consumer.tsx, 8, 4))
|
||||
>div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 2, 22))
|
||||
>x : Symbol(unknown)
|
||||
>foo : Symbol(foo, Decl(react-consumer.tsx, 7, 4))
|
||||
>y : Symbol(unknown)
|
||||
}
|
||||
|
||||
|
|
25
tests/cases/fourslash/jsxSpreadReference.ts
Normal file
25
tests/cases/fourslash/jsxSpreadReference.ts
Normal file
|
@ -0,0 +1,25 @@
|
|||
/// <reference path='fourslash.ts' />
|
||||
|
||||
//@Filename: file.tsx
|
||||
//// declare module JSX {
|
||||
//// interface Element { }
|
||||
//// interface IntrinsicElements {
|
||||
//// }
|
||||
//// interface ElementAttributesProperty { props }
|
||||
//// }
|
||||
//// class MyClass {
|
||||
//// props: {
|
||||
//// name?: string;
|
||||
//// size?: number;
|
||||
//// }
|
||||
//// }
|
||||
////
|
||||
//// var [|/*dst*/nn|]: {name?: string; size?: number};
|
||||
//// var x = <MyClass {...[|n/*src*/n|]}></MyClass>;
|
||||
|
||||
goTo.marker('src');
|
||||
goTo.definition();
|
||||
verify.caretAtMarker('dst');
|
||||
|
||||
goTo.marker('src');
|
||||
verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false);
|
Loading…
Reference in a new issue