From 40799a0a43146c140999445ccf1e13392cb2438e Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 13 Mar 2015 14:07:50 +0300 Subject: [PATCH] PSI Unifier: Unify references which correspond to the same declaration #KT-5996 Fixed --- .../idea/util/psi/patternMatching/JetPsiUnifier.kt | 1 + .../introduceVariable/callUnderSmartCast.kt | 11 +++++++++++ .../introduceVariable/callUnderSmartCast.kt.after | 12 ++++++++++++ .../expressions/calls/callUnderSmartCast.kt | 11 +++++++++++ .../expressions/calls/callUnderSmartCast.kt.match | 3 +++ .../introduce/JetExtractionTestGenerated.java | 6 ++++++ .../patternMatching/JetPsiUnifierTestGenerated.java | 6 ++++++ 7 files changed, 50 insertions(+) create mode 100644 idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt create mode 100644 idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt.after create mode 100644 idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt create mode 100644 idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt.match diff --git a/idea/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/JetPsiUnifier.kt b/idea/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/JetPsiUnifier.kt index 52387c642b8..d02323e73c5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/JetPsiUnifier.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/JetPsiUnifier.kt @@ -160,6 +160,7 @@ public class JetPsiUnifier( val decl1 = DescriptorToSourceUtils.descriptorToDeclaration(d1) as? JetDeclaration val decl2 = DescriptorToSourceUtils.descriptorToDeclaration(d2) as? JetDeclaration if (decl1 == null || decl2 == null) return false + if (decl1 == decl2) return true if ((decl1 in originalTarget && decl2 in originalPattern) || (decl2 in originalTarget && decl1 in originalPattern)) { return matchDeclarations(decl1, decl2, d1, d2) == MATCHED diff --git a/idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt b/idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt new file mode 100644 index 00000000000..6a823d232c2 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt @@ -0,0 +1,11 @@ +trait T { + fun foo(): Int +} + +trait U: T + +fun test(t: T): Int { + return if (t is U) + t.foo() + 1 + else t.foo() +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt.after b/idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt.after new file mode 100644 index 00000000000..7cd75a4be79 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt.after @@ -0,0 +1,12 @@ +trait T { + fun foo(): Int +} + +trait U: T + +fun test(t: T): Int { + val i = t.foo() + return if (t is U) + i + 1 + else i +} \ No newline at end of file diff --git a/idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt b/idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt new file mode 100644 index 00000000000..6a823d232c2 --- /dev/null +++ b/idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt @@ -0,0 +1,11 @@ +trait T { + fun foo(): Int +} + +trait U: T + +fun test(t: T): Int { + return if (t is U) + t.foo() + 1 + else t.foo() +} \ No newline at end of file diff --git a/idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt.match b/idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt.match new file mode 100644 index 00000000000..89d66d9f0ce --- /dev/null +++ b/idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt.match @@ -0,0 +1,3 @@ +t.foo() + +t.foo() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java index 253998bae6c..eea40d7d316 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -49,6 +49,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doIntroduceVariableTest(fileName); } + @TestMetadata("callUnderSmartCast.kt") + public void testCallUnderSmartCast() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/callUnderSmartCast.kt"); + doIntroduceVariableTest(fileName); + } + @TestMetadata("ClassBody.kt") public void testClassBody() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/ClassBody.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/psi/patternMatching/JetPsiUnifierTestGenerated.java b/idea/tests/org/jetbrains/kotlin/psi/patternMatching/JetPsiUnifierTestGenerated.java index 0b8ebf6681e..a39329c0d34 100644 --- a/idea/tests/org/jetbrains/kotlin/psi/patternMatching/JetPsiUnifierTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/psi/patternMatching/JetPsiUnifierTestGenerated.java @@ -425,6 +425,12 @@ public class JetPsiUnifierTestGenerated extends AbstractJetPsiUnifierTest { doTest(fileName); } + @TestMetadata("callUnderSmartCast.kt") + public void testCallUnderSmartCast() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/unifier/equivalence/expressions/calls/callUnderSmartCast.kt"); + doTest(fileName); + } + @TestMetadata("externalArgumentsRuntime.kt") public void testExternalArgumentsRuntime() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/unifier/equivalence/expressions/calls/externalArgumentsRuntime.kt");