From 60662e5831a16422f84cd310c240b70a445ac388 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sun, 23 Nov 2014 17:06:10 +0300 Subject: [PATCH] Fix double laziness of annotations introduced in 149a90d --- .../di/InjectorForJavaDescriptorResolver.java | 2 +- .../di/InjectorForLazyResolveWithJava.java | 2 +- .../di/InjectorForTopDownAnalyzerForJvm.java | 2 +- .../kotlin/AnnotationDescriptorLoader.java | 64 +++++++------------ .../serialization/MemberDeserializer.kt | 16 +++-- .../descriptors/AnnotationLoader.java | 18 +++--- .../descriptors}/DeserializedAnnotations.kt | 8 +-- .../DeserializedClassDescriptor.kt | 17 +++-- .../textBuilder/DeserializerForDecompiler.kt | 4 +- 9 files changed, 60 insertions(+), 73 deletions(-) rename core/{descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin => serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors}/DeserializedAnnotations.kt (96%) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java index 226dbedc712..2008d862816 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -103,7 +103,7 @@ public class InjectorForJavaDescriptorResolver { this.globalSearchScope = com.intellij.psi.search.GlobalSearchScope.allScope(project); this.javaClassDataFinder = new JavaClassDataFinder(virtualFileFinder, deserializedDescriptorResolver); this.descriptorLoadersStorage = new DescriptorLoadersStorage(lockBasedStorageManager, getModule()); - this.annotationDescriptorLoader = new AnnotationDescriptorLoader(lockBasedStorageManager, getModule(), descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); + this.annotationDescriptorLoader = new AnnotationDescriptorLoader(getModule(), descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); this.constantDescriptorLoader = new ConstantDescriptorLoader(descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); this.deserializationComponentsForJava = new DeserializationComponentsForJava(lockBasedStorageManager, getModule(), javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java index e2268006129..628cc321f84 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java @@ -192,7 +192,7 @@ public class InjectorForLazyResolveWithJava { this.scriptBodyResolver = new ScriptBodyResolver(); this.javaClassDataFinder = new JavaClassDataFinder(virtualFileFinder, deserializedDescriptorResolver); this.descriptorLoadersStorage = new DescriptorLoadersStorage(storageManager, module); - this.annotationDescriptorLoader = new AnnotationDescriptorLoader(storageManager, module, descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); + this.annotationDescriptorLoader = new AnnotationDescriptorLoader(module, descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); this.constantDescriptorLoader = new ConstantDescriptorLoader(descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); this.deserializationComponentsForJava = new DeserializationComponentsForJava(storageManager, module, javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 217be559deb..b807cff2e41 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -186,7 +186,7 @@ public class InjectorForTopDownAnalyzerForJvm { this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModuleDescriptor()); this.javaClassDataFinder = new JavaClassDataFinder(virtualFileFinder, deserializedDescriptorResolver); this.descriptorLoadersStorage = new DescriptorLoadersStorage(storageManager, getModuleDescriptor()); - this.annotationDescriptorLoader = new AnnotationDescriptorLoader(storageManager, getModuleDescriptor(), descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); + this.annotationDescriptorLoader = new AnnotationDescriptorLoader(getModuleDescriptor(), descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); this.constantDescriptorLoader = new ConstantDescriptorLoader(descriptorLoadersStorage, virtualFileFinder, traceBasedErrorReporter); this.deserializationComponentsForJava = new DeserializationComponentsForJava(storageManager, getModuleDescriptor(), javaClassDataFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider); this.additionalCheckerProvider = org.jetbrains.jet.lang.resolve.kotlin.JavaDeclarationCheckerProvider.INSTANCE$; diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorLoader.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorLoader.java index c8167041830..5e7e3adbdfb 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorLoader.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorLoader.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.lang.resolve.kotlin; -import kotlin.Function0; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf; @@ -28,7 +27,6 @@ import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptorImpl; -import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils; @@ -37,7 +35,6 @@ import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass.AnnotationArra import org.jetbrains.jet.lang.resolve.name.ClassId; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.ErrorUtils; -import org.jetbrains.jet.storage.StorageManager; import java.util.*; @@ -45,11 +42,9 @@ import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorLoadersStorage.Mem import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.javaClassIdToKotlinClassId; public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements AnnotationLoader { - private final StorageManager storageManager; private final ModuleDescriptor module; public AnnotationDescriptorLoader( - @NotNull StorageManager storageManager, @NotNull ModuleDescriptor module, @NotNull DescriptorLoadersStorage storage, @NotNull KotlinClassFinder kotlinClassFinder, @@ -57,40 +52,34 @@ public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements ) { super(kotlinClassFinder, errorReporter, storage); this.module = module; - this.storageManager = storageManager; } @NotNull @Override - public Annotations loadClassAnnotations(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class classProto) { - final KotlinJvmBinaryClass kotlinClass = findKotlinClassByDescriptor(descriptor); + public List loadClassAnnotations(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class classProto) { + KotlinJvmBinaryClass kotlinClass = findKotlinClassByDescriptor(descriptor); if (kotlinClass == null) { // This means that the resource we're constructing the descriptor from is no longer present: KotlinClassFinder had found the // class earlier, but it can't now errorReporter.reportLoadingError("Kotlin class for loading class annotations is not found: " + descriptor, null); - return Annotations.EMPTY; + return Collections.emptyList(); } - return new DeserializedAnnotations(storageManager, new Function0>() { + final List result = new ArrayList(1); + + kotlinClass.loadClassAnnotations(new KotlinJvmBinaryClass.AnnotationVisitor() { + @Nullable @Override - public List invoke() { - final List result = new ArrayList(1); + public KotlinJvmBinaryClass.AnnotationArgumentVisitor visitAnnotation(@NotNull ClassId classId) { + return resolveAnnotation(classId, result, module); + } - kotlinClass.loadClassAnnotations(new KotlinJvmBinaryClass.AnnotationVisitor() { - @Nullable - @Override - public KotlinJvmBinaryClass.AnnotationArgumentVisitor visitAnnotation(@NotNull ClassId classId) { - return resolveAnnotation(classId, result, module); - } - - @Override - public void visitEnd() { - } - }); - - return result; + @Override + public void visitEnd() { } }); + + return result; } @Nullable @@ -189,44 +178,39 @@ public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements @NotNull @Override - public Annotations loadCallableAnnotations( + public List loadCallableAnnotations( @NotNull ClassOrPackageFragmentDescriptor container, @NotNull ProtoBuf.Callable proto, @NotNull NameResolver nameResolver, @NotNull AnnotatedCallableKind kind ) { MemberSignature signature = getCallableSignature(proto, nameResolver, kind); - if (signature == null) return Annotations.EMPTY; + if (signature == null) return Collections.emptyList(); return findClassAndLoadMemberAnnotations(container, proto, nameResolver, kind, signature); } @NotNull - private Annotations findClassAndLoadMemberAnnotations( + private List findClassAndLoadMemberAnnotations( @NotNull ClassOrPackageFragmentDescriptor container, @NotNull ProtoBuf.Callable proto, @NotNull NameResolver nameResolver, @NotNull AnnotatedCallableKind kind, - @NotNull final MemberSignature signature + @NotNull MemberSignature signature ) { - final KotlinJvmBinaryClass kotlinClass = findClassWithAnnotationsAndInitializers(container, proto, nameResolver, kind); + KotlinJvmBinaryClass kotlinClass = findClassWithAnnotationsAndInitializers(container, proto, nameResolver, kind); if (kotlinClass == null) { errorReporter.reportLoadingError("Kotlin class for loading member annotations is not found: " + container, null); - return Annotations.EMPTY; + return Collections.emptyList(); } - return new DeserializedAnnotations(storageManager, new Function0>() { - @Override - public List invoke() { - List descriptors = storage.getStorageForClass(kotlinClass).getMemberAnnotations().get(signature); - return descriptors == null ? Collections.emptyList() : descriptors; - } - }); + List descriptors = storage.getStorageForClass(kotlinClass).getMemberAnnotations().get(signature); + return descriptors == null ? Collections.emptyList() : descriptors; } @NotNull @Override - public Annotations loadValueParameterAnnotations( + public List loadValueParameterAnnotations( @NotNull ClassOrPackageFragmentDescriptor container, @NotNull ProtoBuf.Callable callable, @NotNull NameResolver nameResolver, @@ -242,6 +226,6 @@ public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements } } - return Annotations.EMPTY; + return Collections.emptyList(); } } diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/MemberDeserializer.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/MemberDeserializer.kt index 0ffb7f0e41c..efab436d183 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/MemberDeserializer.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/MemberDeserializer.kt @@ -164,12 +164,14 @@ public class MemberDeserializer(private val context: DeserializationContext) { } private fun getAnnotations(proto: Callable, flags: Int, kind: AnnotatedCallableKind): Annotations { - return if (Flags.HAS_ANNOTATIONS.get(flags)) + if (!Flags.HAS_ANNOTATIONS.get(flags)) { + return Annotations.EMPTY + } + return DeserializedAnnotations(components.storageManager) { components.annotationLoader.loadCallableAnnotations( context.containingDeclaration.asClassOrPackage(), proto, context.nameResolver, kind ) - else - Annotations.EMPTY + } } private fun valueParameters(callable: Callable, kind: AnnotatedCallableKind): List { @@ -194,10 +196,12 @@ public class MemberDeserializer(private val context: DeserializationContext) { kind: AnnotatedCallableKind, valueParameter: Callable.ValueParameter ): Annotations { - return if (Flags.HAS_ANNOTATIONS.get(valueParameter.getFlags())) + if (!Flags.HAS_ANNOTATIONS.get(valueParameter.getFlags())) { + return Annotations.EMPTY + } + return DeserializedAnnotations(components.storageManager) { components.annotationLoader.loadValueParameterAnnotations(classOrPackage, callable, context.nameResolver, kind, valueParameter) - else - Annotations.EMPTY + } } private fun DeclarationDescriptor.asClassOrPackage(): ClassOrPackageFragmentDescriptor = diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationLoader.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationLoader.java index 6ca965b151f..91f8dc22151 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationLoader.java +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationLoader.java @@ -21,19 +21,21 @@ import org.jetbrains.jet.descriptors.serialization.NameResolver; import org.jetbrains.jet.descriptors.serialization.ProtoBuf; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor; -import org.jetbrains.jet.lang.descriptors.annotations.Annotations; +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; + +import java.util.List; public interface AnnotationLoader { AnnotationLoader UNSUPPORTED = new AnnotationLoader() { @NotNull @Override - public Annotations loadClassAnnotations(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class classProto) { + public List loadClassAnnotations(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class classProto) { return notSupported(); } @NotNull @Override - public Annotations loadCallableAnnotations( + public List loadCallableAnnotations( @NotNull ClassOrPackageFragmentDescriptor container, @NotNull ProtoBuf.Callable proto, @NotNull NameResolver nameResolver, @@ -44,7 +46,7 @@ public interface AnnotationLoader { @NotNull @Override - public Annotations loadValueParameterAnnotations( + public List loadValueParameterAnnotations( @NotNull ClassOrPackageFragmentDescriptor container, @NotNull ProtoBuf.Callable callable, @NotNull NameResolver nameResolver, @@ -55,16 +57,16 @@ public interface AnnotationLoader { } @NotNull - private Annotations notSupported() { + private List notSupported() { throw new UnsupportedOperationException("Annotations are not supported"); } }; @NotNull - Annotations loadClassAnnotations(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class classProto); + List loadClassAnnotations(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class classProto); @NotNull - Annotations loadCallableAnnotations( + List loadCallableAnnotations( @NotNull ClassOrPackageFragmentDescriptor container, @NotNull ProtoBuf.Callable proto, @NotNull NameResolver nameResolver, @@ -72,7 +74,7 @@ public interface AnnotationLoader { ); @NotNull - Annotations loadValueParameterAnnotations( + List loadValueParameterAnnotations( @NotNull ClassOrPackageFragmentDescriptor container, @NotNull ProtoBuf.Callable callable, @NotNull NameResolver nameResolver, diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedAnnotations.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedAnnotations.kt similarity index 96% rename from core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedAnnotations.kt rename to core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedAnnotations.kt index f7fbe4d39e9..62fb2a209a5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedAnnotations.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedAnnotations.kt @@ -14,15 +14,15 @@ * limitations under the License. */ -package org.jetbrains.jet.lang.resolve.kotlin +package org.jetbrains.jet.descriptors.serialization.descriptors +import org.jetbrains.jet.utils.toReadOnlyList +import org.jetbrains.jet.storage.StorageManager +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor import org.jetbrains.jet.lang.descriptors.annotations.Annotations import org.jetbrains.jet.lang.resolve.name.FqName -import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor -import org.jetbrains.jet.storage.StorageManager import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.resolve.DescriptorUtils -import org.jetbrains.jet.utils.toReadOnlyList class DeserializedAnnotations( storageManager: StorageManager, diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt index 2c1ee57c3f7..5567e5d5741 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.kt @@ -63,10 +63,16 @@ public class DeserializedClassDescriptor( private val enumEntries = EnumEntryClassDescriptors() private val containingDeclaration = outerContext.containingDeclaration - private val annotations = components.storageManager.createLazyValue { computeAnnotations() } private val primaryConstructor = components.storageManager.createNullableLazyValue { computePrimaryConstructor() } private val classObjectDescriptor = components.storageManager.createNullableLazyValue { computeClassObjectDescriptor() } + private val annotations = if (!Flags.HAS_ANNOTATIONS.get(classProto.getFlags())) { + Annotations.EMPTY + } + else DeserializedAnnotations(components.storageManager) { + components.annotationLoader.loadClassAnnotations(this, classProto) + } + override fun getContainingDeclaration(): DeclarationDescriptor = containingDeclaration override fun getTypeConstructor() = typeConstructor @@ -79,14 +85,7 @@ public class DeserializedClassDescriptor( override fun isInner() = isInner - private fun computeAnnotations(): Annotations { - if (!Flags.HAS_ANNOTATIONS.get(classProto.getFlags())) { - return Annotations.EMPTY - } - return components.annotationLoader.loadClassAnnotations(this, classProto) - } - - override fun getAnnotations(): Annotations = annotations() + override fun getAnnotations() = annotations override fun getScopeForMemberLookup() = memberScope diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/textBuilder/DeserializerForDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/textBuilder/DeserializerForDecompiler.kt index c8188c21d52..fa6d0e457b7 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/textBuilder/DeserializerForDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/decompiler/textBuilder/DeserializerForDecompiler.kt @@ -94,9 +94,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di private val loadersStorage = DescriptorLoadersStorage(storageManager, moduleDescriptor) - private val annotationLoader = AnnotationDescriptorLoader( - storageManager, moduleDescriptor, loadersStorage, localClassFinder, LOGGING_REPORTER - ) + private val annotationLoader = AnnotationDescriptorLoader(moduleDescriptor, loadersStorage, localClassFinder, LOGGING_REPORTER) private val constantLoader = ConstantDescriptorLoader(loadersStorage, localClassFinder, LOGGING_REPORTER)