From b7059a3eebb518dbfbb2d6d72a79545f5a7bf39f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 17 Sep 2020 18:03:21 +0300 Subject: [PATCH] FIR: perform type approximation when completion isn't required --- .../testData/resolve/typeAliasWithTypeArguments.kt | 4 ++-- .../testData/resolve/typeAliasWithTypeArguments.txt | 4 ++-- .../body/resolve/FirExpressionsResolveTransformer.kt | 9 ++++++++- .../overloadConflicts/genericWithProjection.fir.kt | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.kt b/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.kt index 39b2db7dbaf..6ab505ccc78 100644 --- a/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.kt +++ b/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.kt @@ -74,12 +74,12 @@ typealias Invariant1 = Invariant fun test_5(a: A, in1: In1, in2: In1, in3: In1) { in1.take(a) in2.take(a) - in3.take(a) + in3.take(a) } fun test_6(a: A, out1: Out1, out2: Out1, out3: Out1) { out1.value().foo() - out2.value().foo() + out2.value().foo() out3.value().foo() } diff --git a/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.txt b/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.txt index ef16c2aa4a3..75808e54f0d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.txt +++ b/compiler/fir/analysis-tests/testData/resolve/typeAliasWithTypeArguments.txt @@ -68,11 +68,11 @@ FILE: typeAliasWithTypeArguments.kt public final fun test_5(a: R|A|, in1: R|In1|, in2: R|In1|, in3: R|In1|): R|kotlin/Unit| { R|/in1|.R|FakeOverride|(R|/a|) R|/in2|.R|FakeOverride|(R|/a|) - R|/in3|.#(R|/a|) + R|/in3|.#(R|/a|) } public final fun test_6(a: R|A|, out1: R|Out1|, out2: R|Out1|, out3: R|Out1|): R|kotlin/Unit| { R|/out1|.R|FakeOverride|().R|/A.foo|() - R|/out2|.R|FakeOverride|().#() + R|/out2|.#().#() R|/out3|.R|FakeOverride|().R|/A.foo|() } public final fun test_7(a: R|A|, inv1: R|Invariant1|, inv2: R|Invariant1|, inv3: R|Invariant1|): R|kotlin/Unit| { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index a5153637431..7591789a52f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.diagnostics.* import org.jetbrains.kotlin.fir.resolve.inference.FirStubInferenceSession +import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents import org.jetbrains.kotlin.fir.resolve.transformers.InvocationKindTransformer import org.jetbrains.kotlin.fir.resolve.transformers.StoreReceiver import org.jetbrains.kotlin.fir.resolve.transformers.firClassLike @@ -35,6 +36,7 @@ import org.jetbrains.kotlin.fir.visitors.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability +import org.jetbrains.kotlin.types.TypeApproximatorConfiguration open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) : FirPartialBodyResolveTransformer(transformer) { private inline val builtinTypes: BuiltinTypes get() = session.builtinTypes @@ -939,6 +941,11 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform // ------------------------------------------------------------------------------------------------ internal fun storeTypeFromCallee(access: T) where T : FirQualifiedAccess, T : FirExpression { - access.resultType = components.typeFromCallee(access) + val typeFromCallee = components.typeFromCallee(access) + access.resultType = typeFromCallee.withReplacedConeType( + session.inferenceComponents.approximator.approximateToSuperType( + typeFromCallee.type, TypeApproximatorConfiguration.FinalApproximationAfterResolutionAndInference + ) as ConeKotlinType? + ) } } diff --git a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/genericWithProjection.fir.kt b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/genericWithProjection.fir.kt index f63f9f44948..85ccadecf5b 100644 --- a/compiler/testData/diagnostics/tests/resolve/overloadConflicts/genericWithProjection.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/overloadConflicts/genericWithProjection.fir.kt @@ -7,5 +7,5 @@ class In() { fun test1(x: In): Unit = x.f("1") fun test2(x: In): Unit = x.f("1") -fun test3(x: In): Unit = x.f("1") +fun test3(x: In): Unit = x.f("1") fun test4(x: In<*>): Unit = x.f("1") \ No newline at end of file