diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/BuilderInferenceSession.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/BuilderInferenceSession.kt index b34a8f1d6aa..adc088fe90c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/BuilderInferenceSession.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/inference/BuilderInferenceSession.kt @@ -94,7 +94,7 @@ class BuilderInferenceSession( return subResolvedAtoms?.any { it.hasPostponed() } == true } - if (!candidate.isSuitableForBuilderInference()) { + if (!candidate.resolvedCall.isSuitableForBuilderInference()) { return true } @@ -108,13 +108,18 @@ class BuilderInferenceSession( } || candidate.getSubResolvedAtoms().any { it.hasPostponed() } } - private fun KotlinResolutionCandidate.isSuitableForBuilderInference(): Boolean { - val extensionReceiver = resolvedCall.extensionReceiverArgument - val dispatchReceiver = resolvedCall.dispatchReceiverArgument + private fun ResolvedCallAtom.isSuitableForBuilderInference(): Boolean { + val extensionReceiver = extensionReceiverArgument + val dispatchReceiver = dispatchReceiverArgument + val resolvedAtoms = subResolvedAtoms + return when { + resolvedAtoms != null && resolvedAtoms.map { it.atom }.filterIsInstance().any { + it.callResult.resultCallAtom.isSuitableForBuilderInference() + } -> true extensionReceiver == null && dispatchReceiver == null -> false dispatchReceiver?.receiver?.stableType?.containsStubType() == true -> true - extensionReceiver?.receiver?.stableType?.containsStubType() == true -> resolvedCall.candidateDescriptor.hasBuilderInferenceAnnotation() + extensionReceiver?.receiver?.stableType?.containsStubType() == true -> candidateDescriptor.hasBuilderInferenceAnnotation() else -> false } } diff --git a/compiler/testData/codegen/box/inference/builderInference/kt42139.kt b/compiler/testData/codegen/box/inference/builderInference/kt42139.kt index b3a90d36533..dc55f6a5600 100644 --- a/compiler/testData/codegen/box/inference/builderInference/kt42139.kt +++ b/compiler/testData/codegen/box/inference/builderInference/kt42139.kt @@ -11,12 +11,12 @@ fun f1(): Sequence> = sequence { } fun f2(): Sequence> = sequence { - select(yield(myEmptyList()), yield(myEmptyList())) + select(yield(myEmptyList()), yield(myEmptyList())) } fun f3(): Sequence> = sequence { - if (true) yield(myEmptyList()) // [NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER] Not enough information to infer type variable T - else yield(myEmptyList()) // [NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER] Not enough information to infer type variable T + if (true) yield(myEmptyList()) // [NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER] Not enough information to infer type variable T + else yield(myEmptyList()) // [NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER] Not enough information to infer type variable T } fun box(): String {