From d58112a32aadc41c6e88c13deb62e7c8b2a2ce26 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 16 Jun 2015 21:13:51 +0300 Subject: [PATCH] Extract Function: Use intersection type to compute candidate types for parameters #KT-8103 Fixed --- .../extractionEngine/extractableAnalysisUtil.kt | 3 ++- .../parameters/candidateTypes/multipleTypes.kt | 12 ++++++++++++ .../candidateTypes/multipleTypes.kt.after | 16 ++++++++++++++++ .../introduce/JetExtractionTestGenerated.java | 6 ++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt index 1dc88e35eb6..547576db54b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt @@ -75,6 +75,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.receivers.ThisReceiver import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.checker.JetTypeChecker import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.DFS.CollectingNodeHandler import org.jetbrains.kotlin.utils.DFS.Neighbors @@ -512,7 +513,7 @@ private class MutableParameter( private val defaultType: JetType by Delegates.lazy { writable = false - CommonSupertypes.commonSupertype(defaultTypes) + TypeUtils.intersect(JetTypeChecker.DEFAULT, defaultTypes) } private val parameterTypeCandidates: List by Delegates.lazy { diff --git a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt new file mode 100644 index 00000000000..63cf0eb9d3b --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt @@ -0,0 +1,12 @@ +// PARAM_TYPES: kotlin.String +// PARAM_DESCRIPTOR: value-parameter val p: kotlin.Any defined in foo + +fun foo(p: Any) { + if (p is String) { + f(p) + g(p) + } +} + +fun f(s: String){} +fun g(o: Any){} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt.after b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt.after new file mode 100644 index 00000000000..d41942269f0 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt.after @@ -0,0 +1,16 @@ +// PARAM_TYPES: kotlin.String +// PARAM_DESCRIPTOR: value-parameter val p: kotlin.Any defined in foo + +fun foo(p: Any) { + if (p is String) { + __dummyTestFun__(p) + } +} + +private fun __dummyTestFun__(p: String) { + f(p) + g(p) +} + +fun f(s: String){} +fun g(o: Any){} \ 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 40a98b910cd..88ec25df485 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -1622,6 +1622,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest(fileName); } + @TestMetadata("multipleTypes.kt") + public void testMultipleTypes() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/candidateTypes/multipleTypes.kt"); + doExtractFunctionTest(fileName); + } + @TestMetadata("nonNullableTypes.kt") public void testNonNullableTypes() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/candidateTypes/nonNullableTypes.kt");