diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index fd6d3a109d..c3a8cc15b0 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -81,7 +81,7 @@ namespace ts.FindAllReferences { return undefined; } - export function getDeclarationForDeclarationSpan(node: NamedDeclaration | BinaryExpression | undefined): DeclarationNode | undefined { + export function getDeclarationForDeclarationSpan(node: NamedDeclaration | BinaryExpression | ForInOrOfStatement | undefined): DeclarationNode | undefined { if (!node) return undefined; switch (node.kind) { case SyntaxKind.VariableDeclaration: @@ -90,8 +90,8 @@ namespace ts.FindAllReferences { isVariableStatement(node.parent.parent) ? node.parent.parent : isForInOrOfStatement(node.parent.parent) ? - { start: node.parent.parent.initializer, end: node.parent.parent.expression } : - node.parent; + getDeclarationForDeclarationSpan(node.parent.parent) : + node.parent; case SyntaxKind.BindingElement: return getDeclarationForDeclarationSpan(node.parent.parent as NamedDeclaration); @@ -114,12 +114,27 @@ namespace ts.FindAllReferences { case SyntaxKind.BinaryExpression: return isExpressionStatement(node.parent) ? node.parent : - undefined; + node; - // Not really interesting definition + case SyntaxKind.ForOfStatement: + case SyntaxKind.ForInStatement: + return { + start: (node as ForInOrOfStatement).initializer, + end: (node as ForInOrOfStatement).expression + }; + + case SyntaxKind.PropertyAssignment: // TODO(shkamat):: Should we show whole object literal instead? case SyntaxKind.ShorthandPropertyAssignment: - return undefined; + return isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent) ? + getDeclarationForDeclarationSpan( + findAncestor(node.parent, node => + isBinaryExpression(node) || isForInOrOfStatement(node) + ) as BinaryExpression | ForInOrOfStatement + ) : + node.kind === SyntaxKind.PropertyAssignment ? + node : + undefined; default: return node; diff --git a/tests/cases/fourslash/renameDestructuringAssignment.ts b/tests/cases/fourslash/renameDestructuringAssignment.ts index 89a44a3a9d..7833f4166a 100644 --- a/tests/cases/fourslash/renameDestructuringAssignment.ts +++ b/tests/cases/fourslash/renameDestructuringAssignment.ts @@ -1,10 +1,10 @@ /// ////interface I { -//// [|x|]: number; +//// [|[|{| "declarationRangeIndex": 0 |}x|]: number;|] ////} ////var a: I; ////var x; -////({ [|x|]: x } = a); +////([|{ [|{| "declarationRangeIndex": 2 |}x|]: x } = a|]); -verify.rangesAreRenameLocations(); +verify.rangesAreRenameLocations(test.rangesByText().get("x")); diff --git a/tests/cases/fourslash/renameDestructuringAssignmentInFor.ts b/tests/cases/fourslash/renameDestructuringAssignmentInFor.ts index 2c8ad51f48..0ed560bb3f 100644 --- a/tests/cases/fourslash/renameDestructuringAssignmentInFor.ts +++ b/tests/cases/fourslash/renameDestructuringAssignmentInFor.ts @@ -1,20 +1,20 @@ /// ////interface I { -//// [|property1|]: number; +//// [|[|{| "declarationRangeIndex": 0 |}property1|]: number;|] //// property2: string; ////} ////var elems: I[]; //// -////var p2: number, [|property1|]: number; -////for ({ [|property1|] } = elems[0]; p2 < 100; p2++) { +////var p2: number, [|[|{| "declarationRangeIndex": 2 |}property1|]: number|]; +////for ([|{ [|{| "declarationRangeIndex": 4 |}property1|] } = elems[0]|]; p2 < 100; p2++) { //// p2 = [|property1|]++; ////} -////for ({ [|property1|]: p2 } = elems[0]; p2 < 100; p2++) { +////for ([|{ [|{| "declarationRangeIndex": 7 |}property1|]: p2 } = elems[0]|]; p2 < 100; p2++) { ////} verify.noErrors(); const ranges = test.ranges(); -const [r0, r1, r2, r3, r4] = ranges; +const [r0Def, r0, r1Def, r1, r2Def, r2, r3, r4Def, r4] = ranges; verify.renameLocations([r0, r4], [r0, { range: r2, suffixText: ": property1" }, r4]); verify.renameLocations([r1, r2, r3], [r1, { range: r2, prefixText: "property1: " }, r3]); diff --git a/tests/cases/fourslash/renameDestructuringAssignmentInForOf.ts b/tests/cases/fourslash/renameDestructuringAssignmentInForOf.ts index 38703a68b9..80bc064ac0 100644 --- a/tests/cases/fourslash/renameDestructuringAssignmentInForOf.ts +++ b/tests/cases/fourslash/renameDestructuringAssignmentInForOf.ts @@ -1,20 +1,20 @@ /// ////interface I { -//// [|property1|]: number; +//// [|[|{| "declarationRangeIndex": 0 |}property1|]: number;|] //// property2: string; ////} ////var elems: I[]; //// -////var [|property1|]: number, p2: number; -////for ({ [|property1|] } of elems) { +////var [|[|{| "declarationRangeIndex": 2 |}property1|]: number|], p2: number; +////for ([|{ [|{| "declarationRangeIndex": 4 |}property1|] } of elems|]) { //// [|property1|]++; ////} -////for ({ [|property1|]: p2 } of elems) { +////for ([|{ [|{| "declarationRangeIndex": 7 |}property1|]: p2 } of elems|]) { ////} verify.noErrors(); const ranges = test.ranges(); -const [r0, r1, r2, r3, r4] = ranges; +const [r0Def, r0, r1Def, r1, r2Def, r2, r3, r4Def, r4] = ranges; verify.renameLocations([r0, r4], [r0, { range: r2, suffixText: ": property1" }, r4]); verify.renameLocations([r1, r2, r3], [r1, { range: r2, prefixText: "property1: " }, r3]); diff --git a/tests/cases/fourslash/renameDestructuringAssignmentNestedInArrayLiteral.ts b/tests/cases/fourslash/renameDestructuringAssignmentNestedInArrayLiteral.ts index 292aaf1bf6..2b8b882407 100644 --- a/tests/cases/fourslash/renameDestructuringAssignmentNestedInArrayLiteral.ts +++ b/tests/cases/fourslash/renameDestructuringAssignmentNestedInArrayLiteral.ts @@ -1,15 +1,15 @@ /// ////interface I { -//// [|property1|]: number; +//// [|[|{| "declarationRangeIndex": 0 |}property1|]: number;|] //// property2: string; ////} -////var elems: I[], p1: number, [|property1|]: number; -////[{ [|property1|]: p1 }] = elems; -////[{ [|property1|] }] = elems; +////var elems: I[], p1: number, [|[|{| "declarationRangeIndex": 2 |}property1|]: number|]; +////[|[{ [|{| "declarationRangeIndex": 4 |}property1|]: p1 }] = elems;|] +////[|[{ [|{| "declarationRangeIndex": 6 |}property1|] }] = elems;|] const ranges = test.ranges(); -const [r0, r1, r2, r3] = ranges; +const [r0Def, r0, r1Def, r1, r2Def, r2, r3Def, r3] = ranges; verify.renameLocations([r0, r2], [r0, r2, { range: r3, suffixText: ": property1" }]); verify.renameLocations([r1, r3], [r1, { range: r3, prefixText: "property1: " }]); diff --git a/tests/cases/fourslash/renameDestructuringAssignmentNestedInFor.ts b/tests/cases/fourslash/renameDestructuringAssignmentNestedInFor.ts index e83487d15d..5a2f469994 100644 --- a/tests/cases/fourslash/renameDestructuringAssignmentNestedInFor.ts +++ b/tests/cases/fourslash/renameDestructuringAssignmentNestedInFor.ts @@ -3,20 +3,20 @@ ////interface MultiRobot { //// name: string; //// skills: { -//// [|primary|]: string; +//// [|[|{| "declarationRangeIndex": 0 |}primary|]: string;|] //// secondary: string; //// }; ////} -////let multiRobot: MultiRobot, [|primary|]: string, secondary: string, primaryA: string, secondaryA: string, i: number; -////for ({ skills: { [|primary|]: primaryA, secondary: secondaryA } } = multiRobot, i = 0; i < 1; i++) { +////let multiRobot: MultiRobot, [|[|{| "declarationRangeIndex": 2 |}primary|]: string|], secondary: string, primaryA: string, secondaryA: string, i: number; +////for ([|{ skills: { [|{| "declarationRangeIndex": 4 |}primary|]: primaryA, secondary: secondaryA } } = multiRobot|], i = 0; i < 1; i++) { //// primaryA; ////} -////for ({ skills: { [|primary|], secondary } } = multiRobot, i = 0; i < 1; i++) { +////for ([|{ skills: { [|{| "declarationRangeIndex": 6 |}primary|], secondary } } = multiRobot|], i = 0; i < 1; i++) { //// [|primary|]; ////} verify.noErrors(); const ranges = test.ranges(); -const [r0, r1, r2, r3, r4] = ranges; +const [r0Def, r0, r1Def, r1, r2Def, r2, r3Def, r3, r4] = ranges; verify.renameLocations([r0, r2], [r0, r2, { range: r3, suffixText: ": primary" }]); verify.renameLocations([r1, r3, r4], [r1, { range: r3, prefixText: "primary: " }, r4]); diff --git a/tests/cases/fourslash/renameDestructuringAssignmentNestedInFor2.ts b/tests/cases/fourslash/renameDestructuringAssignmentNestedInFor2.ts index e83487d15d..5a2f469994 100644 --- a/tests/cases/fourslash/renameDestructuringAssignmentNestedInFor2.ts +++ b/tests/cases/fourslash/renameDestructuringAssignmentNestedInFor2.ts @@ -3,20 +3,20 @@ ////interface MultiRobot { //// name: string; //// skills: { -//// [|primary|]: string; +//// [|[|{| "declarationRangeIndex": 0 |}primary|]: string;|] //// secondary: string; //// }; ////} -////let multiRobot: MultiRobot, [|primary|]: string, secondary: string, primaryA: string, secondaryA: string, i: number; -////for ({ skills: { [|primary|]: primaryA, secondary: secondaryA } } = multiRobot, i = 0; i < 1; i++) { +////let multiRobot: MultiRobot, [|[|{| "declarationRangeIndex": 2 |}primary|]: string|], secondary: string, primaryA: string, secondaryA: string, i: number; +////for ([|{ skills: { [|{| "declarationRangeIndex": 4 |}primary|]: primaryA, secondary: secondaryA } } = multiRobot|], i = 0; i < 1; i++) { //// primaryA; ////} -////for ({ skills: { [|primary|], secondary } } = multiRobot, i = 0; i < 1; i++) { +////for ([|{ skills: { [|{| "declarationRangeIndex": 6 |}primary|], secondary } } = multiRobot|], i = 0; i < 1; i++) { //// [|primary|]; ////} verify.noErrors(); const ranges = test.ranges(); -const [r0, r1, r2, r3, r4] = ranges; +const [r0Def, r0, r1Def, r1, r2Def, r2, r3Def, r3, r4] = ranges; verify.renameLocations([r0, r2], [r0, r2, { range: r3, suffixText: ": primary" }]); verify.renameLocations([r1, r3, r4], [r1, { range: r3, prefixText: "primary: " }, r4]); diff --git a/tests/cases/fourslash/renameDestructuringAssignmentNestedInForOf.ts b/tests/cases/fourslash/renameDestructuringAssignmentNestedInForOf.ts index 6a9eb6235b..7a7786d5a9 100644 --- a/tests/cases/fourslash/renameDestructuringAssignmentNestedInForOf.ts +++ b/tests/cases/fourslash/renameDestructuringAssignmentNestedInForOf.ts @@ -3,20 +3,20 @@ ////interface MultiRobot { //// name: string; //// skills: { -//// [|primary|]: string; +//// [|[|{| "declarationRangeIndex": 0 |}primary|]: string;|] //// secondary: string; //// }; ////} ////let multiRobots: MultiRobot[]; -////let [|primary|]: string, secondary: string, primaryA: string, secondaryA: string; -////for ({ skills: { [|primary|]: primaryA, secondary: secondaryA } } of multiRobots) { +////let [|[|{| "declarationRangeIndex": 2 |}primary|]: string|], secondary: string, primaryA: string, secondaryA: string; +////for ([|{ skills: { [|{| "declarationRangeIndex": 4 |}primary|]: primaryA, secondary: secondaryA } } of multiRobots|]) { //// primaryA; ////} -////for ({ skills: { [|primary|], secondary } } of multiRobots) { +////for ([|{ skills: { [|{| "declarationRangeIndex": 6 |}primary|], secondary } } of multiRobots|]) { //// [|primary|]; ////} verify.noErrors(); -const [r0, r1, r2, r3, r4] = test.ranges(); +const [r0Def, r0, r1Def, r1, r2Def, r2, r3Def, r3, r4] = test.ranges(); verify.renameLocations([r0, r2], [r0, r2, { range: r3, suffixText: ": primary" }]); verify.renameLocations([r1, r3, r4], [r1, { range: r3, prefixText: "primary: " }, r4]) diff --git a/tests/cases/fourslash/renameDestructuringAssignmentNestedInForOf2.ts b/tests/cases/fourslash/renameDestructuringAssignmentNestedInForOf2.ts index 7c5c288ea7..897c0ba871 100644 --- a/tests/cases/fourslash/renameDestructuringAssignmentNestedInForOf2.ts +++ b/tests/cases/fourslash/renameDestructuringAssignmentNestedInForOf2.ts @@ -3,19 +3,19 @@ ////interface MultiRobot { //// name: string; //// skills: { -//// [|primary|]: string; +//// [|[|{| "declarationRangeIndex": 0 |}primary|]: string;|] //// secondary: string; //// }; ////} -////let multiRobots: MultiRobot[], [|primary|]: string; -////for ({ skills: { [|primary|]: primaryA, secondary: secondaryA } } of multiRobots) { +////let multiRobots: MultiRobot[], [|[|{| "declarationRangeIndex": 2 |}primary|]: string|]; +////for ([|{ skills: { [|{| "declarationRangeIndex": 4 |}primary|]: primaryA, secondary: secondaryA } } of multiRobots|]) { //// console.log(primaryA); ////} -////for ({ skills: { [|primary|], secondary } } of multiRobots) { +////for ([|{ skills: { [|{| "declarationRangeIndex": 6 |}primary|], secondary } } of multiRobots|]) { //// console.log([|primary|]); ////} const ranges = test.ranges(); -const [r0, r1, r2, r3, r4] = ranges; +const [r0Def, r0, r1Def, r1,r2Def, r2, r3Def, r3, r4] = ranges; verify.renameLocations([r0, r2], [r0, r2, { range: r3, suffixText: ": primary" }]); verify.renameLocations([r1, r3, r4], [r1, { range: r3, prefixText: "primary: " }, r4]);