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:
+4
-4
@@ -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);
|
||||
|
||||
+4
-4
@@ -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();
|
||||
|
||||
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
|
||||
+2
-2
@@ -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)
|
||||
+1
-11
@@ -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());
|
||||
|
||||
+12
-5
@@ -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> {
|
||||
+8
-15
@@ -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) {
|
||||
|
||||
+2
-2
@@ -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
|
||||
+13
-2
@@ -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)
|
||||
}
|
||||
+13
-9
@@ -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)
|
||||
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user