From 8b1be89507feadba2ee0e625860234cc76a95797 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 27 Feb 2023 20:03:55 +0900 Subject: [PATCH] [LL API] Check raw expect/actual modifiers in PSI-FIR comparison There might be both common and JVM artifacts of the same library in dependencies. --- .../KtDeclarationAndFirDeclarationEqualityChecker.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt index 4686a662c2b..cffc82ae88f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/KtDeclarationAndFirDeclarationEqualityChecker.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.api import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.createEmptySession import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries +import org.jetbrains.kotlin.analysis.utils.printer.parentsOfType import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.builder.BodyBuildingMode @@ -24,14 +25,18 @@ import org.jetbrains.kotlin.fir.types.impl.FirImplicitNullableAnyTypeRef import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtConstructor +import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtTypeReference +import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier +import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.addIfNotNull // TODO replace with structural type comparison? object KtDeclarationAndFirDeclarationEqualityChecker { fun representsTheSameDeclaration(psi: KtCallableDeclaration, fir: FirCallableDeclaration): Boolean { + if (!modifiersMatch(psi, fir)) return false if (!receiverTypeMatch(psi, fir)) return false if (!returnTypesMatch(psi, fir)) return false if (!typeParametersMatch(psi, fir)) return false @@ -39,6 +44,13 @@ object KtDeclarationAndFirDeclarationEqualityChecker { return true } + private fun modifiersMatch(psi: KtCallableDeclaration, fir: FirCallableDeclaration): Boolean { + // According to asymmetric logic in 'RawFirBuilder' + if (psi.parentsOfType().any { it.hasExpectModifier() } != fir.symbol.rawStatus.isExpect) return false + if (psi.hasActualModifier() != fir.symbol.rawStatus.isActual) return false + return true + } + private fun receiverTypeMatch(psi: KtCallableDeclaration, fir: FirCallableDeclaration): Boolean { if ((fir.receiverParameter != null) != (psi.receiverTypeReference != null)) return false if (fir.receiverParameter != null && !isTheSameTypes(psi.receiverTypeReference!!, fir.receiverParameter!!.typeRef, isVararg = false)) {