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:
Denis Zharkov
2019-07-12 12:20:08 +03:00
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)