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.TypeUtils
|
||||
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.ExpressionTypingContext
|
||||
import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices
|
||||
import org.jetbrains.kotlin.types.expressions.KotlinTypeInfo
|
||||
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo
|
||||
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo
|
||||
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||
import org.jetbrains.kotlin.util.AstLoadingFilter
|
||||
import javax.inject.Inject
|
||||
|
||||
@@ -76,7 +78,8 @@ class CallExpressionResolver(
|
||||
private val builtIns: KotlinBuiltIns,
|
||||
private val qualifiedExpressionResolver: QualifiedExpressionResolver,
|
||||
private val languageVersionSettings: LanguageVersionSettings,
|
||||
private val dataFlowValueFactory: DataFlowValueFactory
|
||||
private val dataFlowValueFactory: DataFlowValueFactory,
|
||||
private val kotlinTypeRefiner: KotlinTypeRefiner
|
||||
) {
|
||||
private lateinit var expressionTypingServices: ExpressionTypingServices
|
||||
|
||||
@@ -366,7 +369,14 @@ class CallExpressionResolver(
|
||||
}
|
||||
|
||||
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) {
|
||||
resolveDeferredReceiverInQualifiedExpression(receiver, selector, context)
|
||||
|
||||
Reference in New Issue
Block a user