提交 93e9d3e5 编写于 作者: M Mikhail Zarechenskiy

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
上级 21f7cd5d
......@@ -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");
......
......@@ -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
......
// 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)
\ No newline at end of file
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
}
......@@ -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");
......
......@@ -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");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册