diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index bc5308c5f77..5326784697b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -149,7 +149,7 @@ public class PropertyCodegen extends GenerationStateAware { // Annotations on properties without backing fields are stored in bytecode on an empty synthetic method. This way they're still // accessible via reflection, and 'deprecated' and 'private' flags prevent this method from being called accidentally private void generateSyntheticMethodIfNeeded(@NotNull PropertyDescriptor descriptor) { - if (descriptor.getAnnotations().getAnnotationDescriptors().isEmpty()) return; + if (descriptor.getAnnotations().isEmpty()) return; ReceiverParameterDescriptor receiver = descriptor.getReceiverParameter(); Type receiverAsmType = receiver == null ? null : typeMapper.mapType(receiver.getType()); diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java index 7c9bef68d6d..4b937398c67 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorSerializer.java @@ -431,7 +431,7 @@ public class DescriptorSerializer { } private static boolean hasAnnotations(Annotated descriptor) { - return !descriptor.getAnnotations().getAnnotationDescriptors().isEmpty(); + return !descriptor.getAnnotations().isEmpty(); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index daa05080ffa..8a2460f166c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -155,7 +155,7 @@ public class DeclarationResolver { if (modifierList != null) { MutableClassDescriptor descriptor = entry.getValue(); descriptor.addAnnotations(annotationResolver.resolveAnnotationsWithoutArguments( - descriptor.getScopeForSupertypeResolution(), modifierList, trace).getAnnotationDescriptors()); + descriptor.getScopeForSupertypeResolution(), modifierList, trace)); } } } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/annotations/Annotations.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/annotations/Annotations.java index 2a10a1edeca..f1a58f8c1d0 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/annotations/Annotations.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/annotations/Annotations.java @@ -17,28 +17,23 @@ package org.jetbrains.jet.lang.descriptors.annotations; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.ReadOnly; import java.util.Collections; import java.util.Iterator; -import java.util.List; public interface Annotations extends Iterable { Annotations EMPTY = new Annotations() { - @NotNull @Override - public List getAnnotationDescriptors() { - return Collections.emptyList(); + public boolean isEmpty() { + return true; } @NotNull @Override public Iterator iterator() { - return getAnnotationDescriptors().iterator(); + return Collections.emptyList().iterator(); } }; - @NotNull - @ReadOnly - List getAnnotationDescriptors(); + boolean isEmpty(); } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/annotations/AnnotationsImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/annotations/AnnotationsImpl.java index c2cb73eb1bc..f65ac1140cf 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/annotations/AnnotationsImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/annotations/AnnotationsImpl.java @@ -29,11 +29,15 @@ public class AnnotationsImpl implements Annotations { } @NotNull - @Override public List getAnnotationDescriptors() { return annotations; } + @Override + public boolean isEmpty() { + return getAnnotationDescriptors().isEmpty(); + } + @NotNull @Override public Iterator iterator() { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptorLite.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptorLite.java index 99bd0da72e8..e5656278292 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptorLite.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptorLite.java @@ -39,7 +39,7 @@ import java.util.List; public abstract class MutableClassDescriptorLite extends ClassDescriptorBase { - private Annotations annotations = new AnnotationsImpl(new ArrayList(0)); + private Annotations annotations; private List typeParameters; private Collection supertypes = Lists.newArrayList(); @@ -183,6 +183,9 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase { @NotNull @Override public Annotations getAnnotations() { + if (annotations == null) { + annotations = new AnnotationsImpl(new ArrayList(0)); + } return annotations; } @@ -190,8 +193,12 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase { this.annotations = annotations; } - public void addAnnotations(@NotNull List annotationDescriptors) { - this.annotations.getAnnotationDescriptors().addAll(annotationDescriptors); + public void addAnnotations(@NotNull Iterable annotationDescriptors) { + + AnnotationsImpl annotationsImpl = (AnnotationsImpl) getAnnotations(); + for (AnnotationDescriptor annotationDescriptor : annotationDescriptors) { + annotationsImpl.getAnnotationDescriptors().add(annotationDescriptor); + } } private PackageLikeBuilder builder = null; diff --git a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java index 4d520d6344a..f780005a906 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java +++ b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.di.InjectorForBodyResolve; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.Annotated; +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; @@ -216,7 +217,9 @@ public class ResolveElementCache { Annotated descriptor = analyzer.resolveToDescriptor(declaration); // Activate annotation resolving - descriptor.getAnnotations().getAnnotationDescriptors(); + for (AnnotationDescriptor annotationDescriptor : descriptor.getAnnotations()) { + // do nothing, all we need is iteration + } } }