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");