From b18b888161c6731517bb25dc72b576fe211826af Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 15 Oct 2014 14:08:45 +0400 Subject: [PATCH] PSI Pattern Matching: Fix matching of !! #KT-6021 Fixed --- .../util/psi/patternMatching/JetPsiUnifier.kt | 2 ++ .../duplicates/notNullAssertion.kt | 12 ++++++++++++ .../duplicates/notNullAssertion.kt.after | 16 ++++++++++++++++ .../introduceVariable/notNullAssertion.kt | 8 ++++++++ .../introduceVariable/notNullAssertion.kt.after | 9 +++++++++ .../JetExtractionTestGenerated.java | 12 ++++++++++++ 6 files changed, 59 insertions(+) create mode 100644 idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt create mode 100644 idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt.after create mode 100644 idea/testData/refactoring/introduceVariable/notNullAssertion.kt create mode 100644 idea/testData/refactoring/introduceVariable/notNullAssertion.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/util/psi/patternMatching/JetPsiUnifier.kt b/idea/src/org/jetbrains/jet/plugin/util/psi/patternMatching/JetPsiUnifier.kt index 92153dfa69d..81f84c029da 100644 --- a/idea/src/org/jetbrains/jet/plugin/util/psi/patternMatching/JetPsiUnifier.kt +++ b/idea/src/org/jetbrains/jet/plugin/util/psi/patternMatching/JetPsiUnifier.kt @@ -89,6 +89,7 @@ import org.jetbrains.jet.lang.psi.JetDelegatorToSuperClass import org.jetbrains.jet.lang.psi.JetDelegationSpecifier import org.jetbrains.jet.plugin.refactoring.getContextForContainingDeclarationBody import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers +import org.jetbrains.jet.lang.psi.JetOperationReferenceExpression public trait UnificationResult { public enum class Status { @@ -366,6 +367,7 @@ public class JetPsiUnifier( private fun JetElement.shouldIgnoreResolvedCall(): Boolean { return when { this is JetConstantExpression -> true + this is JetOperationReferenceExpression -> getReferencedNameElementType() == JetTokens.EXCLEXCL this is JetIfExpression -> true this is JetUnaryExpression -> when (getOperationReference().getReferencedNameElementType()) { JetTokens.EXCLEXCL, JetTokens.PLUSPLUS, JetTokens.MINUSMINUS -> true diff --git a/idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt b/idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt new file mode 100644 index 00000000000..5e4ff5f6782 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt @@ -0,0 +1,12 @@ +// PARAM_TYPES: kotlin.String?, kotlin.Comparable?, kotlin.CharSequence?, kotlin.Any? +// PARAM_DESCRIPTOR: val s: kotlin.String? defined in foo + +// SIBLING: +fun foo(): Int { + val s: String? = "" + return if (true) { + s!!.length + } else { + s!!.length + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt.after b/idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt.after new file mode 100644 index 00000000000..791261b7924 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt.after @@ -0,0 +1,16 @@ +// PARAM_TYPES: kotlin.String?, kotlin.Comparable?, kotlin.CharSequence?, kotlin.Any? +// PARAM_DESCRIPTOR: val s: kotlin.String? defined in foo + +// SIBLING: +fun foo(): Int { + val s: String? = "" + return if (true) { + i(s) + } else { + i(s) + } +} + +private fun i(s: String?): Int { + return s!!.length +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/notNullAssertion.kt b/idea/testData/refactoring/introduceVariable/notNullAssertion.kt new file mode 100644 index 00000000000..37e32928711 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/notNullAssertion.kt @@ -0,0 +1,8 @@ +fun foo(): Int { + val s: String? = "" + return if (true) { + s!!.length + } else { + s!!.length + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/notNullAssertion.kt.after b/idea/testData/refactoring/introduceVariable/notNullAssertion.kt.after new file mode 100644 index 00000000000..fb04a0de2da --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/notNullAssertion.kt.after @@ -0,0 +1,9 @@ +fun foo(): Int { + val s: String? = "" + val i = s!!.length + return if (true) { + i + } else { + i + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index 0d9eb5a4a82..0b7f7d67b5a 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -173,6 +173,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doIntroduceVariableTest(fileName); } + @TestMetadata("notNullAssertion.kt") + public void testNotNullAssertion() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/notNullAssertion.kt"); + doIntroduceVariableTest(fileName); + } + @TestMetadata("OccurrencesInStringTemplate.kt") public void testOccurrencesInStringTemplate() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/OccurrencesInStringTemplate.kt"); @@ -1091,6 +1097,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest(fileName); } + @TestMetadata("notNullAssertion.kt") + public void testNotNullAssertion() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/duplicates/notNullAssertion.kt"); + doExtractFunctionTest(fileName); + } + @TestMetadata("outputValueAndUnitMatching.kt") public void testOutputValueAndUnitMatching() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/duplicates/outputValueAndUnitMatching.kt");