diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/BuilderInferenceAssignmentChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/BuilderInferenceAssignmentChecker.kt index 00fa1f36a62..49d8713e6de 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/BuilderInferenceAssignmentChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/BuilderInferenceAssignmentChecker.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.util.getType import org.jetbrains.kotlin.types.StubTypeForBuilderInference -import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.expressions.BasicExpressionTypingVisitor import org.jetbrains.kotlin.types.isError @@ -36,19 +35,7 @@ object BuilderInferenceAssignmentChecker : CallChecker { val right = binaryExpression.right ?: return val rightType = right.getType(context.trace.bindingContext) ?: return - if (!KotlinTypeChecker.DEFAULT.isSubtypeOf(rightType, leftType)) { - val dfi = context.dataFlowInfo - val dfvFactory = context.dataFlowValueFactory - val stableTypesFromDataFlow = dfi.getStableTypes( - dfvFactory.createDataFlowValue(right, rightType, context.trace.bindingContext, context.moduleDescriptor), - context.languageVersionSettings - ) - if (stableTypesFromDataFlow.none { - KotlinTypeChecker.DEFAULT.isSubtypeOf(it, leftType) - } - ) { - context.trace.report(Errors.TYPE_MISMATCH.on(right, leftType, rightType)) - } - } + if (isAssignmentCorrectWithDataFlowInfo(leftType, right, rightType, context)) return + context.trace.report(Errors.TYPE_MISMATCH.on(right, leftType, rightType)) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/assignmentCheckUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/assignmentCheckUtils.kt new file mode 100644 index 00000000000..d3a31fbeeed --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/assignmentCheckUtils.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.calls.checkers + +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.types.KotlinType + +fun isAssignmentCorrectWithDataFlowInfo( + leftType: KotlinType, + rightExpression: KtExpression, + rightType: KotlinType, + context: CallCheckerContext +): Boolean { + val kotlinTypeChecker = context.callComponents.kotlinTypeChecker + if (kotlinTypeChecker.isSubtypeOf(rightType, leftType)) return true + val dfi = context.dataFlowInfo + val dfvFactory = context.dataFlowValueFactory + val stableTypesFromDataFlow = dfi.getStableTypes( + dfvFactory.createDataFlowValue(rightExpression, rightType, context.trace.bindingContext, context.moduleDescriptor), + context.languageVersionSettings + ) + return stableTypesFromDataFlow.any { kotlinTypeChecker.isSubtypeOf(it, leftType) } +} \ No newline at end of file