From f02a4a6b1fc3e459c36cfdf38df8ae33a931b5d9 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 12 May 2021 14:15:47 +0300 Subject: [PATCH] [FIR-IDE] Add workaround hack for building raw FIR with libraries session --- .../api/sessions/FirIdeSessionFactory.kt | 20 +++++++++++++++ ...arationAndFirDeclarationEqualityChecker.kt | 25 +++++++++++-------- ...arationAndFirDeclarationEqualityChecker.kt | 2 +- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt index 57c8b4d12d3..c360c270717 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt @@ -255,3 +255,23 @@ internal object FirIdeSessionFactory { register(SealedClassInheritorsProvider::class, SealedClassInheritorsProviderIdeImpl()) } } + +@Deprecated( + "This is a dirty hack used only for one usage (building fir for psi from stubs) and it should be removed after fix of that usage", + level = DeprecationLevel.ERROR +) +@OptIn(PrivateSessionConstructor::class) +fun createEmptySession(): FirSession { + return object : FirSession(null) {}.apply { + val moduleData = FirModuleDataImpl( + Name.identifier(""), + dependencies = emptyList(), + dependsOnDependencies = emptyList(), + friendDependencies = emptyList(), + platform = JvmPlatforms.unspecifiedJvmPlatform, + analyzerServices = JvmPlatformAnalyzerServices + ) + registerModuleData(moduleData) + moduleData.bindSession(this) + } +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/KtDeclarationAndFirDeclarationEqualityChecker.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/KtDeclarationAndFirDeclarationEqualityChecker.kt index 3bdba3828ea..7b29715e5d8 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/KtDeclarationAndFirDeclarationEqualityChecker.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/KtDeclarationAndFirDeclarationEqualityChecker.kt @@ -17,12 +17,13 @@ import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.createEmptySession import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.types.Variance -// TODO replace with structural type comparision? +// TODO replace with structural type comparison? object KtDeclarationAndFirDeclarationEqualityChecker { fun representsTheSameDeclaration(psi: KtFunction, fir: FirFunction<*>): Boolean { if ((fir.receiverTypeRef != null) != (psi.receiverTypeReference != null)) return false @@ -30,7 +31,6 @@ object KtDeclarationAndFirDeclarationEqualityChecker { && !isTheSameTypes( psi.receiverTypeReference!!, fir.receiverTypeRef!!, - fir.moduleData.session, isVararg = false ) ) { @@ -44,7 +44,6 @@ object KtDeclarationAndFirDeclarationEqualityChecker { if (!isTheSameTypes( candidateParameterType, expectedParameter.returnTypeRef, - fir.moduleData.session, isVararg = expectedParameter.isVararg ) ) { @@ -126,14 +125,18 @@ object KtDeclarationAndFirDeclarationEqualityChecker { private fun isTheSameTypes( psiTypeReference: KtTypeReference, coneTypeReference: FirTypeRef, - session: FirSession, isVararg: Boolean ): Boolean = - psiTypeReference.toKotlinTypReference(session).renderTypeAsKotlinType(isVararg) == coneTypeReference.renderTypeAsKotlinType() + psiTypeReference.toKotlinTypReference().renderTypeAsKotlinType(isVararg) == coneTypeReference.renderTypeAsKotlinType() - private fun KtTypeReference.toKotlinTypReference(session: FirSession): FirTypeRef { + @Suppress("DEPRECATION_ERROR") + private fun KtTypeReference.toKotlinTypReference(): FirTypeRef { // Maybe resolve all types here to not to work with FirTypeRef directly - return RawFirBuilder(session, DummyScopeProvider, RawFirBuilderMode.STUBS).buildTypeReference(this) + return RawFirBuilder( + createEmptySession(), + DummyScopeProvider, + RawFirBuilderMode.STUBS + ).buildTypeReference(this) } private fun ConeKotlinType.renderTypeAsKotlinType(): String { @@ -163,12 +166,12 @@ object KtDeclarationAndFirDeclarationEqualityChecker { } @TestOnly - internal fun renderPsi(ktFunction: KtFunction, session: FirSession): String = buildString { - appendLine("receiver: ${ktFunction.receiverTypeReference?.toKotlinTypReference(session)?.renderTypeAsKotlinType()}") + internal fun renderPsi(ktFunction: KtFunction): String = buildString { + appendLine("receiver: ${ktFunction.receiverTypeReference?.toKotlinTypReference()?.renderTypeAsKotlinType()}") ktFunction.valueParameters.forEach { parameter -> - appendLine("${parameter.name}: ${parameter.typeReference?.toKotlinTypReference(session)?.renderTypeAsKotlinType()}") + appendLine("${parameter.name}: ${parameter.typeReference?.toKotlinTypReference()?.renderTypeAsKotlinType()}") } - appendLine("return: ${ktFunction.typeReference?.toKotlinTypReference(session)?.renderTypeAsKotlinType()}") + appendLine("return: ${ktFunction.typeReference?.toKotlinTypReference()?.renderTypeAsKotlinType()}") } @TestOnly diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt index 3020fb2d4ce..c2993d33033 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt @@ -26,7 +26,7 @@ abstract class AbstractKtDeclarationAndFirDeclarationEqualityChecker : KotlinLig if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) { throw FileComparisonFailure( /* message= */ null, - KtDeclarationAndFirDeclarationEqualityChecker.renderPsi(ktFunction, firFunction.moduleData.session), + KtDeclarationAndFirDeclarationEqualityChecker.renderPsi(ktFunction), KtDeclarationAndFirDeclarationEqualityChecker.renderFir(firFunction), /* expectedFilePath= */ null )