K1: extract isAssignmentCorrectWithDataFlowInfo

This commit is contained in:
Mikhail Glukhikh
2023-01-26 09:01:05 +01:00
committed by Space Team
parent 7cc3f7de62
commit f14effa8e8
2 changed files with 28 additions and 15 deletions
@@ -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))
}
}
@@ -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) }
}