Drop "toClassId" in DeserializerForDecompiler

This commit is contained in:
Alexander Udalov
2014-09-15 14:01:10 +04:00
parent 7595e32bb6
commit 04ff45dee3
@@ -21,23 +21,16 @@ import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.lang.descriptors.* import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor
import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass import org.jetbrains.jet.lang.resolve.kotlin.*
import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.storage.LockBasedStorageManager import org.jetbrains.jet.storage.LockBasedStorageManager
import java.util.Collections import java.util.Collections
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.jet.lang.resolve.kotlin.KotlinBinaryClassCache
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader
import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils import org.jetbrains.jet.lang.resolve.java.PackageClassUtils
import com.intellij.openapi.diagnostic.Logger 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.DescriptorLoadersStorage
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext
import org.jetbrains.jet.lang.PlatformToKotlinClassMap import org.jetbrains.jet.lang.PlatformToKotlinClassMap
@@ -78,7 +71,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
} }
private val localClassFinder = object : KotlinClassFinder { private val localClassFinder = object : KotlinClassFinder {
override fun findKotlinClass(javaClass: JavaClass) = findKotlinClass(javaClass.getFqName()!!.toClassId()) override fun findKotlinClass(javaClass: JavaClass) = findKotlinClass(javaClass.classId)
override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? { override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? {
if (classId.getPackageFqName() != directoryPackageFqName) { if (classId.getPackageFqName() != directoryPackageFqName) {
@@ -158,21 +151,11 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
return MutablePackageFragmentDescriptor(moduleDescriptor, fqName) return MutablePackageFragmentDescriptor(moduleDescriptor, fqName)
} }
// we need a "magic" way to obtain ClassId from FqName private val JavaClass.classId: ClassId
// the idea behind this function is that we need accurate class ids only for "neighbouring" classes (inner classes, class object, etc) get() {
// for all others we can build any ClassId since it will resolve to MissingDependencyErrorClassDescriptor which only stores fqName val outer = getOuterClass()
private fun FqName.toClassId(): ClassId { return if (outer == null) ClassId.topLevel(getFqName()!!) else outer.classId.createNestedClassId(getName())
val segments = pathSegments()
val packageSegmentsCount = directoryPackageFqName.pathSegments().size
if (segments.size <= packageSegmentsCount) {
return ClassId.topLevel(this)
} }
val packageFqName = FqName.fromSegments(segments.subList(0, packageSegmentsCount) map { it.asString() })
if (packageFqName == directoryPackageFqName) {
return ClassId(packageFqName, FqNameUnsafe.fromSegments(segments.subList(packageSegmentsCount, segments.size)))
}
return ClassId.topLevel(this)
}
class object { class object {
private val LOG = Logger.getInstance(javaClass<DeserializerForDecompiler>()) private val LOG = Logger.getInstance(javaClass<DeserializerForDecompiler>())