From d042eb2cfb368671fdf4d546d9805d4a8865a40c Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 12 Jul 2019 12:20:08 +0300 Subject: [PATCH] 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) --- .../kotlin/resolve/calls/CallExpressionResolver.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt index d435713f562..32f6cb89e22 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.kt @@ -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)