From 1d9bafe196b8654bce3da87ae9a0e7af16276dd0 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 12 Jan 2016 17:18:53 +0300 Subject: [PATCH] PSI Unifier: Fix matching of `this`-expressions #KT-8293 Fixed --- .../idea/util/psi/patternMatching/KotlinPsiUnifier.kt | 9 +++++++++ .../refactoring/introduceVariable/thisAsCallee.kt | 6 ++++++ .../refactoring/introduceVariable/thisAsCallee.kt.after | 7 +++++++ .../unifier/equivalence/expressions/this/thisAsCallee.kt | 8 ++++++++ .../equivalence/expressions/this/thisAsCallee.kt.match | 9 +++++++++ .../refactoring/introduce/ExtractionTestGenerated.java | 6 ++++++ .../psi/patternMatching/PsiUnifierTestGenerated.java | 6 ++++++ 7 files changed, 51 insertions(+) create mode 100644 idea/testData/refactoring/introduceVariable/thisAsCallee.kt create mode 100644 idea/testData/refactoring/introduceVariable/thisAsCallee.kt.after create mode 100644 idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt create mode 100644 idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt.match diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt index a0ec2fc5290..a602f9c914f 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/KotlinPsiUnifier.kt @@ -365,6 +365,7 @@ class KotlinPsiUnifier( else -> false } this is KtBinaryExpression -> operationReference.getReferencedNameElementType() == KtTokens.ELVIS + this is KtThisExpression -> true else -> false } } @@ -423,6 +424,12 @@ class KotlinPsiUnifier( return matchDescriptors(d1, d2) } + private fun matchThisExpressions(e1: KtThisExpression, e2: KtThisExpression): Boolean { + val d1 = e1.bindingContext[BindingContext.REFERENCE_TARGET, e1.instanceReference] + val d2 = e2.bindingContext[BindingContext.REFERENCE_TARGET, e2.instanceReference] + return matchDescriptors(d1, d2) + } + private fun matchDestructuringDeclarations(e1: KtDestructuringDeclaration, e2: KtDestructuringDeclaration): Boolean { val entries1 = e1.entries val entries2 = e2.entries @@ -694,6 +701,8 @@ class KotlinPsiUnifier( e1 is KtCallableReferenceExpression && e2 is KtCallableReferenceExpression -> if (matchCallableReferences(e1, e2)) MATCHED else UNMATCHED + e1 is KtThisExpression && e2 is KtThisExpression -> if (matchThisExpressions(e1, e2)) MATCHED else UNMATCHED + else -> matchCalls(e1, e2) } diff --git a/idea/testData/refactoring/introduceVariable/thisAsCallee.kt b/idea/testData/refactoring/introduceVariable/thisAsCallee.kt new file mode 100644 index 00000000000..2269f2e55d2 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/thisAsCallee.kt @@ -0,0 +1,6 @@ +fun (String.() -> String).foo(x : String) { + x.this() + x.this@foo() + val t = this + val tt = this@foo +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/thisAsCallee.kt.after b/idea/testData/refactoring/introduceVariable/thisAsCallee.kt.after new file mode 100644 index 00000000000..1cc8d17a0e4 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/thisAsCallee.kt.after @@ -0,0 +1,7 @@ +fun (String.() -> String).foo(x : String) { + val function = this + x.function() + x.function() + val t = function + val tt = function +} \ No newline at end of file diff --git a/idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt b/idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt new file mode 100644 index 00000000000..d9c934edf5a --- /dev/null +++ b/idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt @@ -0,0 +1,8 @@ +// DISABLE-ERRORS +fun (String.() -> String).foo(x : String) { + x.this() + x.this() + x.this(1) + x.this@foo() + x.this@foo(2) +} \ No newline at end of file diff --git a/idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt.match b/idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt.match new file mode 100644 index 00000000000..e3c7f9fc70a --- /dev/null +++ b/idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt.match @@ -0,0 +1,9 @@ +this + +this + +this + +this@foo + +this@foo \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index efe978b0ee9..5b3b1270732 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -379,6 +379,12 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { doIntroduceVariableTest(fileName); } + @TestMetadata("thisAsCallee.kt") + public void testThisAsCallee() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/thisAsCallee.kt"); + doIntroduceVariableTest(fileName); + } + @TestMetadata("ThisReference.kt") public void testThisReference() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/ThisReference.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/psi/patternMatching/PsiUnifierTestGenerated.java b/idea/tests/org/jetbrains/kotlin/psi/patternMatching/PsiUnifierTestGenerated.java index 806ea6a3d46..4e01efa4008 100644 --- a/idea/tests/org/jetbrains/kotlin/psi/patternMatching/PsiUnifierTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/psi/patternMatching/PsiUnifierTestGenerated.java @@ -715,6 +715,12 @@ public class PsiUnifierTestGenerated extends AbstractPsiUnifierTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/unifier/equivalence/expressions/this/simpleThis2Runtime.kt"); doTest(fileName); } + + @TestMetadata("thisAsCallee.kt") + public void testThisAsCallee() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/unifier/equivalence/expressions/this/thisAsCallee.kt"); + doTest(fileName); + } } }