From 7787638737690ce3a7e61db6e2550d23b971aec1 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 31 Oct 2022 12:53:47 +0100 Subject: [PATCH] FIR: fix substitution of anonymous type's supertype again ^KT-51418 Fixed --- .../jetbrains/kotlin/fir/types/TypeUtils.kt | 42 ++----------------- ...ForReturnTypeOfSingleExpressionFunction.kt | 5 +++ ...orReturnTypeOfSingleExpressionFunction.txt | 9 ++++ 3 files changed, 17 insertions(+), 39 deletions(-) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index c3bb842df95..73409bd409c 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -416,46 +416,10 @@ private fun ConeKotlinType.approximateToOnlySupertype(session: FirSession): Cone return null } val result = superType.type.withNullability(nullability, session.typeContext) - if (typeArguments.isNotEmpty()) { - val substitution = mutableMapOf() - - var index = 0 - fun addSubstitution(projection: ConeTypeProjection): Boolean { - when (projection) { - is ConeTypeParameterType -> { - val symbol = projection.lookupTag.typeParameterSymbol - if (!substitution.containsKey(symbol)) { - substitution[symbol] = typeArguments[index].type!! - index++ - } - } - - is ConeErrorType -> { - return false - } - - is ConeClassLikeType -> { - for (typeArgument in projection.typeArguments) { - if (!addSubstitution(typeArgument)) { - return false - } - } - } - - is ConeKotlinTypeProjection -> { - if (!addSubstitution(projection.type)) { - return false - } - } - - is ConeStarProjection -> { - index++ - } - } - return true + if (typeArguments.isNotEmpty() && typeArguments.size == firClass.typeParameters.size) { + val substitution = firClass.typeParameters.zip(typeArguments).associate { (parameter, argument) -> + parameter.symbol to argument.type!! } - - addSubstitution(result) return ConeSubstitutorByMap(substitution, session).substituteOrSelf(result) } return result diff --git a/compiler/testData/diagnostics/tests/inference/substitutions/hideLocalTypeForReturnTypeOfSingleExpressionFunction.kt b/compiler/testData/diagnostics/tests/inference/substitutions/hideLocalTypeForReturnTypeOfSingleExpressionFunction.kt index cda7d5ab8f7..3d0ca19789a 100644 --- a/compiler/testData/diagnostics/tests/inference/substitutions/hideLocalTypeForReturnTypeOfSingleExpressionFunction.kt +++ b/compiler/testData/diagnostics/tests/inference/substitutions/hideLocalTypeForReturnTypeOfSingleExpressionFunction.kt @@ -31,13 +31,18 @@ class FieldTest { interface I interface I2 +interface I3 { fun foo(x: T) } private fun f(x: V) = object : I> {} private fun f1(x: V) = object : I> {} private fun f2(x: V) = object : I2 {} private fun f3(x: V, y: W) = object : I> {} +private fun I3.f4(block: (W) -> V) = object : I3 { + override fun foo(x: W) = this@f4.foo(block(x)) +} fun g() = f("f") fun g1() = f("f1") fun g2() = f2("f2") fun g3() = f3("f3", 3) +fun I3.g4(block: (W) -> V) = f4(block) diff --git a/compiler/testData/diagnostics/tests/inference/substitutions/hideLocalTypeForReturnTypeOfSingleExpressionFunction.txt b/compiler/testData/diagnostics/tests/inference/substitutions/hideLocalTypeForReturnTypeOfSingleExpressionFunction.txt index e928a799b63..643efd3eb5a 100644 --- a/compiler/testData/diagnostics/tests/inference/substitutions/hideLocalTypeForReturnTypeOfSingleExpressionFunction.txt +++ b/compiler/testData/diagnostics/tests/inference/substitutions/hideLocalTypeForReturnTypeOfSingleExpressionFunction.txt @@ -12,6 +12,8 @@ public fun g2(): I2 public fun g3(): I> public fun main(): kotlin.Unit private fun test(/*0*/ t: T): test.`` +private fun I3.f4(/*0*/ block: (W) -> V): f4.`` +public fun I3.g4(/*0*/ block: (W) -> V): I3 public abstract class A { public constructor A() @@ -43,3 +45,10 @@ public interface I2 { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } +public interface I3 { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(/*0*/ x: T): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +