K1: extract isAssignmentCorrectWithDataFlowInfo
This commit is contained in:
committed by
Space Team
parent
7cc3f7de62
commit
f14effa8e8
+2
-15
@@ -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.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.getType
|
import org.jetbrains.kotlin.resolve.calls.util.getType
|
||||||
import org.jetbrains.kotlin.types.StubTypeForBuilderInference
|
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.expressions.BasicExpressionTypingVisitor
|
||||||
import org.jetbrains.kotlin.types.isError
|
import org.jetbrains.kotlin.types.isError
|
||||||
|
|
||||||
@@ -36,19 +35,7 @@ object BuilderInferenceAssignmentChecker : CallChecker {
|
|||||||
val right = binaryExpression.right ?: return
|
val right = binaryExpression.right ?: return
|
||||||
val rightType = right.getType(context.trace.bindingContext) ?: return
|
val rightType = right.getType(context.trace.bindingContext) ?: return
|
||||||
|
|
||||||
if (!KotlinTypeChecker.DEFAULT.isSubtypeOf(rightType, leftType)) {
|
if (isAssignmentCorrectWithDataFlowInfo(leftType, right, rightType, context)) return
|
||||||
val dfi = context.dataFlowInfo
|
context.trace.report(Errors.TYPE_MISMATCH.on(right, leftType, rightType))
|
||||||
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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+26
@@ -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) }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user