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) {
|
||||
String[] data = readData(kotlinClass, CLASS);
|
||||
if (data != null) {
|
||||
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
|
||||
NameResolver nameResolver = classData.getNameResolver();
|
||||
ClassId classId = nameResolver.getClassId(classData.getClassProto().getFqName());
|
||||
return context.getClassDeserializer().deserializeClass(classId);
|
||||
return context.getClassDeserializer().deserializeClass(JavaProtoBufUtil.readClassDataFrom(data));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
+20
-3
@@ -24,8 +24,8 @@ import kotlin.properties.Delegates
|
||||
|
||||
public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) {
|
||||
private val classes = storageManager.createMemoizedFunctionWithNullableValues {
|
||||
(classId: ClassId) ->
|
||||
val classData = classDataFinder.findClassData(classId)
|
||||
(key: ClassKey) ->
|
||||
val classData = key.classData ?: classDataFinder.findClassData(key.classId)
|
||||
if (classData != null) {
|
||||
DeserializedClassDescriptor(context, classData)
|
||||
}
|
||||
@@ -36,5 +36,22 @@ public class ClassDeserializer(val storageManager: StorageManager, val classData
|
||||
|
||||
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