From 2af73c2b137d4cee4cecee84e06be7c0be368cfc Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 24 Apr 2023 17:06:51 +0200 Subject: [PATCH] [FIR] Add `FirJavaElementFinder` to session's components This change allows us to use `IrInterpreter` to evaluate Kotlin's const properties that were called from Java world #KT-57802 --- .../kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt | 7 ++++++- .../org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt index 17aba27d702..0f3536eae94 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/VfsBasedProjectEnvironment.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.KtVirtualFileSourceFile import org.jetbrains.kotlin.asJava.finder.JavaElementFinder import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.java.FirJavaElementFinder import org.jetbrains.kotlin.fir.java.FirJavaFacadeForSource import org.jetbrains.kotlin.fir.session.environment.AbstractProjectEnvironment @@ -62,12 +63,16 @@ open class VfsBasedProjectEnvironment( override fun getPackagePartProvider(fileSearchScope: AbstractProjectFileSearchScope): PackagePartProvider = getPackagePartProviderFn(fileSearchScope.asPsiSearchScope()) + @OptIn(SessionConfiguration::class) override fun registerAsJavaElementFinder(firSession: FirSession) { val psiFinderExtensionPoint = PsiElementFinder.EP.getPoint(project) if (psiFinderExtensionPoint.extensionList.any { it is JavaElementFinder }) { psiFinderExtensionPoint.unregisterExtension(JavaElementFinder::class.java) } - psiFinderExtensionPoint.registerExtension(FirJavaElementFinder(firSession, project), project) + + val firJavaElementFinder = FirJavaElementFinder(firSession, project) + firSession.register(FirJavaElementFinder::class, firJavaElementFinder) + psiFinderExtensionPoint.registerExtension(firJavaElementFinder, project) } private fun List.toSearchScope(allowOutOfProjectRoots: Boolean) = diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt index 9bba2fb5bca..5580202eb4b 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.utils.classId @@ -45,10 +46,12 @@ import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.KotlinFinderMarker import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment +val FirSession.javaElementFinder: FirJavaElementFinder? by FirSession.nullableSessionComponentAccessor() + class FirJavaElementFinder( private val session: FirSession, project: Project -) : PsiElementFinder(), KotlinFinderMarker { +) : PsiElementFinder(), KotlinFinderMarker, FirSessionComponent { private val psiManager = PsiManager.getInstance(project) private val firProviders: List = buildList {