From 211102569c766b3fa9f99a9317dad2714a4fee44 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Wed, 20 Sep 2023 12:07:34 +0200 Subject: [PATCH] K2 KMP: Don't create invalid ConeSubstitutor when type parameters size doesn't match When type parameters size doesn't match, it's better to pass `null` instead of a parentSubstitutor. Before this commit we were creating an invalid substitutor. Who knows what can go wrong because of that further along the execution Related issue: KT-54827 Related test: compiler/testData/diagnostics/tests/multiplatform/kt54827.kt Review: https://jetbrains.team/p/kt/reviews/12279/files Motivation for the commit: There is no user report or anything. It's not known whether these invalid substitutors were causing problems. I just noticed this problem while doing substitutor API refactoring (see the next commit). Note: `ExpectedActualResolver.matchActualCallableAgainstPotentialExpects` has the same problem. But since it's K1 I won't touch it --- .../transformers/mpp/FirExpectActualResolver.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt index 349e8973d64..0d8b5a447c3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt @@ -44,15 +44,16 @@ object FirExpectActualResolver { ?.fullyExpandedClass(useSiteSession) val expectTypeParameters = expectContainingClass?.typeParameterSymbols.orEmpty() - val actualTypeParameters = actualContainingClass - ?.typeParameterSymbols - .orEmpty() + val actualTypeParameters = actualContainingClass?.typeParameterSymbols.orEmpty() - parentSubstitutor = createExpectActualTypeParameterSubstitutor( - expectTypeParameters, - actualTypeParameters, - useSiteSession, - ) + parentSubstitutor = when (expectTypeParameters.size == actualTypeParameters.size) { + true -> createExpectActualTypeParameterSubstitutor( + expectTypeParameters, + actualTypeParameters, + useSiteSession, + ) + false -> null + } when (actualSymbol) { is FirConstructorSymbol -> expectContainingClass?.getConstructors(scopeSession)