From 032cf5a892902407f485c1a6d4e2fe1331f1f527 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 13 Sep 2021 14:25:34 +0200 Subject: [PATCH] FIR: JavaSymbolProviderWrapper -> JavaSymbolProvider --- .../kotlin/fir/session/FirSessionFactory.kt | 4 +- .../kotlin/fir/java/JavaClassConverter.kt | 45 ------------- .../kotlin/fir/java/JavaSymbolProvider.kt | 64 +++++++++++++++++++ .../KotlinDeserializedJvmSymbolsProvider.kt | 2 +- .../api/sessions/FirIdeSessionFactory.kt | 5 +- 5 files changed, 69 insertions(+), 51 deletions(-) create mode 100644 compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt index 4fb95637426..6bce9e18575 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.registerExtensions import org.jetbrains.kotlin.fir.java.FirCliSession import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider -import org.jetbrains.kotlin.fir.java.JavaSymbolProviderWrapper +import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider @@ -165,7 +165,7 @@ object FirSessionFactory { listOfNotNull( firProvider.symbolProvider, symbolProviderForBinariesFromIncrementalCompilation, - JavaSymbolProviderWrapper(this, moduleData, projectEnvironment.getJavaClassFinder(scope)), + JavaSymbolProvider(this, moduleData, projectEnvironment.getJavaClassFinder(scope)), dependenciesSymbolProvider, ) ) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaClassConverter.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaClassConverter.kt index bfba24f4ec4..74bb8093c6c 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaClassConverter.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaClassConverter.kt @@ -28,8 +28,6 @@ import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.java.enhancement.FirSignatureEnhancement import org.jetbrains.kotlin.fir.resolve.constructType import org.jetbrains.kotlin.fir.resolve.defaultType -import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider -import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeFlexibleType @@ -47,49 +45,6 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance.INVARIANT import org.jetbrains.kotlin.util.OperatorNameConventions -// This symbol provider only loads JVM classes *not* annotated with Kotlin `@Metadata` annotation. -// Use it in application sessions for loading classes from Java files listed on the command line. -// For library and incremental compilation sessions use `KotlinDeserializedJvmSymbolsProvider` -// in order to load Kotlin classes as well. -class JavaSymbolProviderWrapper(session: FirSession, baseModuleData: FirModuleData, facade: JavaClassFinder) : FirSymbolProvider(session) { - private val javaClassConverter = JavaClassConverter(session, baseModuleData, facade) - - private val classCache = - session.firCachesFactory.createCacheWithPostCompute( - createValue = { classId: ClassId, parentClassSymbol: FirRegularClassSymbol? -> - javaClassConverter.findClass(classId)?.let { FirRegularClassSymbol(classId) to (it to parentClassSymbol) } - ?: null to (null to null) - }, - postCompute = { _, classSymbol, (javaClass, parentClassSymbol) -> - if (classSymbol != null && javaClass != null) { - javaClassConverter.convertJavaClassToFir(classSymbol, parentClassSymbol, javaClass) - } - } - ) - - override fun getPackage(fqName: FqName): FqName? = - javaClassConverter.getPackage(fqName) - - override fun getClassLikeSymbolByClassId(classId: ClassId): FirRegularClassSymbol? = - try { - if (javaClassConverter.hasTopLevelClassOf(classId)) getFirJavaClass(classId) else null - } catch (e: ProcessCanceledException) { - null - } - - private fun getFirJavaClass(classId: ClassId): FirRegularClassSymbol? = - classCache.getValue(classId, classId.outerClassId?.let { getFirJavaClass(it) }) - - @OptIn(FirSymbolProviderInternals::class) - override fun getTopLevelCallableSymbolsTo(destination: MutableList>, packageFqName: FqName, name: Name) {} - - @OptIn(FirSymbolProviderInternals::class) - override fun getTopLevelFunctionSymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) {} - - @OptIn(FirSymbolProviderInternals::class) - override fun getTopLevelPropertySymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) {} -} - @ThreadSafeMutableState class JavaClassConverter( private val session: FirSession, diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt new file mode 100644 index 00000000000..b4ac10fa5b7 --- /dev/null +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -0,0 +1,64 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.java + +import com.intellij.openapi.progress.ProcessCanceledException +import org.jetbrains.kotlin.fir.FirModuleData +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.caches.firCachesFactory +import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.load.java.JavaClassFinder +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name + +// This symbol provider only loads JVM classes *not* annotated with Kotlin `@Metadata` annotation. +// Use it in application sessions for loading classes from Java files listed on the command line. +// For library and incremental compilation sessions use `KotlinDeserializedJvmSymbolsProvider` +// in order to load Kotlin classes as well. +class JavaSymbolProvider(session: FirSession, baseModuleData: FirModuleData, facade: JavaClassFinder) : FirSymbolProvider(session) { + private val javaClassConverter = JavaClassConverter(session, baseModuleData, facade) + + private val classCache = + session.firCachesFactory.createCacheWithPostCompute( + createValue = { classId: ClassId, parentClassSymbol: FirRegularClassSymbol? -> + javaClassConverter.findClass(classId)?.let { FirRegularClassSymbol(classId) to (it to parentClassSymbol) } + ?: null to (null to null) + }, + postCompute = { _, classSymbol, (javaClass, parentClassSymbol) -> + if (classSymbol != null && javaClass != null) { + javaClassConverter.convertJavaClassToFir(classSymbol, parentClassSymbol, javaClass) + } + } + ) + + override fun getPackage(fqName: FqName): FqName? = + javaClassConverter.getPackage(fqName) + + override fun getClassLikeSymbolByClassId(classId: ClassId): FirRegularClassSymbol? = + try { + if (javaClassConverter.hasTopLevelClassOf(classId)) getFirJavaClass(classId) else null + } catch (e: ProcessCanceledException) { + null + } + + private fun getFirJavaClass(classId: ClassId): FirRegularClassSymbol? = + classCache.getValue(classId, classId.outerClassId?.let { getFirJavaClass(it) }) + + @OptIn(FirSymbolProviderInternals::class) + override fun getTopLevelCallableSymbolsTo(destination: MutableList>, packageFqName: FqName, name: Name) {} + + @OptIn(FirSymbolProviderInternals::class) + override fun getTopLevelFunctionSymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) {} + + @OptIn(FirSymbolProviderInternals::class) + override fun getTopLevelPropertySymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) {} +} diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index 65afaefc057..47b10652023 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -33,7 +33,7 @@ import java.nio.file.Paths // This symbol provider loads JVM classes, reading extra info from Kotlin `@Metadata` annotations // if present. Use it for library and incremental compilation sessions. For source sessions use -// `JavaSymbolProviderWrapper`, as Kotlin classes should be parsed first. +// `JavaSymbolProvider`, as Kotlin classes should be parsed first. @ThreadSafeMutableState class KotlinDeserializedJvmSymbolsProvider( session: FirSession, 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 fe6edc1d124..f9d46a53df5 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 @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.backend.jvm.FirJvmTypeMapper import org.jetbrains.kotlin.fir.caches.FirCachesFactory import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider -import org.jetbrains.kotlin.fir.java.JavaSymbolProviderWrapper +import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProvider @@ -44,7 +44,6 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirIdeLibrariesSess import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirIdeProvider import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirModuleWithDependenciesSymbolProvider import org.jetbrains.kotlin.idea.fir.low.level.api.util.checkCanceled -import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.java.createJavaClassFinder import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.name.Name @@ -144,7 +143,7 @@ internal object FirIdeSessionFactory { this, providers = listOf( provider.symbolProvider, - JavaSymbolProviderWrapper(this, moduleData, project.createJavaClassFinder(searchScope)), + JavaSymbolProvider(this, moduleData, project.createJavaClassFinder(searchScope)), ), dependencyProvider )