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);
+ }
}
}