Refactor: DescriptorFinder -> ClassDataFinder

Deserialization subsystem only need to know about the way to obtain class data, it can construct descriptors itself (no need to call DeserializedClassDescriptor constructor from other modules)
This commit is contained in:
Pavel V. Talanov
2014-06-16 15:00:57 +04:00
parent 53337f793b
commit 0c8956a36e
14 changed files with 77 additions and 82 deletions
@@ -34,7 +34,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava;
import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder;
import org.jetbrains.jet.lang.resolve.kotlin.JavaClassDataFinder;
import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
@@ -63,7 +63,7 @@ public class InjectorForJavaDescriptorResolver {
private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver;
private final DeserializationGlobalContextForJava deserializationGlobalContextForJava;
private final JavaDescriptorFinder javaDescriptorFinder;
private final JavaClassDataFinder javaClassDataFinder;
private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage;
private final ConstantDescriptorLoader constantDescriptorLoader;
@@ -89,10 +89,10 @@ public class InjectorForJavaDescriptorResolver {
this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, javaPropertyInitializerEvaluator);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule());
this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
this.constantDescriptorLoader = new ConstantDescriptorLoader();
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, getModule(), javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, getModule(), javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager);
this.javaClassFinder.setProject(project);
@@ -56,7 +56,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava;
import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder;
import org.jetbrains.jet.lang.resolve.kotlin.JavaClassDataFinder;
import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
@@ -107,7 +107,7 @@ public class InjectorForLazyResolveWithJava {
private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver;
private final DeserializationGlobalContextForJava deserializationGlobalContextForJava;
private final JavaDescriptorFinder javaDescriptorFinder;
private final JavaClassDataFinder javaClassDataFinder;
private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage;
private final ConstantDescriptorLoader constantDescriptorLoader;
@@ -157,10 +157,10 @@ public class InjectorForLazyResolveWithJava {
this.jetImportsFactory = new JetImportsFactory();
this.scopeProvider = new ScopeProvider(getResolveSession());
this.scriptBodyResolver = new ScriptBodyResolver();
this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
this.constantDescriptorLoader = new ConstantDescriptorLoader();
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, getModule(), javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, getModule(), javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager);
this.resolveSession.setAnnotationResolve(annotationResolver);
@@ -66,7 +66,7 @@ import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder;
import org.jetbrains.jet.lang.resolve.kotlin.JavaClassDataFinder;
import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
@@ -127,7 +127,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider;
private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver;
private final JavaDescriptorFinder javaDescriptorFinder;
private final JavaClassDataFinder javaClassDataFinder;
private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage;
private final ConstantDescriptorLoader constantDescriptorLoader;
@@ -159,10 +159,10 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.globalJavaResolverContext = new GlobalJavaResolverContext(storageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, javaPropertyInitializerEvaluator);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModuleDescriptor());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModuleDescriptor());
this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.javaClassDataFinder = new JavaClassDataFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
this.constantDescriptorLoader = new ConstantDescriptorLoader();
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(storageManager, getModuleDescriptor(), javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(storageManager, getModuleDescriptor(), javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.bodyResolver = new BodyResolver();
this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver();
@@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptorImpl
import org.jetbrains.jet.lang.resolve.scopes.JetScope
import org.jetbrains.jet.storage.StorageManager
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver
import org.jetbrains.jet.descriptors.serialization.ClassId
@@ -98,7 +98,7 @@ public class LazyJavaPackageFragmentProvider(
override fun getSubPackagesOf(fqName: FqName) = getPackageFragment(fqName)?.getMemberScope()?.getSubPackages().orEmpty()
fun resolveKotlinBinaryClass(kotlinClass: KotlinJvmBinaryClass) = c.deserializedDescriptorResolver.resolveClassCached(kotlinClass)
fun resolveKotlinBinaryClass(kotlinClass: KotlinJvmBinaryClass) = c.deserializedDescriptorResolver.resolveClass(kotlinClass)
fun getClass(javaClass: JavaClass): ClassDescriptor? = c.javaClassResolver.resolveClass(javaClass)
@@ -25,9 +25,9 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
public class DeserializationGlobalContextForJava(
storageManager: StorageManager,
moduleDescriptor: ModuleDescriptor,
descriptorFinder: JavaDescriptorFinder,
classDataFinder: JavaClassDataFinder,
annotationLoader: AnnotationDescriptorLoader,
constantLoader: ConstantDescriptorLoader,
packageFragmentProvider: LazyJavaPackageFragmentProvider
) : DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
) : DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider)
@@ -22,7 +22,6 @@ import org.jetbrains.jet.descriptors.serialization.ClassData;
import org.jetbrains.jet.descriptors.serialization.ClassId;
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil;
import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
@@ -52,15 +51,6 @@ public final class DeserializedDescriptorResolver {
@Nullable
public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) {
String[] data = readData(kotlinClass, CLASS);
if (data != null) {
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
return new DeserializedClassDescriptor(context, classData);
}
return null;
}
@Nullable
public ClassDescriptor resolveClassCached(@NotNull KotlinJvmBinaryClass kotlinClass) {
String[] data = readData(kotlinClass, CLASS);
if (data != null) {
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
@@ -81,7 +71,7 @@ public final class DeserializedDescriptorResolver {
}
@Nullable
private String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) {
public String[] readData(@NotNull KotlinJvmBinaryClass kotlinClass, @NotNull KotlinClassHeader.Kind expectedKind) {
KotlinClassHeader header = kotlinClass.getClassHeader();
if (header.getKind() == KotlinClassHeader.Kind.INCOMPATIBLE_ABI_VERSION) {
errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.getVersion());
@@ -17,7 +17,7 @@
package org.jetbrains.jet.lang.resolve.kotlin
import org.jetbrains.jet.descriptors.serialization.ClassId
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider
import org.jetbrains.jet.lang.resolve.name.FqName
@@ -26,17 +26,24 @@ import org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqN
import java.util.Collections
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider
import org.jetbrains.jet.descriptors.serialization.ClassData
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader
public class JavaDescriptorFinder(
//TODO: correct dependencies
public class JavaClassDataFinder(
private val javaDescriptorResolver: JavaDescriptorResolver,
private val javaPackageFragmentProvider: JavaPackageFragmentProvider
) : DescriptorFinder {
) : ClassDataFinder {
override fun findClass(classId: ClassId): ClassDescriptor? {
override fun findClassData(classId: ClassId): ClassData? {
val lazyJavaPackageFragmentProvider = javaDescriptorResolver.getPackageFragmentProvider() as LazyJavaPackageFragmentProvider
val c = lazyJavaPackageFragmentProvider.c
val kotlinJvmBinaryClass = c.kotlinClassFinder.findKotlinClass(kotlinFqNameToJavaFqName(classId.asSingleFqName())) ?: return null
return c.deserializedDescriptorResolver.resolveClass(kotlinJvmBinaryClass)
val deserializedDescriptorResolver = c.deserializedDescriptorResolver
val data = deserializedDescriptorResolver.readData(kotlinJvmBinaryClass, KotlinClassHeader.Kind.CLASS) ?: return null
return JavaProtoBufUtil.readClassDataFrom(data)
}
override fun getClassNames(packageName: FqName): Collection<Name> {
@@ -41,7 +41,6 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
private final DeserializedPackageMemberScope members;
private final NameResolver nameResolver;
private final PackageFragmentProvider packageFragmentProvider;
private final DeserializationContext deserializationContext;
public BuiltinsPackageFragment(@NotNull StorageManager storageManager, @NotNull ModuleDescriptor module) {
super(module, KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME);
@@ -49,12 +48,12 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
packageFragmentProvider = new BuiltinsPackageFragmentProvider();
BuiltInsDescriptorFinder descriptorFinder = new BuiltInsDescriptorFinder(storageManager);
deserializationContext = new DeserializationContext(
storageManager, module, descriptorFinder,
BuiltInsClassDataFinder builtInsClassDataFinder = new BuiltInsClassDataFinder(storageManager);
DeserializationContext deserializationContext = new DeserializationContext(
storageManager, module, builtInsClassDataFinder,
// TODO: support annotations
AnnotationLoader.UNSUPPORTED, ConstantLoader.UNSUPPORTED, packageFragmentProvider,
new ClassDeserializer(storageManager, descriptorFinder), nameResolver
new ClassDeserializer(storageManager, builtInsClassDataFinder), nameResolver
);
members = new DeserializedPackageMemberScope(this, loadPackage(), deserializationContext);
}
@@ -116,10 +115,10 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
}
}
private class BuiltInsDescriptorFinder implements DescriptorFinder {
private class BuiltInsClassDataFinder implements ClassDataFinder {
private final NotNullLazyValue<Collection<Name>> classNames;
public BuiltInsDescriptorFinder(@NotNull StorageManager storageManager) {
public BuiltInsClassDataFinder(@NotNull StorageManager storageManager) {
// TODO: support annotations
classNames = storageManager.createLazyValue(new Function0<Collection<Name>>() {
@Override
@@ -149,7 +148,8 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
}
@Nullable
private ClassData getClassData(@NotNull ClassId classId) {
@Override
public ClassData findClassData(@NotNull ClassId classId) {
InputStream stream = getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId));
if (stream == null) {
return null;
@@ -173,13 +173,6 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
}
}
@Nullable
@Override
public ClassDescriptor findClass(@NotNull ClassId classId) {
ClassData classData = getClassData(classId);
return classData == null ? null : new DeserializedClassDescriptor(deserializationContext, classData);
}
@NotNull
@Override
public Collection<Name> getClassNames(@NotNull FqName packageName) {
@@ -26,9 +26,9 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collection;
import java.util.Collections;
public interface DescriptorFinder {
public interface ClassDataFinder {
@Nullable
ClassDescriptor findClass(@NotNull ClassId classId);
ClassData findClassData(@NotNull ClassId classId);
@ReadOnly
@NotNull
@@ -18,12 +18,23 @@ package org.jetbrains.jet.descriptors.serialization
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.storage.StorageManager
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext
import kotlin.properties.Delegates
public class ClassDeserializer(val storageManager: StorageManager, val descriptorFinder: DescriptorFinder) {
public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) {
private val classes = storageManager.createMemoizedFunctionWithNullableValues {
(classId: ClassId) ->
descriptorFinder.findClass(classId)
val classData = classDataFinder.findClassData(classId)
if (classData != null) {
DeserializedClassDescriptor(context, classData)
}
else {
null
}
}
var context: DeserializationGlobalContext by Delegates.notNull()
public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(classId)
}
@@ -19,7 +19,7 @@ package org.jetbrains.jet.descriptors.serialization.context
import org.jetbrains.jet.storage.StorageManager
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader
import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
import org.jetbrains.jet.descriptors.serialization.NameResolver
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.descriptors.serialization.TypeDeserializer
@@ -36,14 +36,18 @@ import org.jetbrains.jet.descriptors.serialization.ClassDeserializer
public open class DeserializationGlobalContext(
public val storageManager: StorageManager,
public val moduleDescriptor: ModuleDescriptor,
public val descriptorFinder: DescriptorFinder,
public val classDataFinder: ClassDataFinder,
public val annotationLoader: AnnotationLoader,
public val constantLoader: ConstantLoader,
public val packageFragmentProvider: PackageFragmentProvider,
public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager, descriptorFinder)
public val classDeserializer: ClassDeserializer = ClassDeserializer(storageManager, classDataFinder)
) {
{
classDeserializer.context = this
}
public fun withNameResolver(nameResolver: NameResolver): DeserializationContext {
return DeserializationContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
return DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider, classDeserializer, nameResolver)
}
}
@@ -52,13 +56,13 @@ public open class DeserializationGlobalContext(
public open class DeserializationContext(
storageManager: StorageManager,
moduleDescriptor: ModuleDescriptor,
descriptorFinder: DescriptorFinder,
classDataFinder: ClassDataFinder,
annotationLoader: AnnotationLoader,
constantLoader: ConstantLoader,
packageFragmentProvider: PackageFragmentProvider,
classDeserializer: ClassDeserializer,
public val nameResolver: NameResolver
) : DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
) : DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider, classDeserializer) {
fun withTypes(containingDeclaration: DeclarationDescriptor): DeserializationContextWithTypes {
val typeDeserializer = TypeDeserializer(this, null, "Deserializer for ${containingDeclaration.getName()}",
@@ -67,7 +71,7 @@ public open class DeserializationContext(
}
fun withTypes(containingDeclaration: DeclarationDescriptor, typeDeserializer: TypeDeserializer): DeserializationContextWithTypes {
return DeserializationContextWithTypes(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
return DeserializationContextWithTypes(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider, classDeserializer,
nameResolver, containingDeclaration, typeDeserializer)
}
@@ -78,7 +82,7 @@ public open class DeserializationContext(
class DeserializationContextWithTypes(
storageManager: StorageManager,
moduleDescriptor: ModuleDescriptor,
descriptorFinder: DescriptorFinder,
classDataFinder: ClassDataFinder,
annotationLoader: AnnotationLoader,
constantLoader: ConstantLoader,
packageFragmentProvider: PackageFragmentProvider,
@@ -86,7 +90,7 @@ class DeserializationContextWithTypes(
nameResolver: NameResolver,
val containingDeclaration: DeclarationDescriptor,
val typeDeserializer: TypeDeserializer
) : DeserializationContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
) : DeserializationContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider, classDeserializer, nameResolver) {
val deserializer: MemberDeserializer = MemberDeserializer(this)
@@ -64,7 +64,7 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
@Override
protected void addAllClassDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
for (Name className : context.getDescriptorFinder().getClassNames(packageFqName)) {
for (Name className : context.getClassDataFinder().getClassNames(packageFqName)) {
ClassDescriptor classDescriptor = getClassDescriptor(className);
if (classDescriptor != null) {
@@ -17,9 +17,8 @@
package org.jetbrains.jet.plugin.libraries
import org.jetbrains.jet.descriptors.serialization.ClassId
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.descriptors.impl.MutablePackageFragmentDescriptor
import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass
@@ -43,7 +42,7 @@ import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext
import org.jetbrains.jet.lang.PlatformToKotlinClassMap
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.types.ErrorUtils
import org.jetbrains.jet.descriptors.serialization.ClassData
public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler {
val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile)
@@ -117,9 +116,15 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
constantLoader.setStorage(deserializerStorage)
}
private val descriptorFinder = object : DescriptorFinder {
override fun findClass(classId: ClassId): ClassDescriptor? {
return resolveClassByClassId(classId)
private val classDataFinder = object : ClassDataFinder {
override fun findClassData(classId: ClassId): ClassData? {
val binaryClass = localClassFinder.findKotlinClass(classId) ?: return null
val data = binaryClass.getClassHeader().annotationData
if (data == null) {
LOG.error("Annotation data missing for ${binaryClass.getClassName()}")
return null
}
return JavaProtoBufUtil.readClassDataFrom(data)
}
override fun getClassNames(packageName: FqName): Collection<Name> {
@@ -143,27 +148,13 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
moduleDescriptor.addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider)
moduleDescriptor.addFragmentProvider(DependencyKind.BINARIES, PackageFragmentProviderForMissingDependencies(moduleDescriptor))
}
val deserializationContext = DeserializationGlobalContext(storageManager, moduleDescriptor, descriptorFinder, annotationLoader,
val deserializationContext = DeserializationGlobalContext(storageManager, moduleDescriptor, classDataFinder, annotationLoader,
constantLoader, packageFragmentProvider)
private fun createDummyPackageFragment(fqName: FqName): MutablePackageFragmentDescriptor {
return MutablePackageFragmentDescriptor(moduleDescriptor, fqName)
}
private fun resolveClassByClassId(classId: ClassId): ClassDescriptor? {
val binaryClass = localClassFinder.findKotlinClass(classId) ?: return null
return deserializeBinaryClass(binaryClass)
}
private fun deserializeBinaryClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor {
val data = kotlinClass.getClassHeader().annotationData
if (data == null) {
LOG.error("Annotation data missing for ${kotlinClass.getClassName()}")
}
val classData = JavaProtoBufUtil.readClassDataFrom(data!!)
return DeserializedClassDescriptor(deserializationContext, classData)
}
// we need a "magic" way to obtain ClassId from FqName
// the idea behind this function is that we need accurate class ids only for "neighbouring" classes (inner classes, class object, etc)
// for all others we can build any ClassId since it will resolve to MissingDependencyErrorClassDescriptor which only stores fqName