FIR: rename JavaSymbolProvider to JavaClassConverter
This commit is contained in:
+2
-2
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.analysis.jvm.checkers.isJvm6
|
|||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
|
import org.jetbrains.kotlin.fir.java.JavaClassConverter
|
||||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||||
@@ -166,7 +166,7 @@ object FirRepeatableAnnotationChecker : FirAnnotatedDeclarationChecker() {
|
|||||||
?: return
|
?: return
|
||||||
|
|
||||||
val valueParameterSymbols = containerCtor.valueParameterSymbols
|
val valueParameterSymbols = containerCtor.valueParameterSymbols
|
||||||
val parameterName = JavaSymbolProvider.VALUE_METHOD_NAME
|
val parameterName = JavaClassConverter.VALUE_METHOD_NAME
|
||||||
val value = valueParameterSymbols.find { it.name == parameterName }
|
val value = valueParameterSymbols.find { it.name == parameterName }
|
||||||
if (value == null || !value.resolvedReturnTypeRef.isArrayType ||
|
if (value == null || !value.resolvedReturnTypeRef.isArrayType ||
|
||||||
value.resolvedReturnTypeRef.type.typeArguments.single().type != annotationClass.defaultType()
|
value.resolvedReturnTypeRef.type.typeArguments.single().type != annotationClass.defaultType()
|
||||||
|
|||||||
+1
-1
@@ -187,7 +187,7 @@ abstract class AbstractFirDeserializedSymbolsProvider(
|
|||||||
|
|
||||||
protected open fun shouldLoadParentsFirst(classId: ClassId): Boolean = false
|
protected open fun shouldLoadParentsFirst(classId: ClassId): Boolean = false
|
||||||
|
|
||||||
protected open fun getClass(
|
protected fun getClass(
|
||||||
classId: ClassId,
|
classId: ClassId,
|
||||||
parentContext: FirDeserializationContext? = null
|
parentContext: FirDeserializationContext? = null
|
||||||
): FirRegularClassSymbol? {
|
): FirRegularClassSymbol? {
|
||||||
|
|||||||
+25
-28
@@ -47,28 +47,32 @@ 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) {
|
class JavaSymbolProviderWrapper(session: FirSession, baseModuleData: FirModuleData, facade: JavaClassFinder) : FirSymbolProvider(session) {
|
||||||
private val javaSymbolProvider = JavaSymbolProvider(session, baseModuleData, facade)
|
private val javaClassConverter = JavaClassConverter(session, baseModuleData, facade)
|
||||||
|
|
||||||
private val classCache =
|
private val classCache =
|
||||||
session.firCachesFactory.createCacheWithPostCompute(
|
session.firCachesFactory.createCacheWithPostCompute(
|
||||||
createValue = { classId: ClassId, parentClassSymbol: FirRegularClassSymbol? ->
|
createValue = { classId: ClassId, parentClassSymbol: FirRegularClassSymbol? ->
|
||||||
javaSymbolProvider.findClass(classId)?.let { FirRegularClassSymbol(classId) to (it to parentClassSymbol) }
|
javaClassConverter.findClass(classId)?.let { FirRegularClassSymbol(classId) to (it to parentClassSymbol) }
|
||||||
?: null to (null to null)
|
?: null to (null to null)
|
||||||
},
|
},
|
||||||
postCompute = { _, classSymbol, (javaClass, parentClassSymbol) ->
|
postCompute = { _, classSymbol, (javaClass, parentClassSymbol) ->
|
||||||
if (classSymbol != null && javaClass != null) {
|
if (classSymbol != null && javaClass != null) {
|
||||||
javaSymbolProvider.convertJavaClassToFir(classSymbol, parentClassSymbol, javaClass)
|
javaClassConverter.convertJavaClassToFir(classSymbol, parentClassSymbol, javaClass)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun getPackage(fqName: FqName): FqName? =
|
override fun getPackage(fqName: FqName): FqName? =
|
||||||
javaSymbolProvider.getPackage(fqName)
|
javaClassConverter.getPackage(fqName)
|
||||||
|
|
||||||
override fun getClassLikeSymbolByClassId(classId: ClassId): FirRegularClassSymbol? =
|
override fun getClassLikeSymbolByClassId(classId: ClassId): FirRegularClassSymbol? =
|
||||||
try {
|
try {
|
||||||
if (javaSymbolProvider.hasTopLevelClassOf(classId)) getFirJavaClass(classId) else null
|
if (javaClassConverter.hasTopLevelClassOf(classId)) getFirJavaClass(classId) else null
|
||||||
} catch (e: ProcessCanceledException) {
|
} catch (e: ProcessCanceledException) {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
@@ -87,7 +91,7 @@ class JavaSymbolProviderWrapper(session: FirSession, baseModuleData: FirModuleDa
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ThreadSafeMutableState
|
@ThreadSafeMutableState
|
||||||
class JavaSymbolProvider(
|
class JavaClassConverter(
|
||||||
private val session: FirSession,
|
private val session: FirSession,
|
||||||
private val baseModuleData: FirModuleData,
|
private val baseModuleData: FirModuleData,
|
||||||
private val facade: JavaClassFinder
|
private val facade: JavaClassFinder
|
||||||
@@ -104,7 +108,7 @@ class JavaSymbolProvider(
|
|||||||
|
|
||||||
fun findClass(classId: ClassId, knownContent: ByteArray? = null): JavaClass? =
|
fun findClass(classId: ClassId, knownContent: ByteArray? = null): JavaClass? =
|
||||||
facade.findClass(JavaClassFinder.Request(classId, knownContent))
|
facade.findClass(JavaClassFinder.Request(classId, knownContent))
|
||||||
?.takeIf { !it.hasDifferentClassId(classId) && !it.hasMetadataAnnotation() }
|
?.takeIf { it.classId == classId && !it.hasMetadataAnnotation() }
|
||||||
|
|
||||||
fun getPackage(fqName: FqName): FqName? =
|
fun getPackage(fqName: FqName): FqName? =
|
||||||
try {
|
try {
|
||||||
@@ -120,7 +124,7 @@ class JavaSymbolProvider(
|
|||||||
|
|
||||||
private fun JavaTypeParameter.toFirTypeParameter(javaTypeParameterStack: JavaTypeParameterStack): FirTypeParameter {
|
private fun JavaTypeParameter.toFirTypeParameter(javaTypeParameterStack: JavaTypeParameterStack): FirTypeParameter {
|
||||||
return buildTypeParameter {
|
return buildTypeParameter {
|
||||||
moduleData = this@JavaSymbolProvider.baseModuleData
|
moduleData = baseModuleData
|
||||||
origin = FirDeclarationOrigin.Java
|
origin = FirDeclarationOrigin.Java
|
||||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||||
name = this@toFirTypeParameter.name
|
name = this@toFirTypeParameter.name
|
||||||
@@ -145,9 +149,6 @@ class JavaSymbolProvider(
|
|||||||
private fun List<JavaTypeParameter>.convertTypeParameters(stack: JavaTypeParameterStack): List<FirTypeParameter> =
|
private fun List<JavaTypeParameter>.convertTypeParameters(stack: JavaTypeParameterStack): List<FirTypeParameter> =
|
||||||
map { it.toFirTypeParameter(stack) }
|
map { it.toFirTypeParameter(stack) }
|
||||||
|
|
||||||
private fun JavaClass.hasDifferentClassId(lookupClassId: ClassId): Boolean =
|
|
||||||
classId != lookupClassId
|
|
||||||
|
|
||||||
private fun JavaClass.hasMetadataAnnotation(): Boolean =
|
private fun JavaClass.hasMetadataAnnotation(): Boolean =
|
||||||
annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }
|
annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }
|
||||||
|
|
||||||
@@ -203,7 +204,7 @@ class JavaSymbolProvider(
|
|||||||
val classIsAnnotation = javaClass.classKind == ClassKind.ANNOTATION_CLASS
|
val classIsAnnotation = javaClass.classKind == ClassKind.ANNOTATION_CLASS
|
||||||
return buildJavaClass {
|
return buildJavaClass {
|
||||||
source = (javaClass as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
source = (javaClass as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
||||||
moduleData = this@JavaSymbolProvider.baseModuleData
|
moduleData = baseModuleData
|
||||||
symbol = classSymbol
|
symbol = classSymbol
|
||||||
name = javaClass.name
|
name = javaClass.name
|
||||||
val visibility = javaClass.visibility
|
val visibility = javaClass.visibility
|
||||||
@@ -348,7 +349,7 @@ class JavaSymbolProvider(
|
|||||||
return when {
|
return when {
|
||||||
javaField.isEnumEntry -> buildEnumEntry {
|
javaField.isEnumEntry -> buildEnumEntry {
|
||||||
source = (javaField as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
source = (javaField as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
||||||
moduleData = this@JavaSymbolProvider.baseModuleData
|
moduleData = baseModuleData
|
||||||
symbol = FirEnumEntrySymbol(fieldId)
|
symbol = FirEnumEntrySymbol(fieldId)
|
||||||
name = fieldName
|
name = fieldName
|
||||||
status = FirResolvedDeclarationStatusImpl(
|
status = FirResolvedDeclarationStatusImpl(
|
||||||
@@ -361,17 +362,17 @@ class JavaSymbolProvider(
|
|||||||
isActual = false
|
isActual = false
|
||||||
isOverride = false
|
isOverride = false
|
||||||
}
|
}
|
||||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
|
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
|
||||||
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||||
origin = FirDeclarationOrigin.Java
|
origin = FirDeclarationOrigin.Java
|
||||||
// TODO: check if this works properly with annotations that take the enum class as an argument
|
// TODO: check if this works properly with annotations that take the enum class as an argument
|
||||||
annotations.addFromJava(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack)
|
annotations.addFromJava(session, javaField, javaTypeParameterStack)
|
||||||
}.apply {
|
}.apply {
|
||||||
containingClassForStaticMemberAttr = ConeClassLikeLookupTagImpl(classId)
|
containingClassForStaticMemberAttr = ConeClassLikeLookupTagImpl(classId)
|
||||||
}
|
}
|
||||||
else -> buildJavaField {
|
else -> buildJavaField {
|
||||||
source = (javaField as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
source = (javaField as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
||||||
moduleData = this@JavaSymbolProvider.baseModuleData
|
moduleData = baseModuleData
|
||||||
symbol = FirFieldSymbol(fieldId)
|
symbol = FirFieldSymbol(fieldId)
|
||||||
name = fieldName
|
name = fieldName
|
||||||
status = FirResolvedDeclarationStatusImpl(
|
status = FirResolvedDeclarationStatusImpl(
|
||||||
@@ -386,7 +387,7 @@ class JavaSymbolProvider(
|
|||||||
}
|
}
|
||||||
visibility = javaField.visibility
|
visibility = javaField.visibility
|
||||||
modality = javaField.modality
|
modality = javaField.modality
|
||||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
|
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
|
||||||
isVar = !javaField.isFinal
|
isVar = !javaField.isFinal
|
||||||
isStatic = javaField.isStatic
|
isStatic = javaField.isStatic
|
||||||
annotationBuilder = { javaField.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
annotationBuilder = { javaField.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
||||||
@@ -419,17 +420,15 @@ class JavaSymbolProvider(
|
|||||||
val methodSymbol = FirNamedFunctionSymbol(methodId)
|
val methodSymbol = FirNamedFunctionSymbol(methodId)
|
||||||
val returnType = javaMethod.returnType
|
val returnType = javaMethod.returnType
|
||||||
return buildJavaMethod {
|
return buildJavaMethod {
|
||||||
moduleData = this@JavaSymbolProvider.baseModuleData
|
moduleData = baseModuleData
|
||||||
source = (javaMethod as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
source = (javaMethod as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
||||||
symbol = methodSymbol
|
symbol = methodSymbol
|
||||||
name = methodName
|
name = methodName
|
||||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
|
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
|
||||||
isStatic = javaMethod.isStatic
|
isStatic = javaMethod.isStatic
|
||||||
typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
typeParameters += javaMethod.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||||
for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) {
|
for ((index, valueParameter) in javaMethod.valueParameters.withIndex()) {
|
||||||
valueParameters += valueParameter.toFirValueParameter(
|
valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack)
|
||||||
this@JavaSymbolProvider.session, moduleData, index, javaTypeParameterStack,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
annotationBuilder = { javaMethod.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
annotationBuilder = { javaMethod.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
||||||
status = FirResolvedDeclarationStatusImpl(
|
status = FirResolvedDeclarationStatusImpl(
|
||||||
@@ -465,7 +464,7 @@ class JavaSymbolProvider(
|
|||||||
buildJavaValueParameter {
|
buildJavaValueParameter {
|
||||||
source = (javaMethod as? JavaElementImpl<*>)?.psi
|
source = (javaMethod as? JavaElementImpl<*>)?.psi
|
||||||
?.toFirPsiSourceElement(FirFakeSourceElementKind.ImplicitJavaAnnotationConstructor)
|
?.toFirPsiSourceElement(FirFakeSourceElementKind.ImplicitJavaAnnotationConstructor)
|
||||||
moduleData = this@JavaSymbolProvider.baseModuleData
|
moduleData = baseModuleData
|
||||||
returnTypeRef = firJavaMethod.returnTypeRef
|
returnTypeRef = firJavaMethod.returnTypeRef
|
||||||
name = javaMethod.name
|
name = javaMethod.name
|
||||||
isVararg = javaMethod.returnType is JavaArrayType && javaMethod.name == VALUE_METHOD_NAME
|
isVararg = javaMethod.returnType is JavaArrayType && javaMethod.name == VALUE_METHOD_NAME
|
||||||
@@ -483,7 +482,7 @@ class JavaSymbolProvider(
|
|||||||
val constructorSymbol = FirConstructorSymbol(constructorId)
|
val constructorSymbol = FirConstructorSymbol(constructorId)
|
||||||
return buildJavaConstructor {
|
return buildJavaConstructor {
|
||||||
source = (javaConstructor as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
source = (javaConstructor as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement()
|
||||||
moduleData = this@JavaSymbolProvider.baseModuleData
|
moduleData = baseModuleData
|
||||||
symbol = constructorSymbol
|
symbol = constructorSymbol
|
||||||
isInner = javaClass.outerClass != null && !javaClass.isStatic
|
isInner = javaClass.outerClass != null && !javaClass.isStatic
|
||||||
val isThisInner = this.isInner
|
val isThisInner = this.isInner
|
||||||
@@ -509,9 +508,7 @@ class JavaSymbolProvider(
|
|||||||
this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||||
annotationBuilder = { javaConstructor.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
annotationBuilder = { javaConstructor.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
||||||
for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) {
|
for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) {
|
||||||
valueParameters += valueParameter.toFirValueParameter(
|
valueParameters += valueParameter.toFirValueParameter(session, moduleData, index, javaTypeParameterStack)
|
||||||
this@JavaSymbolProvider.session, moduleData, index, javaTypeParameterStack,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
annotationBuilder = { emptyList() }
|
annotationBuilder = { emptyList() }
|
||||||
@@ -529,7 +526,7 @@ class JavaSymbolProvider(
|
|||||||
): FirJavaConstructor {
|
): FirJavaConstructor {
|
||||||
return buildJavaConstructor {
|
return buildJavaConstructor {
|
||||||
source = classSource
|
source = classSource
|
||||||
moduleData = this@JavaSymbolProvider.baseModuleData
|
moduleData = baseModuleData
|
||||||
symbol = FirConstructorSymbol(constructorId)
|
symbol = FirConstructorSymbol(constructorId)
|
||||||
status = FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public)
|
status = FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public)
|
||||||
returnTypeRef = buildResolvedTypeRef {
|
returnTypeRef = buildResolvedTypeRef {
|
||||||
@@ -152,7 +152,7 @@ private fun fillAnnotationArgumentMapping(
|
|||||||
?.declarations
|
?.declarations
|
||||||
?.firstIsInstanceOrNull<FirConstructor>()
|
?.firstIsInstanceOrNull<FirConstructor>()
|
||||||
annotationArguments.associateTo(destination) { argument ->
|
annotationArguments.associateTo(destination) { argument ->
|
||||||
val name = argument.name ?: JavaSymbolProvider.VALUE_METHOD_NAME
|
val name = argument.name ?: JavaClassConverter.VALUE_METHOD_NAME
|
||||||
val parameter = annotationConstructor?.valueParameters?.find { it.name == name }
|
val parameter = annotationConstructor?.valueParameters?.find { it.name == name }
|
||||||
name to argument.toFirExpression(session, javaTypeParameterStack, parameter?.returnTypeRef)
|
name to argument.toFirExpression(session, javaTypeParameterStack, parameter?.returnTypeRef)
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-9
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
|||||||
import org.jetbrains.kotlin.fir.declarations.getDeprecationInfos
|
import org.jetbrains.kotlin.fir.declarations.getDeprecationInfos
|
||||||
import org.jetbrains.kotlin.fir.deserialization.*
|
import org.jetbrains.kotlin.fir.deserialization.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
|
import org.jetbrains.kotlin.fir.java.JavaClassConverter
|
||||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||||
@@ -31,8 +31,11 @@ import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErr
|
|||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.nio.file.Paths
|
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.
|
||||||
@ThreadSafeMutableState
|
@ThreadSafeMutableState
|
||||||
open class KotlinDeserializedJvmSymbolsProvider(
|
class KotlinDeserializedJvmSymbolsProvider(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
moduleDataProvider: ModuleDataProvider,
|
moduleDataProvider: ModuleDataProvider,
|
||||||
kotlinScopeProvider: FirKotlinScopeProvider,
|
kotlinScopeProvider: FirKotlinScopeProvider,
|
||||||
@@ -40,13 +43,13 @@ open class KotlinDeserializedJvmSymbolsProvider(
|
|||||||
private val kotlinClassFinder: KotlinClassFinder,
|
private val kotlinClassFinder: KotlinClassFinder,
|
||||||
javaClassFinder: JavaClassFinder
|
javaClassFinder: JavaClassFinder
|
||||||
) : AbstractFirDeserializedSymbolsProvider(session, moduleDataProvider, kotlinScopeProvider) {
|
) : AbstractFirDeserializedSymbolsProvider(session, moduleDataProvider, kotlinScopeProvider) {
|
||||||
private val javaSymbolProvider = JavaSymbolProvider(session, moduleDataProvider.allModuleData.last(), javaClassFinder)
|
private val javaClassConverter = JavaClassConverter(session, moduleDataProvider.allModuleData.last(), javaClassFinder)
|
||||||
private val annotationsLoader = AnnotationsLoader(session, kotlinClassFinder)
|
private val annotationsLoader = AnnotationsLoader(session, kotlinClassFinder)
|
||||||
|
|
||||||
override fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData> {
|
override fun computePackagePartsInfos(packageFqName: FqName): List<PackagePartsCacheData> {
|
||||||
return packagePartProvider.findPackageParts(packageFqName.asString()).mapNotNull { partName ->
|
return packagePartProvider.findPackageParts(packageFqName.asString()).mapNotNull { partName ->
|
||||||
val classId = ClassId.topLevel(JvmClassName.byInternalName(partName).fqNameForTopLevelClassMaybeWithDollars)
|
val classId = ClassId.topLevel(JvmClassName.byInternalName(partName).fqNameForTopLevelClassMaybeWithDollars)
|
||||||
if (!javaSymbolProvider.hasTopLevelClassOf(classId)) return@mapNotNull null
|
if (!javaClassConverter.hasTopLevelClassOf(classId)) return@mapNotNull null
|
||||||
val (kotlinJvmBinaryClass, byteContent) =
|
val (kotlinJvmBinaryClass, byteContent) =
|
||||||
kotlinClassFinder.findKotlinClassOrContent(classId) as? KotlinClassFinder.Result.KotlinClass ?: return@mapNotNull null
|
kotlinClassFinder.findKotlinClassOrContent(classId) as? KotlinClassFinder.Result.KotlinClass ?: return@mapNotNull null
|
||||||
|
|
||||||
@@ -89,10 +92,12 @@ open class KotlinDeserializedJvmSymbolsProvider(
|
|||||||
get() = classHeader.isPreRelease
|
get() = classHeader.isPreRelease
|
||||||
|
|
||||||
override fun shouldLoadParentsFirst(classId: ClassId): Boolean =
|
override fun shouldLoadParentsFirst(classId: ClassId): Boolean =
|
||||||
javaSymbolProvider.hasTopLevelClassOf(classId)
|
javaClassConverter.hasTopLevelClassOf(classId)
|
||||||
|
|
||||||
override fun extractClassMetadata(classId: ClassId, parentContext: FirDeserializationContext?): ClassMetadataFindResult? {
|
override fun extractClassMetadata(classId: ClassId, parentContext: FirDeserializationContext?): ClassMetadataFindResult? {
|
||||||
if (!javaSymbolProvider.hasTopLevelClassOf(classId)) return null
|
// Kotlin classes are annotated Java classes, so this check also looks for them.
|
||||||
|
if (!javaClassConverter.hasTopLevelClassOf(classId)) return null
|
||||||
|
|
||||||
val result = try {
|
val result = try {
|
||||||
kotlinClassFinder.findKotlinClassOrContent(classId)
|
kotlinClassFinder.findKotlinClassOrContent(classId)
|
||||||
} catch (e: ProcessCanceledException) {
|
} catch (e: ProcessCanceledException) {
|
||||||
@@ -102,12 +107,12 @@ open class KotlinDeserializedJvmSymbolsProvider(
|
|||||||
is KotlinClassFinder.Result.KotlinClass -> result
|
is KotlinClassFinder.Result.KotlinClass -> result
|
||||||
is KotlinClassFinder.Result.ClassFileContent -> {
|
is KotlinClassFinder.Result.ClassFileContent -> {
|
||||||
val javaClass = try {
|
val javaClass = try {
|
||||||
javaSymbolProvider.findClass(classId, result.content) ?: return null
|
javaClassConverter.findClass(classId, result.content) ?: return null
|
||||||
} catch (e: ProcessCanceledException) {
|
} catch (e: ProcessCanceledException) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
return ClassMetadataFindResult.NoMetadata { symbol ->
|
return ClassMetadataFindResult.NoMetadata { symbol ->
|
||||||
javaSymbolProvider.convertJavaClassToFir(symbol, classId.outerClassId?.let(::getClass), javaClass)
|
javaClassConverter.convertJavaClassToFir(symbol, classId.outerClassId?.let(::getClass), javaClass)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
null -> return ClassMetadataFindResult.ShouldDeserializeViaParent
|
null -> return ClassMetadataFindResult.ShouldDeserializeViaParent
|
||||||
@@ -130,7 +135,7 @@ open class KotlinDeserializedJvmSymbolsProvider(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getPackage(fqName: FqName): FqName? =
|
override fun getPackage(fqName: FqName): FqName? =
|
||||||
javaSymbolProvider.getPackage(fqName)
|
javaClassConverter.getPackage(fqName)
|
||||||
|
|
||||||
private fun loadAnnotationsFromClassFile(
|
private fun loadAnnotationsFromClassFile(
|
||||||
kotlinClass: KotlinClassFinder.Result.KotlinClass,
|
kotlinClass: KotlinClassFinder.Result.KotlinClass,
|
||||||
|
|||||||
Reference in New Issue
Block a user