Do not call findKotlinClass when loading class annotations
The main change is in AbstractBinaryClassAnnotationAndConstantLoader, where we no longer perform unnecessary IO operations for classes which are already loaded to memory
This commit is contained in:
+20
-14
@@ -38,8 +38,7 @@ import java.util.*
|
||||
|
||||
abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any, T : Any>(
|
||||
storageManager: StorageManager,
|
||||
private val kotlinClassFinder: KotlinClassFinder,
|
||||
private val errorReporter: ErrorReporter
|
||||
private val kotlinClassFinder: KotlinClassFinder
|
||||
) : AnnotationAndConstantLoader<A, C, T> {
|
||||
private val storage = storageManager.createMemoizedFunction<KotlinJvmBinaryClass, Storage<A, C>> {
|
||||
kotlinClass ->
|
||||
@@ -66,14 +65,11 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
|
||||
return loadAnnotation(annotationClassId, source, result)
|
||||
}
|
||||
|
||||
private fun ProtoContainer.Class.toBinaryClass(): KotlinJvmBinaryClass? =
|
||||
(source as? KotlinJvmBinarySourceElement)?.binaryClass
|
||||
|
||||
override fun loadClassAnnotations(container: ProtoContainer.Class): List<A> {
|
||||
val kotlinClass = kotlinClassFinder.findKotlinClass(container.classId)
|
||||
if (kotlinClass == null) {
|
||||
// This means that the resource we're constructing the descriptor from is no longer present: KotlinClassFinder had found the
|
||||
// class earlier, but it can't now
|
||||
errorReporter.reportLoadingError("Kotlin class for loading class annotations is not found: ${container.debugFqName()}", null)
|
||||
return listOf()
|
||||
}
|
||||
val kotlinClass = container.toBinaryClass() ?: error("Class for loading annotations is not found: ${container.debugFqName()}")
|
||||
|
||||
val result = ArrayList<A>(1)
|
||||
|
||||
@@ -208,18 +204,28 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
|
||||
private fun findClassWithAnnotationsAndInitializers(
|
||||
container: ProtoContainer, implClassName: ClassId?, field: Boolean
|
||||
): KotlinJvmBinaryClass? {
|
||||
if (implClassName != null) {
|
||||
return kotlinClassFinder.findKotlinClass(implClassName)
|
||||
}
|
||||
|
||||
if (container is ProtoContainer.Class) {
|
||||
val containerBinaryClass = container.toBinaryClass()
|
||||
|
||||
if (implClassName == container.classId) {
|
||||
return containerBinaryClass
|
||||
}
|
||||
|
||||
if (implClassName != null) {
|
||||
return kotlinClassFinder.findKotlinClass(implClassName)
|
||||
}
|
||||
|
||||
if (field && container.kind == ProtoBuf.Class.Kind.COMPANION_OBJECT &&
|
||||
(container.outerClassKind == ClassKind.CLASS || container.outerClassKind == ClassKind.ENUM_CLASS)) {
|
||||
// Backing fields of properties of a companion object in a class are generated in the outer class
|
||||
return kotlinClassFinder.findKotlinClass(container.classId.outerClassId)
|
||||
}
|
||||
|
||||
return kotlinClassFinder.findKotlinClass(container.classId)
|
||||
return containerBinaryClass
|
||||
}
|
||||
|
||||
if (implClassName != null) {
|
||||
return kotlinClassFinder.findKotlinClass(implClassName)
|
||||
}
|
||||
|
||||
return null
|
||||
|
||||
+6
-4
@@ -30,7 +30,10 @@ import org.jetbrains.kotlin.resolve.constants.AnnotationValue
|
||||
import org.jetbrains.kotlin.resolve.constants.ConstantValue
|
||||
import org.jetbrains.kotlin.resolve.constants.ConstantValueFactory
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||
import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NotFoundClasses
|
||||
import org.jetbrains.kotlin.serialization.deserialization.findNonGenericClassAcrossDependencies
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
import java.util.*
|
||||
|
||||
@@ -38,10 +41,9 @@ class BinaryClassAnnotationAndConstantLoaderImpl(
|
||||
private val module: ModuleDescriptor,
|
||||
private val notFoundClasses: NotFoundClasses,
|
||||
storageManager: StorageManager,
|
||||
kotlinClassFinder: KotlinClassFinder,
|
||||
errorReporter: ErrorReporter
|
||||
kotlinClassFinder: KotlinClassFinder
|
||||
) : AbstractBinaryClassAnnotationAndConstantLoader<AnnotationDescriptor, ConstantValue<*>, AnnotationWithTarget>(
|
||||
storageManager, kotlinClassFinder, errorReporter
|
||||
storageManager, kotlinClassFinder
|
||||
) {
|
||||
private val annotationDeserializer = AnnotationDeserializer(module, notFoundClasses)
|
||||
private val factory = ConstantValueFactory(module.builtIns)
|
||||
|
||||
+2
-1
@@ -18,8 +18,9 @@ package org.jetbrains.kotlin.load.kotlin
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||
import org.jetbrains.kotlin.descriptors.SourceFile
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.BinarySource
|
||||
|
||||
class KotlinJvmBinarySourceElement(val binaryClass: KotlinJvmBinaryClass) : SourceElement {
|
||||
class KotlinJvmBinarySourceElement(val binaryClass: KotlinJvmBinaryClass) : SourceElement, BinarySource {
|
||||
override fun toString() = javaClass.name + ": " + binaryClass.toString()
|
||||
override fun getContainingFile(): SourceFile = SourceFile.NO_SOURCE_FILE
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user