FIR: JavaSymbolProviderWrapper -> JavaSymbolProvider
This commit is contained in:
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.fir.extensions.extensionService
|
|||||||
import org.jetbrains.kotlin.fir.extensions.registerExtensions
|
import org.jetbrains.kotlin.fir.extensions.registerExtensions
|
||||||
import org.jetbrains.kotlin.fir.java.FirCliSession
|
import org.jetbrains.kotlin.fir.java.FirCliSession
|
||||||
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
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.java.deserialization.KotlinDeserializedJvmSymbolsProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
||||||
@@ -165,7 +165,7 @@ object FirSessionFactory {
|
|||||||
listOfNotNull(
|
listOfNotNull(
|
||||||
firProvider.symbolProvider,
|
firProvider.symbolProvider,
|
||||||
symbolProviderForBinariesFromIncrementalCompilation,
|
symbolProviderForBinariesFromIncrementalCompilation,
|
||||||
JavaSymbolProviderWrapper(this, moduleData, projectEnvironment.getJavaClassFinder(scope)),
|
JavaSymbolProvider(this, moduleData, projectEnvironment.getJavaClassFinder(scope)),
|
||||||
dependenciesSymbolProvider,
|
dependenciesSymbolProvider,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -28,8 +28,6 @@ import org.jetbrains.kotlin.fir.java.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.java.enhancement.FirSignatureEnhancement
|
import org.jetbrains.kotlin.fir.java.enhancement.FirSignatureEnhancement
|
||||||
import org.jetbrains.kotlin.fir.resolve.constructType
|
import org.jetbrains.kotlin.fir.resolve.constructType
|
||||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
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.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||||
import org.jetbrains.kotlin.fir.types.ConeFlexibleType
|
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.types.Variance.INVARIANT
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
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<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {}
|
|
||||||
|
|
||||||
@OptIn(FirSymbolProviderInternals::class)
|
|
||||||
override fun getTopLevelFunctionSymbolsTo(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {}
|
|
||||||
|
|
||||||
@OptIn(FirSymbolProviderInternals::class)
|
|
||||||
override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadSafeMutableState
|
@ThreadSafeMutableState
|
||||||
class JavaClassConverter(
|
class JavaClassConverter(
|
||||||
private val session: FirSession,
|
private val session: FirSession,
|
||||||
|
|||||||
@@ -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<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {}
|
||||||
|
|
||||||
|
@OptIn(FirSymbolProviderInternals::class)
|
||||||
|
override fun getTopLevelFunctionSymbolsTo(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {}
|
||||||
|
|
||||||
|
@OptIn(FirSymbolProviderInternals::class)
|
||||||
|
override fun getTopLevelPropertySymbolsTo(destination: MutableList<FirPropertySymbol>, packageFqName: FqName, name: Name) {}
|
||||||
|
}
|
||||||
+1
-1
@@ -33,7 +33,7 @@ import java.nio.file.Paths
|
|||||||
|
|
||||||
// This symbol provider loads JVM classes, reading extra info from Kotlin `@Metadata` annotations
|
// 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
|
// 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
|
@ThreadSafeMutableState
|
||||||
class KotlinDeserializedJvmSymbolsProvider(
|
class KotlinDeserializedJvmSymbolsProvider(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
|
|||||||
+2
-3
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.backend.jvm.FirJvmTypeMapper
|
|||||||
import org.jetbrains.kotlin.fir.caches.FirCachesFactory
|
import org.jetbrains.kotlin.fir.caches.FirCachesFactory
|
||||||
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
|
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
|
||||||
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
|
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.java.deserialization.KotlinDeserializedJvmSymbolsProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
|
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.FirIdeProvider
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirModuleWithDependenciesSymbolProvider
|
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.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.java.createJavaClassFinder
|
||||||
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
|
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -144,7 +143,7 @@ internal object FirIdeSessionFactory {
|
|||||||
this,
|
this,
|
||||||
providers = listOf(
|
providers = listOf(
|
||||||
provider.symbolProvider,
|
provider.symbolProvider,
|
||||||
JavaSymbolProviderWrapper(this, moduleData, project.createJavaClassFinder(searchScope)),
|
JavaSymbolProvider(this, moduleData, project.createJavaClassFinder(searchScope)),
|
||||||
),
|
),
|
||||||
dependencyProvider
|
dependencyProvider
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user