From 6c45d81b863e158d143ede3bd00945329b576225 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 1 Sep 2015 15:10:30 +0300 Subject: [PATCH] Revert "Use lazy to store split annotations, code simplification" This reverts commit 0b24e56f5ae400c1845e85cfa24618c651942b6d. --- .../kotlin/codegen/PropertyCodegen.java | 5 ++-- .../annotations/AnnotationSplitter.kt | 23 +++++++++++++------ .../kotlin/resolve/DescriptorResolver.java | 21 +++++++++-------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java index 7cb357390de..ed60654ed9c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.constants.ConstantValue; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor; +import org.jetbrains.kotlin.storage.LockBasedStorageManager; import org.jetbrains.kotlin.types.ErrorUtils; import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter; @@ -118,7 +119,7 @@ public class PropertyCodegen { boolean hasBackingField = hasBackingField(declaration, descriptor); - AnnotationSplitter annotationSplitter = AnnotationSplitter.create( + AnnotationSplitter annotationSplitter = AnnotationSplitter.create(LockBasedStorageManager.NO_LOCKS, descriptor.getAnnotations(), AnnotationSplitter.getTargetSet(false, descriptor.isVar(), hasBackingField)); Annotations fieldAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.FIELD); @@ -171,7 +172,7 @@ public class PropertyCodegen { } public void generatePrimaryConstructorProperty(JetParameter p, PropertyDescriptor descriptor) { - AnnotationSplitter annotationSplitter = AnnotationSplitter.create( + AnnotationSplitter annotationSplitter = AnnotationSplitter.create(LockBasedStorageManager.NO_LOCKS, descriptor.getAnnotations(), AnnotationSplitter.getTargetSet(true, descriptor.isVar(), hasBackingField(p, descriptor))); Annotations fieldAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.FIELD); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt index 993159390d4..8c9143342d7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt @@ -36,20 +36,29 @@ import org.jetbrains.kotlin.storage.StorageManager other -> [T]. */ -public class AnnotationSplitter(allAnnotations: Annotations, applicableTargetsLazy: () -> Set) { +public class AnnotationSplitter( + storageManager: StorageManager, + allAnnotations: Annotations, + applicableTargetsLazy: () -> Set +) { public companion object { private val TARGET_PRIORITIES = setOf(CONSTRUCTOR_PARAMETER, FIELD, PROPERTY, PROPERTY_SETTER, PROPERTY_GETTER) @jvmStatic - public fun create(annotations: Annotations, targets: Set): AnnotationSplitter { - return AnnotationSplitter(annotations, { targets }) + public fun create( + storageManager: StorageManager, + annotations: Annotations, + targets: Set + ): AnnotationSplitter { + return AnnotationSplitter(storageManager, annotations, { targets }) } @jvmStatic public fun getTargetSet(parameter: Boolean, context: BindingContext, wrapper: PropertyWrapper): Set { - val property = wrapper.property!! + val property = wrapper.property + assert(property != null) val hasBackingField = context[BindingContext.BACKING_FIELD_REQUIRED, property] ?: false - return getTargetSet(parameter, property.isVar, hasBackingField) + return getTargetSet(parameter, property!!.isVar, hasBackingField) } @jvmStatic @@ -64,7 +73,7 @@ public class AnnotationSplitter(allAnnotations: Annotations, applicableTargetsLa public class PropertyWrapper(public var property: PropertyDescriptor? = null) - private val splitAnnotations by lazy { + private val splitAnnotations = storageManager.createLazyValue { val map = hashMapOf>() val other = arrayListOf() val applicableTargets = applicableTargetsLazy() @@ -107,7 +116,7 @@ public class AnnotationSplitter(allAnnotations: Annotations, applicableTargetsLa private inner class LazySplitAnnotations(target: AnnotationUseSiteTarget?) : Annotations { private val annotations: Annotations by lazy { - val splitAnnotations = this@AnnotationSplitter.splitAnnotations + val splitAnnotations = this@AnnotationSplitter.splitAnnotations() if (target != null) AnnotationsImpl.create(splitAnnotations.first[target] ?: emptyList()) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index ba4ab76afb6..67b660bfa42 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -343,7 +343,7 @@ public class DescriptorResolver { if (modifierList != null) { if (valueParameter.hasValOrVar()) { AnnotationSplitter annotationSplitter = AnnotationSplitter.create( - allAnnotations, KotlinPackage.setOf(CONSTRUCTOR_PARAMETER)); + storageManager, allAnnotations, KotlinPackage.setOf(CONSTRUCTOR_PARAMETER)); valueParameterAnnotations = annotationSplitter.getAnnotationsForTarget(CONSTRUCTOR_PARAMETER); } else { @@ -718,7 +718,8 @@ public class DescriptorResolver { final AnnotationSplitter.PropertyWrapper wrapper = new AnnotationSplitter.PropertyWrapper(); Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, modifierList, trace); - AnnotationSplitter annotationSplitter = new AnnotationSplitter(allAnnotations, new Function0>() { + AnnotationSplitter annotationSplitter = + new AnnotationSplitter(storageManager, allAnnotations, new Function0>() { @Override public Set invoke() { return AnnotationSplitter.getTargetSet(false, trace.getBindingContext(), wrapper); @@ -1076,8 +1077,7 @@ public class DescriptorResolver { @NotNull ClassDescriptor classDescriptor, @NotNull ValueParameterDescriptor valueParameter, @NotNull LexicalScope scope, - @NotNull JetParameter parameter, - final BindingTrace trace + @NotNull JetParameter parameter, final BindingTrace trace ) { JetType type = resolveParameterType(scope, parameter, trace); Name name = parameter.getNameAsSafeName(); @@ -1092,12 +1092,13 @@ public class DescriptorResolver { final AnnotationSplitter.PropertyWrapper propertyWrapper = new AnnotationSplitter.PropertyWrapper(); Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, parameter.getModifierList(), trace); - AnnotationSplitter annotationSplitter = new AnnotationSplitter(allAnnotations, new Function0>() { - @Override - public Set invoke() { - return AnnotationSplitter.getTargetSet(true, trace.getBindingContext(), propertyWrapper); - } - }); + AnnotationSplitter annotationSplitter = + new AnnotationSplitter(storageManager, allAnnotations, new Function0>() { + @Override + public Set invoke() { + return AnnotationSplitter.getTargetSet(true, trace.getBindingContext(), propertyWrapper); + } + }); Annotations propertyAnnotations = new CompositeAnnotations( annotationSplitter.getAnnotationsForTargets(PROPERTY, FIELD),