From aa8537e5b0cc5dbff74fa3a3881fd9825a9b7f63 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 17 Oct 2014 16:25:59 +0200 Subject: [PATCH] =?UTF-8?q?optimize=20=E2=80=94=20use=20getAnnotation=20di?= =?UTF-8?q?rectly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/stores/DefaultStateSerializer.java | 9 +++------ .../util/xmlb/AbstractCollectionBinding.java | 2 +- .../src/com/intellij/util/xmlb/Accessor.java | 7 ++++++- .../com/intellij/util/xmlb/BeanBinding.java | 13 ++++++------ .../com/intellij/util/xmlb/FieldAccessor.java | 5 +++++ .../util/xmlb/JDOMElementBinding.java | 2 +- .../com/intellij/util/xmlb/MapBinding.java | 2 +- .../intellij/util/xmlb/PropertyAccessor.java | 20 ++++++++----------- .../intellij/util/xmlb/XmlSerializerImpl.java | 6 +++++- 9 files changed, 36 insertions(+), 30 deletions(-) diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java index a5e24f787064..e392846d3925 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java @@ -31,8 +31,6 @@ import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.annotation.Annotation; - @SuppressWarnings({"deprecation"}) public class DefaultStateSerializer { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.components.impl.stores.DefaultStateSerializer"); @@ -59,10 +57,9 @@ public class DefaultStateSerializer { } if (storage != null) { - for (Annotation annotation : accessor.getAnnotations()) { - if (StorageId.class.isAssignableFrom(annotation.annotationType()) && !((StorageId)annotation).value().equals(storage.id())) { - return false; - } + StorageId storageId = accessor.getAnnotation(StorageId.class); + if (storageId != null && !storageId.value().equals(storage.id())) { + return false; } return storage.isDefault(); } diff --git a/platform/util/src/com/intellij/util/xmlb/AbstractCollectionBinding.java b/platform/util/src/com/intellij/util/xmlb/AbstractCollectionBinding.java index e3a0b7a2579b..50199aa491f0 100644 --- a/platform/util/src/com/intellij/util/xmlb/AbstractCollectionBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/AbstractCollectionBinding.java @@ -41,7 +41,7 @@ abstract class AbstractCollectionBinding implements Binding { myElementType = elementType; myTagName = tagName; myAccessor = accessor; - myAnnotation = accessor == null ? null : XmlSerializerImpl.findAnnotation(accessor.getAnnotations(), AbstractCollection.class); + myAnnotation = accessor == null ? null : accessor.getAnnotation(AbstractCollection.class); } @Override diff --git a/platform/util/src/com/intellij/util/xmlb/Accessor.java b/platform/util/src/com/intellij/util/xmlb/Accessor.java index 55f163b39cfb..02c007ffb85a 100644 --- a/platform/util/src/com/intellij/util/xmlb/Accessor.java +++ b/platform/util/src/com/intellij/util/xmlb/Accessor.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.util.xmlb; import org.jetbrains.annotations.NotNull; @@ -26,9 +25,15 @@ public interface Accessor { void write(Object o, Object value); + @Deprecated @NotNull + /** + * @deprecated to remove in IDEA 15 + */ Annotation[] getAnnotations(); + T getAnnotation(@NotNull Class annotationClass); + String getName(); Class getValueClass(); diff --git a/platform/util/src/com/intellij/util/xmlb/BeanBinding.java b/platform/util/src/com/intellij/util/xmlb/BeanBinding.java index 48db833ebe24..721a0d40c38e 100644 --- a/platform/util/src/com/intellij/util/xmlb/BeanBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/BeanBinding.java @@ -85,7 +85,7 @@ class BeanBinding implements Binding { } //todo: optimize. Cache it. - Property property = XmlSerializerImpl.findAnnotation(accessor.getAnnotations(), Property.class); + Property property = accessor.getAnnotation(Property.class); if (property != null && property.filter() != SerializationFilter.class) { try { if (!ReflectionUtil.newInstance(property.filter()).accepts(accessor, o)) { @@ -277,23 +277,23 @@ class BeanBinding implements Binding { return binding; } - Attribute attribute = XmlSerializerImpl.findAnnotation(accessor.getAnnotations(), Attribute.class); + Attribute attribute = accessor.getAnnotation(Attribute.class); if (attribute != null) { return new AttributeBinding(accessor, attribute); } - Tag tag = XmlSerializerImpl.findAnnotation(accessor.getAnnotations(), Tag.class); + Tag tag = accessor.getAnnotation(Tag.class); if (tag != null && !tag.value().isEmpty()) { return new TagBinding(accessor, tag); } - Text text = XmlSerializerImpl.findAnnotation(accessor.getAnnotations(), Text.class); + Text text = accessor.getAnnotation(Text.class); if (text != null) { return new TextBinding(accessor); } boolean surroundWithTag = true; - Property property = XmlSerializerImpl.findAnnotation(accessor.getAnnotations(), Property.class); + Property property = accessor.getAnnotation(Property.class); if (property != null) { surroundWithTag = property.surroundWithTag(); } @@ -305,7 +305,6 @@ class BeanBinding implements Binding { return new AccessorBindingWrapper(accessor, binding); } - OptionTag optionTag = XmlSerializerImpl.findAnnotation(accessor.getAnnotations(), OptionTag.class); - return new OptionTagBinding(accessor, optionTag); + return new OptionTagBinding(accessor, accessor.getAnnotation(OptionTag.class)); } } diff --git a/platform/util/src/com/intellij/util/xmlb/FieldAccessor.java b/platform/util/src/com/intellij/util/xmlb/FieldAccessor.java index 1d249caaf452..172b5e364825 100644 --- a/platform/util/src/com/intellij/util/xmlb/FieldAccessor.java +++ b/platform/util/src/com/intellij/util/xmlb/FieldAccessor.java @@ -61,6 +61,11 @@ class FieldAccessor implements Accessor { return myField.getAnnotations(); } + @Override + public T getAnnotation(@NotNull Class annotationClass) { + return myField.getAnnotation(annotationClass); + } + @Override public String getName() { return myField.getName(); diff --git a/platform/util/src/com/intellij/util/xmlb/JDOMElementBinding.java b/platform/util/src/com/intellij/util/xmlb/JDOMElementBinding.java index 825c184e935c..81106aae5950 100644 --- a/platform/util/src/com/intellij/util/xmlb/JDOMElementBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/JDOMElementBinding.java @@ -29,7 +29,7 @@ class JDOMElementBinding implements Binding { public JDOMElementBinding(final Accessor accessor) { myAccessor = accessor; - final Tag tag = XmlSerializerImpl.findAnnotation(myAccessor.getAnnotations(), Tag.class); + Tag tag = myAccessor.getAnnotation(Tag.class); assert tag != null : "jdom.Element property without @Tag annotation: " + accessor; myTagName = tag.value(); } diff --git a/platform/util/src/com/intellij/util/xmlb/MapBinding.java b/platform/util/src/com/intellij/util/xmlb/MapBinding.java index 6783d88568e1..a2490e39fdb2 100644 --- a/platform/util/src/com/intellij/util/xmlb/MapBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/MapBinding.java @@ -61,7 +61,7 @@ class MapBinding implements Binding { myKeyBinding = XmlSerializerImpl.getBinding(keyType); myValueBinding = XmlSerializerImpl.getBinding(valueType); - myMapAnnotation = XmlSerializerImpl.findAnnotation(accessor.getAnnotations(), MapAnnotation.class); + myMapAnnotation = accessor.getAnnotation(MapAnnotation.class); } @Nullable diff --git a/platform/util/src/com/intellij/util/xmlb/PropertyAccessor.java b/platform/util/src/com/intellij/util/xmlb/PropertyAccessor.java index ad7a962342f6..9bef1ab7bf8a 100644 --- a/platform/util/src/com/intellij/util/xmlb/PropertyAccessor.java +++ b/platform/util/src/com/intellij/util/xmlb/PropertyAccessor.java @@ -16,6 +16,7 @@ package com.intellij.util.xmlb; +import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -25,7 +26,6 @@ import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; -import java.util.ArrayList; import java.util.List; class PropertyAccessor implements Accessor { @@ -80,25 +80,21 @@ class PropertyAccessor implements Accessor { } } - private Annotation[] myAnnotationCache; - @Override @NotNull public Annotation[] getAnnotations() { - Annotation[] annotations = myAnnotationCache; - if (annotations == null) { - annotations = myAnnotationCache = calcAnnotations(); - } - return annotations; - } - - private Annotation[] calcAnnotations() { - List result = new ArrayList(); + List result = new SmartList(); ContainerUtil.addAll(result, myReadMethod.getAnnotations()); ContainerUtil.addAll(result, myWriteMethod.getAnnotations()); return result.toArray(new Annotation[result.size()]); } + @Override + public T getAnnotation(@NotNull Class annotationClass) { + T annotation = myReadMethod.getAnnotation(annotationClass); + return annotation == null ? myWriteMethod.getAnnotation(annotationClass) : annotation; + } + @Override public String getName() { return myName; diff --git a/platform/util/src/com/intellij/util/xmlb/XmlSerializerImpl.java b/platform/util/src/com/intellij/util/xmlb/XmlSerializerImpl.java index 80e24725f3a7..f001872a1a43 100644 --- a/platform/util/src/com/intellij/util/xmlb/XmlSerializerImpl.java +++ b/platform/util/src/com/intellij/util/xmlb/XmlSerializerImpl.java @@ -127,7 +127,11 @@ class XmlSerializerImpl { } @Nullable - @SuppressWarnings({"unchecked"}) + @Deprecated + @SuppressWarnings({"unchecked", "unused"}) + /** + * @deprecated to remove in IDEA 15 + */ static T findAnnotation(Annotation[] annotations, Class aClass) { if (annotations == null) return null;