diff --git a/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElse.kt b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElse.kt new file mode 100644 index 00000000000..f30e38fe6c5 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElse.kt @@ -0,0 +1,5 @@ +fun foo(list: List, b: Boolean) { + val v = if (b) list else emp +} + +// ELEMENT: emptyList diff --git a/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElse.kt.after b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElse.kt.after new file mode 100644 index 00000000000..da857b07a17 --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElse.kt.after @@ -0,0 +1,5 @@ +fun foo(list: List, b: Boolean) { + val v = if (b) list else emptyList() +} + +// ELEMENT: emptyList diff --git a/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElvis.kt b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElvis.kt new file mode 100644 index 00000000000..0c9a22af8dc --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElvis.kt @@ -0,0 +1,5 @@ +fun foo(list: List?) { + val v = list ?: emp +} + +// ELEMENT: emptyList diff --git a/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElvis.kt.after b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElvis.kt.after new file mode 100644 index 00000000000..8eb2794e82e --- /dev/null +++ b/idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElvis.kt.after @@ -0,0 +1,5 @@ +fun foo(list: List?) { + val v = list ?: emptyList() +} + +// ELEMENT: emptyList diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java index db3975de936..c5c5a10ec40 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/handlers/BasicCompletionHandlerTestGenerated.java @@ -687,6 +687,18 @@ public class BasicCompletionHandlerTestGenerated extends AbstractBasicCompletion @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public static class TypeArgsForCall extends AbstractBasicCompletionHandlerTest { + @TestMetadata("AfterElse.kt") + public void testAfterElse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElse.kt"); + doTest(fileName); + } + + @TestMetadata("AfterElvis.kt") + public void testAfterElvis() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/handlers/basic/typeArgsForCall/AfterElvis.kt"); + doTest(fileName); + } + public void testAllFilesPresentInTypeArgsForCall() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/handlers/basic/typeArgsForCall"), Pattern.compile("^(.+)\\.kt$"), true); } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ExpectedInfos.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ExpectedInfos.kt index d9083c9d5eb..bf4d0c2db34 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ExpectedInfos.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ExpectedInfos.kt @@ -422,23 +422,29 @@ class ExpectedInfos( private fun calculateForIf(expressionWithType: KtExpression): Collection? { val ifExpression = (expressionWithType.parent as? KtContainerNode)?.parent as? KtIfExpression ?: return null - return when (expressionWithType) { - ifExpression.condition -> listOf(ExpectedInfo(resolutionFacade.moduleDescriptor.builtIns.booleanType, null, Tail.RPARENTH, additionalData = IfConditionAdditionalData)) + when (expressionWithType) { + ifExpression.condition -> return listOf(ExpectedInfo(resolutionFacade.moduleDescriptor.builtIns.booleanType, null, Tail.RPARENTH, additionalData = IfConditionAdditionalData)) - ifExpression.then -> calculate(ifExpression).map { ExpectedInfo(it.filter, it.expectedName, Tail.ELSE) } + ifExpression.then -> return calculate(ifExpression).map { ExpectedInfo(it.filter, it.expectedName, Tail.ELSE) } ifExpression.`else` -> { - val ifExpectedInfo = calculate(ifExpression) + val ifExpectedInfos = calculate(ifExpression) val thenType = ifExpression.then?.let { bindingContext.getType(it) } - val filteredInfo = if (thenType != null && !thenType.isError) - ifExpectedInfo.filter { it.matchingSubstitutor(thenType) != null } - else - ifExpectedInfo - return filteredInfo.copyWithNoAdditionalData() - } - else -> return null + if (ifExpectedInfos.any { it.fuzzyType != null }) { + val filteredInfo = if (thenType != null && !thenType.isError) + ifExpectedInfos.filter { it.matchingSubstitutor(thenType) != null } + else + ifExpectedInfos + return filteredInfo.copyWithNoAdditionalData() + } + else if (thenType != null) { + return listOf(ExpectedInfo(thenType, null, null)) + } + } } + + return null } private fun calculateForElvis(expressionWithType: KtExpression): Collection? { @@ -450,7 +456,7 @@ class ExpectedInfos( val leftType = bindingContext.getType(leftExpression) val leftTypeNotNullable = leftType?.makeNotNullable() val expectedInfos = calculate(binaryExpression) - if (expectedInfos.isNotEmpty()) { + if (expectedInfos.any { it.fuzzyType != null }) { val filteredInfo = if (leftTypeNotNullable != null) expectedInfos.filter { it.matchingSubstitutor(leftTypeNotNullable) != null } else