Avoid recomputing ClassData in DeserializedDescriptorResolver
This commit is contained in:
+1
-4
@@ -58,10 +58,7 @@ public final class DeserializedDescriptorResolver {
|
|||||||
public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) {
|
public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) {
|
||||||
String[] data = readData(kotlinClass, CLASS);
|
String[] data = readData(kotlinClass, CLASS);
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
|
return context.getClassDeserializer().deserializeClass(JavaProtoBufUtil.readClassDataFrom(data));
|
||||||
NameResolver nameResolver = classData.getNameResolver();
|
|
||||||
ClassId classId = nameResolver.getClassId(classData.getClassProto().getFqName());
|
|
||||||
return context.getClassDeserializer().deserializeClass(classId);
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-3
@@ -24,8 +24,8 @@ import kotlin.properties.Delegates
|
|||||||
|
|
||||||
public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) {
|
public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) {
|
||||||
private val classes = storageManager.createMemoizedFunctionWithNullableValues {
|
private val classes = storageManager.createMemoizedFunctionWithNullableValues {
|
||||||
(classId: ClassId) ->
|
(key: ClassKey) ->
|
||||||
val classData = classDataFinder.findClassData(classId)
|
val classData = key.classData ?: classDataFinder.findClassData(key.classId)
|
||||||
if (classData != null) {
|
if (classData != null) {
|
||||||
DeserializedClassDescriptor(context, classData)
|
DeserializedClassDescriptor(context, classData)
|
||||||
}
|
}
|
||||||
@@ -36,5 +36,22 @@ public class ClassDeserializer(val storageManager: StorageManager, val classData
|
|||||||
|
|
||||||
var context: DeserializationGlobalContext by Delegates.notNull()
|
var context: DeserializationGlobalContext by Delegates.notNull()
|
||||||
|
|
||||||
public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(classId)
|
public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(ClassKey(classId, null))
|
||||||
|
|
||||||
|
//needed to avoid calling ClassDataFinder#findClassData() if it is already computed at call site
|
||||||
|
public fun deserializeClass(classData: ClassData): ClassDescriptor? = classes(ClassKey(classData.readId(), classData))
|
||||||
|
|
||||||
|
private inner class ClassKey(val classId: ClassId, val classData: ClassData?) {
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
return other is ClassKey && classId == other.classId
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return classId.hashCode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun ClassData.readId(): ClassId {
|
||||||
|
return getNameResolver().getClassId(getClassProto().getFqName())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user