Refactor: Introduce contexts in deserialization subsystem

Rewrite utilities to Kotlin and move them out of DescriptorDeserializer
Include DescriptorDeserializer into context
Use new context in injectors
Drop Deserializers abstraction
This commit is contained in:
Pavel V. Talanov
2014-06-16 17:32:47 +04:00
parent 0332353874
commit b9b0bba7a0
26 changed files with 498 additions and 592 deletions
@@ -90,7 +90,7 @@ public class JetFromJavaDescriptorHelper {
public static ClassKind getCompiledClassKind(@NotNull PsiClass psiClass) {
ClassData classData = getClassData(psiClass);
if (classData == null) return null;
return DescriptorDeserializer.classKind(Flags.CLASS_KIND.get(classData.getClassProto().getFlags()));
return SerializationPackage.classKind(Flags.CLASS_KIND.get(classData.getClassProto().getFlags()));
}
@@ -40,11 +40,11 @@ import org.jetbrains.jet.lang.resolve.java.PackageClassUtils
import com.intellij.openapi.diagnostic.Logger
import org.jetbrains.jet.lang.resolve.kotlin.KotlinClassFinder
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializers
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorDeserializer
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext
public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler {
val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile)
@@ -68,12 +68,9 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
return Collections.emptyList()
}
val membersScope = DeserializedPackageMemberScope(
storageManager,
createDummyPackageFragment(packageFqName),
deserializers,
MemberFilter.ALWAYS_TRUE,
descriptorFinder,
JavaProtoBufUtil.readPackageDataFrom(annotationData)
JavaProtoBufUtil.readPackageDataFrom(annotationData),
deserializationContext
)
return membersScope.getAllDescriptors()
}
@@ -132,12 +129,6 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
constantDeserializer.setStorage(deserializerStorage)
}
private val deserializers = DescriptorDeserializers();
{
deserializers.setAnnotationDescriptorDeserializer(annotationDeserializer)
deserializers.setConstantDescriptorDeserializer(constantDeserializer)
}
private val descriptorFinder = object : DescriptorFinder {
override fun findClass(classId: ClassId): ClassDescriptor? {
return classes(classId)
@@ -158,6 +149,9 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
}
}
val deserializationContext = DeserializationGlobalContext(storageManager, descriptorFinder, annotationDeserializer,
constantDeserializer, packageFragmentProvider, MemberFilter.ALWAYS_TRUE)
private fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor {
return MutablePackageFragmentDescriptor(ErrorUtils.getErrorModule(), fqName)
}
@@ -184,8 +178,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
LOG.error("Annotation data missing for ${kotlinClass.getClassName()}")
}
val classData = JavaProtoBufUtil.readClassDataFrom(data!!)
return DeserializedClassDescriptor(storageManager, deserializers, descriptorFinder, packageFragmentProvider,
classData.getNameResolver(), classData.getClassProto())
return DeserializedClassDescriptor(deserializationContext, classData)
}
// we need a "magic" way to obtain ClassId from FqName