From 7ec67505c5b30a3c5a3cbac13eb04657dd190e06 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 4 Jul 2017 13:49:50 +0300 Subject: [PATCH] Optimize Annotations.isEmpty in some implementations --- .../descriptors/annotations/Annotations.kt | 19 ++++++++----------- .../deserialization/MemberDeserializer.kt | 4 ++-- .../descriptors/DeserializedAnnotations.kt | 18 ++++++++++++++++-- .../DeserializedClassDescriptor.kt | 2 +- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt index 6531072ee45..28076e92c7d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/Annotations.kt @@ -17,8 +17,8 @@ package org.jetbrains.kotlin.descriptors.annotations import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe interface Annotated { val annotations: Annotations @@ -74,8 +74,7 @@ interface Annotations : Iterable { } fun checkAnnotationName(annotation: AnnotationDescriptor, fqName: FqName): Boolean { - val descriptor = annotation.annotationClass - return descriptor != null && fqName.toUnsafe() == DescriptorUtils.getFqName(descriptor) + return annotation.annotationClass?.fqNameUnsafe == fqName.toUnsafe() } class FilteredAnnotations( @@ -103,16 +102,14 @@ class FilteredAnnotations( return delegate.getAllAnnotations().filter { shouldBeReturned(it.annotation) } } - override fun iterator() = delegate.filter { shouldBeReturned(it) }.iterator() + override fun iterator() = delegate.filter(this::shouldBeReturned).iterator() - private fun shouldBeReturned(annotation: AnnotationDescriptor): Boolean { - val descriptor = annotation.annotationClass - return descriptor != null && DescriptorUtils.getFqName(descriptor).let { fqName -> - fqName.isSafe && fqNameFilter(fqName.toSafe()) - } - } + override fun isEmpty() = delegate.any(this::shouldBeReturned) - override fun isEmpty() = !iterator().hasNext() + private fun shouldBeReturned(annotation: AnnotationDescriptor): Boolean = + annotation.annotationClass?.fqNameUnsafe.let { fqName -> + fqName != null && fqName.isSafe && fqNameFilter(fqName.toSafe()) + } } class CompositeAnnotations( diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt index 17f30d9d703..7a7bd6b68ce 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt @@ -222,7 +222,7 @@ class MemberDeserializer(private val c: DeserializationContext) { if (!Flags.HAS_ANNOTATIONS.get(flags)) { return Annotations.EMPTY } - return DeserializedAnnotationsWithPossibleTargets(c.storageManager) { + return NonEmptyDeserializedAnnotationsWithPossibleTargets(c.storageManager) { c.containingDeclaration.asProtoContainer()?.let { c.components.annotationAndConstantLoader.loadCallableAnnotations(it, proto, kind).toList() }.orEmpty() @@ -255,7 +255,7 @@ class MemberDeserializer(private val c: DeserializationContext) { return valueParameters.mapIndexed { i, proto -> val flags = if (proto.hasFlags()) proto.flags else 0 val annotations = if (containerOfCallable != null && Flags.HAS_ANNOTATIONS.get(flags)) { - DeserializedAnnotations(c.storageManager) { + NonEmptyDeserializedAnnotations(c.storageManager) { c.components.annotationAndConstantLoader .loadValueParameterAnnotations(containerOfCallable, callable, kind, i, proto) .toList() diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations.kt index 3ff39885ba3..f9f59cb9458 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedAnnotations.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue -class DeserializedAnnotations( +open class DeserializedAnnotations( storageManager: StorageManager, compute: () -> List ) : Annotations { @@ -43,7 +43,14 @@ class DeserializedAnnotations( override fun iterator(): Iterator = annotations.iterator() } -class DeserializedAnnotationsWithPossibleTargets( +class NonEmptyDeserializedAnnotations( + storageManager: StorageManager, + compute: () -> List +) : DeserializedAnnotations(storageManager, compute) { + override fun isEmpty(): Boolean = false +} + +open class DeserializedAnnotationsWithPossibleTargets( storageManager: StorageManager, compute: () -> List ) : Annotations { @@ -64,3 +71,10 @@ class DeserializedAnnotationsWithPossibleTargets( return annotations.asSequence().filter { it.target == null }.map { it.annotation }.iterator() } } + +class NonEmptyDeserializedAnnotationsWithPossibleTargets( + storageManager: StorageManager, + compute: () -> List +) : DeserializedAnnotationsWithPossibleTargets(storageManager, compute) { + override fun isEmpty(): Boolean = false +} diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index ec5ec8ab778..1dfde2a5058 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -80,7 +80,7 @@ class DeserializedClassDescriptor( if (!Flags.HAS_ANNOTATIONS.get(classProto.flags)) { Annotations.EMPTY } - else DeserializedAnnotations(c.storageManager) { + else NonEmptyDeserializedAnnotations(c.storageManager) { c.components.annotationAndConstantLoader.loadClassAnnotations(thisAsProtoContainer).toList() }