Fix type refinement for qualified expressions
Previously, type for "c.a"-receiver in "c.a.platformFun()" has not been refined because typechecking of "c.a" doesn't go through common facade org.jetbrains.kotlin.types.expressions.ExpressionTypingServices#getTypeInfo where the most of expressions are expected to be type checked. (see org.jetbrains.kotlin.resolve.calls.CallExpressionResolver#getUnsafeSelectorTypeInfo)
This commit is contained in:
committed by
Dmitry Savvinov
parent
6695ddd1d5
commit
d042eb2cfb
@@ -59,12 +59,14 @@ import org.jetbrains.kotlin.types.ErrorUtils
|
|||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
import org.jetbrains.kotlin.types.TypeUtils.NO_EXPECTED_TYPE
|
import org.jetbrains.kotlin.types.TypeUtils.NO_EXPECTED_TYPE
|
||||||
|
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
||||||
import org.jetbrains.kotlin.types.expressions.DataFlowAnalyzer
|
import org.jetbrains.kotlin.types.expressions.DataFlowAnalyzer
|
||||||
import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext
|
import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext
|
||||||
import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices
|
import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices
|
||||||
import org.jetbrains.kotlin.types.expressions.KotlinTypeInfo
|
import org.jetbrains.kotlin.types.expressions.KotlinTypeInfo
|
||||||
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo
|
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo
|
||||||
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo
|
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo
|
||||||
|
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||||
import org.jetbrains.kotlin.util.AstLoadingFilter
|
import org.jetbrains.kotlin.util.AstLoadingFilter
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@@ -76,7 +78,8 @@ class CallExpressionResolver(
|
|||||||
private val builtIns: KotlinBuiltIns,
|
private val builtIns: KotlinBuiltIns,
|
||||||
private val qualifiedExpressionResolver: QualifiedExpressionResolver,
|
private val qualifiedExpressionResolver: QualifiedExpressionResolver,
|
||||||
private val languageVersionSettings: LanguageVersionSettings,
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
private val dataFlowValueFactory: DataFlowValueFactory
|
private val dataFlowValueFactory: DataFlowValueFactory,
|
||||||
|
private val kotlinTypeRefiner: KotlinTypeRefiner
|
||||||
) {
|
) {
|
||||||
private lateinit var expressionTypingServices: ExpressionTypingServices
|
private lateinit var expressionTypingServices: ExpressionTypingServices
|
||||||
|
|
||||||
@@ -366,7 +369,14 @@ class CallExpressionResolver(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val selector = element.selector
|
val selector = element.selector
|
||||||
var selectorTypeInfo = getUnsafeSelectorTypeInfo(receiver, callOperationNode, selector, context, initialDataFlowInfoForArguments)
|
|
||||||
|
@UseExperimental(TypeRefinement::class)
|
||||||
|
var selectorTypeInfo =
|
||||||
|
getUnsafeSelectorTypeInfo(receiver, callOperationNode, selector, context, initialDataFlowInfoForArguments)
|
||||||
|
.run {
|
||||||
|
val type = type ?: return@run this
|
||||||
|
replaceType(kotlinTypeRefiner.refineType(type))
|
||||||
|
}
|
||||||
|
|
||||||
if (receiver is Qualifier) {
|
if (receiver is Qualifier) {
|
||||||
resolveDeferredReceiverInQualifiedExpression(receiver, selector, context)
|
resolveDeferredReceiverInQualifiedExpression(receiver, selector, context)
|
||||||
|
|||||||
Reference in New Issue
Block a user