Delay check for possibly deferred return type for reference candidate
This issue appeared after recently added new overload for flatMapTo. Before that, we picked candidate returning List<T> and completed inference, now we also check one more flatMapTo, which is here is incorrect and as a result we go into outer scope. Outer scope contains one property with deferred type, which introduced error about "typechecker has run into recursive problem" even it isn't applicable by receiver. So, the fix is to check receiver first and only then check return type of a candidate. #KT-39470 Fixed
This commit is contained in:
+5
@@ -1835,6 +1835,11 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/overloadByLambdaReturnType_enabled_no_annotation.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("referenceWithTheSameNameAsContainingProperty.kt")
|
||||
public void testReferenceWithTheSameNameAsContainingProperty() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/referenceWithTheSameNameAsContainingProperty.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("resolutionInOldInference.kt")
|
||||
public void testResolutionInOldInference() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/resolutionInOldInference.kt");
|
||||
|
||||
+5
-8
@@ -24,10 +24,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.DetailedReceiver
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastInfo
|
||||
import org.jetbrains.kotlin.types.ErrorUtils
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.UnwrappedType
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import org.jetbrains.kotlin.types.checker.captureFromExpression
|
||||
import org.jetbrains.kotlin.types.expressions.CoercionStrategy
|
||||
import org.jetbrains.kotlin.types.typeUtil.immediateSupertypes
|
||||
@@ -147,15 +144,15 @@ fun ConstraintSystemOperation.checkCallableReference(
|
||||
|
||||
val toFreshSubstitutor = createToFreshVariableSubstitutorAndAddInitialConstraints(candidateDescriptor, this)
|
||||
|
||||
if (expectedType != null) {
|
||||
addSubtypeConstraint(toFreshSubstitutor.safeSubstitute(reflectionCandidateType), expectedType, position)
|
||||
}
|
||||
|
||||
if (!ErrorUtils.isError(candidateDescriptor)) {
|
||||
addReceiverConstraint(toFreshSubstitutor, dispatchReceiver, candidateDescriptor.dispatchReceiverParameter, position)
|
||||
addReceiverConstraint(toFreshSubstitutor, extensionReceiver, candidateDescriptor.extensionReceiverParameter, position)
|
||||
}
|
||||
|
||||
if (expectedType != null && !hasContradiction) {
|
||||
addSubtypeConstraint(toFreshSubstitutor.safeSubstitute(reflectionCandidateType), expectedType, position)
|
||||
}
|
||||
|
||||
val invisibleMember = Visibilities.findInvisibleMember(
|
||||
dispatchReceiver?.asReceiverValueForVisibilityChecks,
|
||||
candidateDescriptor, ownerDescriptor
|
||||
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
interface Foo
|
||||
|
||||
// isolated example when we have two canidates where one of them has DeferredType
|
||||
|
||||
fun Foo.bar(): Int = 0
|
||||
|
||||
fun call(f: Any) {}
|
||||
|
||||
val String.bar
|
||||
get() = call(Foo::bar)
|
||||
|
||||
// test from KT-39470
|
||||
|
||||
interface Bar {
|
||||
val serializationWhitelists: List<Foo>
|
||||
}
|
||||
|
||||
val List<Bar>.serializationWhitelists
|
||||
get() = flatMapTo(LinkedHashSet(), Bar::serializationWhitelists)
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package
|
||||
|
||||
public val kotlin.String.bar: kotlin.Unit
|
||||
public val kotlin.collections.List<Bar>.serializationWhitelists: kotlin.collections.LinkedHashSet<Foo> /* = java.util.LinkedHashSet<Foo> */
|
||||
public fun call(/*0*/ f: kotlin.Any): kotlin.Unit
|
||||
public fun Foo.bar(): kotlin.Int
|
||||
|
||||
public interface Bar {
|
||||
public abstract val serializationWhitelists: kotlin.collections.List<Foo>
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface Foo {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
+5
@@ -2850,6 +2850,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/overloadByLambdaReturnType_enabled_no_annotation.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("referenceWithTheSameNameAsContainingProperty.kt")
|
||||
public void testReferenceWithTheSameNameAsContainingProperty() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/referenceWithTheSameNameAsContainingProperty.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("resolutionInOldInference.kt")
|
||||
public void testResolutionInOldInference() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/resolutionInOldInference.kt");
|
||||
|
||||
compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java
Generated
+5
@@ -2850,6 +2850,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/overloadByLambdaReturnType_enabled_no_annotation.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("referenceWithTheSameNameAsContainingProperty.kt")
|
||||
public void testReferenceWithTheSameNameAsContainingProperty() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/referenceWithTheSameNameAsContainingProperty.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("resolutionInOldInference.kt")
|
||||
public void testResolutionInOldInference() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/testsWithStdLib/factoryPattern/resolutionInOldInference.kt");
|
||||
|
||||
Reference in New Issue
Block a user