NI: don't try to infer visible lambda parameters, if there is single one – extension parameter

^KT-37038 Fixed
This commit is contained in:
Victor Petukhov
2020-03-02 01:21:23 +03:00
parent ed83e3ccef
commit 51749b9747
8 changed files with 54 additions and 9 deletions
@@ -9946,6 +9946,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
runTest("compiler/testData/diagnostics/tests/inference/expectedTypeWithGenerics.kt");
}
@TestMetadata("extensionLambdasAndArrow.kt")
public void testExtensionLambdasAndArrow() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/extensionLambdasAndArrow.kt");
}
@TestMetadata("findViewById.kt")
public void testFindViewById() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/findViewById.kt");
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.resolve.calls.inference.components
import org.jetbrains.kotlin.builtins.isBuiltinFunctionalType
import org.jetbrains.kotlin.builtins.isBuiltinFunctionalTypeOrSubtype
import org.jetbrains.kotlin.builtins.isExtensionFunctionType
import org.jetbrains.kotlin.resolve.calls.components.transformToResolvedLambda
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
import org.jetbrains.kotlin.resolve.calls.inference.model.*
@@ -172,7 +173,7 @@ class KotlinConstraintSystemCompleter(
val atomToAnalyze = when (postponedAtom) {
is PostponedCallableReferenceAtom -> postponedAtom.preparePostponedAtomWithTypeVariableAsExpectedType(
c, csBuilder, expectedTypeVariable,
condition = { true },
parameterTypes = null,
isSuitable = KotlinType::isBuiltinFunctionalTypeOrSubtype,
typeVariableCreator = { TypeVariableForCallableReferenceReturnType(builtIns, "_Q") },
newAtomCreator = { returnVariable, expectedType ->
@@ -183,7 +184,7 @@ class KotlinConstraintSystemCompleter(
)
is LambdaWithTypeVariableAsExpectedTypeAtom -> postponedAtom.preparePostponedAtomWithTypeVariableAsExpectedType(
c, csBuilder, expectedTypeVariable,
condition = { it.atom.parametersTypes?.all { type -> type != null } != true },
parameterTypes = postponedAtom.atom.parametersTypes,
isSuitable = KotlinType::isBuiltinFunctionalType,
typeVariableCreator = { TypeVariableForLambdaReturnType(postponedAtom.atom, builtIns, "_R") },
newAtomCreator = { returnVariable, expectedType ->
@@ -200,17 +201,19 @@ class KotlinConstraintSystemCompleter(
c: Context,
csBuilder: ConstraintSystemBuilder,
variable: TypeConstructor,
condition: (T) -> Boolean,
parameterTypes: Array<out KotlinType?>?,
isSuitable: KotlinType.() -> Boolean,
typeVariableCreator: () -> V,
newAtomCreator: (V, SimpleType) -> PostponedResolvedAtom
): PostponedResolvedAtom {
if (!condition(this)) return this
val functionalType = resultTypeResolver.findResultType(
c,
c.notFixedTypeVariables.getValue(variable),
TypeVariableDirectionCalculator.ResolveDirection.TO_SUPERTYPE
) as KotlinType
val isExtensionWithoutParameters =
functionalType.isExtensionFunctionType && functionalType.arguments.size == 2 && parameterTypes?.isEmpty() == true
if (parameterTypes?.all { type -> type != null } == true && !isExtensionWithoutParameters) return this
if (!functionalType.isSuitable()) return this
val returnVariable = typeVariableCreator()
csBuilder.registerVariable(returnVariable)
@@ -0,0 +1,10 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_ANONYMOUS_PARAMETER
fun main() {
val x1: String.() -> String = if (true) {{ this }} else {{ this }}
val x2: String.() -> String = if (true) {{ -> this }} else {{ -> this }}
val x3: () -> String = if (true) {{ -> "this" }} else {{ -> "this" }}
val x4: String.() -> String = if (true) {{ str: String -> "this" }} else {{ str: String -> "this" }}
val x5: String.() -> String = if (true) {{ str -> "this" }} else {{ str -> "this" }}
val x6: String.() -> String = if (true) {{ str -> "this" }} else {{ "this" }}
}
@@ -0,0 +1,14 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_ANONYMOUS_PARAMETER
fun <T> select(vararg x: T) = x[0]
fun main() {
val x1: String.() -> String = if (true) {{ this }} else {{ this }}
val x2: String.() -> String = if (true) {{ -> this }} else {{ -> this }}
val x3: () -> String = if (true) {{ -> "this" }} else {{ -> "this" }}
val x4: String.() -> String = if (true) {{ str: String -> "this" }} else {{ str: String -> "this" }}
val x5: String.() -> String = if (true) <!TYPE_MISMATCH!>{{ <!CANNOT_INFER_PARAMETER_TYPE, EXPECTED_PARAMETERS_NUMBER_MISMATCH!>str<!> -> "this" }}<!> else <!TYPE_MISMATCH!>{{ <!CANNOT_INFER_PARAMETER_TYPE, EXPECTED_PARAMETERS_NUMBER_MISMATCH!>str<!> -> "this" }}<!>
val x6: String.() -> String = if (true) <!TYPE_MISMATCH!>{{ <!CANNOT_INFER_PARAMETER_TYPE, EXPECTED_PARAMETERS_NUMBER_MISMATCH!>str<!> -> "this" }}<!> else {{ "this" }}
val x7: String.() -> String = select({ -> this }, { -> this })
val x8: String.() -> String = select({ this }, { this })
}
@@ -0,0 +1,3 @@
package
public fun main(): kotlin.Unit
@@ -9953,6 +9953,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali
runTest("compiler/testData/diagnostics/tests/inference/expectedTypeWithGenerics.kt");
}
@TestMetadata("extensionLambdasAndArrow.kt")
public void testExtensionLambdasAndArrow() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/extensionLambdasAndArrow.kt");
}
@TestMetadata("findViewById.kt")
public void testFindViewById() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/findViewById.kt");
@@ -9948,6 +9948,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
runTest("compiler/testData/diagnostics/tests/inference/expectedTypeWithGenerics.kt");
}
@TestMetadata("extensionLambdasAndArrow.kt")
public void testExtensionLambdasAndArrow() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/extensionLambdasAndArrow.kt");
}
@TestMetadata("findViewById.kt")
public void testFindViewById() throws Exception {
runTest("compiler/testData/diagnostics/tests/inference/findViewById.kt");
@@ -12845,6 +12845,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class InlineClasses extends AbstractLightAnalysisModeTest {
@TestMetadata("anySuperCall.kt")
public void ignoreAnySuperCall() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/anySuperCall.kt");
}
@TestMetadata("fieldNameClash.kt")
public void ignoreFieldNameClash() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt");
@@ -12873,11 +12878,6 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/inlineClasses/annotatedMemberExtensionProperty.kt");
}
@TestMetadata("anySuperCall.kt")
public void testAnySuperCall() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/anySuperCall.kt");
}
@TestMetadata("boundCallableReferencePassedToInlineFunction.kt")
public void testBoundCallableReferencePassedToInlineFunction() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/boundCallableReferencePassedToInlineFunction.kt");