Use lazy to store split annotations, code simplification

This commit is contained in:
Yan Zhulanow
2015-08-28 19:29:52 +03:00
parent b6adaab94b
commit 0b24e56f5a
3 changed files with 19 additions and 30 deletions
@@ -40,7 +40,6 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.resolve.constants.ConstantValue; import org.jetbrains.kotlin.resolve.constants.ConstantValue;
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature;
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor; 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.ErrorUtils;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter; import org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter;
@@ -119,7 +118,7 @@ public class PropertyCodegen {
boolean hasBackingField = hasBackingField(declaration, descriptor); boolean hasBackingField = hasBackingField(declaration, descriptor);
AnnotationSplitter annotationSplitter = AnnotationSplitter.create(LockBasedStorageManager.NO_LOCKS, AnnotationSplitter annotationSplitter = AnnotationSplitter.create(
descriptor.getAnnotations(), AnnotationSplitter.getTargetSet(false, descriptor.isVar(), hasBackingField)); descriptor.getAnnotations(), AnnotationSplitter.getTargetSet(false, descriptor.isVar(), hasBackingField));
Annotations fieldAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.FIELD); Annotations fieldAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.FIELD);
@@ -172,7 +171,7 @@ public class PropertyCodegen {
} }
public void generatePrimaryConstructorProperty(JetParameter p, PropertyDescriptor descriptor) { public void generatePrimaryConstructorProperty(JetParameter p, PropertyDescriptor descriptor) {
AnnotationSplitter annotationSplitter = AnnotationSplitter.create(LockBasedStorageManager.NO_LOCKS, AnnotationSplitter annotationSplitter = AnnotationSplitter.create(
descriptor.getAnnotations(), AnnotationSplitter.getTargetSet(true, descriptor.isVar(), hasBackingField(p, descriptor))); descriptor.getAnnotations(), AnnotationSplitter.getTargetSet(true, descriptor.isVar(), hasBackingField(p, descriptor)));
Annotations fieldAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.FIELD); Annotations fieldAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.FIELD);
@@ -36,29 +36,20 @@ import org.jetbrains.kotlin.storage.StorageManager
other -> [T]. other -> [T].
*/ */
public class AnnotationSplitter( public class AnnotationSplitter(allAnnotations: Annotations, applicableTargetsLazy: () -> Set<AnnotationUseSiteTarget>) {
storageManager: StorageManager,
allAnnotations: Annotations,
applicableTargetsLazy: () -> Set<AnnotationUseSiteTarget>
) {
public companion object { public companion object {
private val TARGET_PRIORITIES = setOf(CONSTRUCTOR_PARAMETER, FIELD, PROPERTY, PROPERTY_SETTER, PROPERTY_GETTER) private val TARGET_PRIORITIES = setOf(CONSTRUCTOR_PARAMETER, FIELD, PROPERTY, PROPERTY_SETTER, PROPERTY_GETTER)
@jvmStatic @jvmStatic
public fun create( public fun create(annotations: Annotations, targets: Set<AnnotationUseSiteTarget>): AnnotationSplitter {
storageManager: StorageManager, return AnnotationSplitter(annotations, { targets })
annotations: Annotations,
targets: Set<AnnotationUseSiteTarget>
): AnnotationSplitter {
return AnnotationSplitter(storageManager, annotations, { targets })
} }
@jvmStatic @jvmStatic
public fun getTargetSet(parameter: Boolean, context: BindingContext, wrapper: PropertyWrapper): Set<AnnotationUseSiteTarget> { public fun getTargetSet(parameter: Boolean, context: BindingContext, wrapper: PropertyWrapper): Set<AnnotationUseSiteTarget> {
val property = wrapper.property val property = wrapper.property!!
assert(property != null)
val hasBackingField = context[BindingContext.BACKING_FIELD_REQUIRED, property] ?: false val hasBackingField = context[BindingContext.BACKING_FIELD_REQUIRED, property] ?: false
return getTargetSet(parameter, property!!.isVar, hasBackingField) return getTargetSet(parameter, property.isVar, hasBackingField)
} }
@jvmStatic @jvmStatic
@@ -73,7 +64,7 @@ public class AnnotationSplitter(
public class PropertyWrapper(public var property: PropertyDescriptor? = null) public class PropertyWrapper(public var property: PropertyDescriptor? = null)
private val splitAnnotations = storageManager.createLazyValue { private val splitAnnotations by lazy {
val map = hashMapOf<AnnotationUseSiteTarget, MutableList<AnnotationWithTarget>>() val map = hashMapOf<AnnotationUseSiteTarget, MutableList<AnnotationWithTarget>>()
val other = arrayListOf<AnnotationWithTarget>() val other = arrayListOf<AnnotationWithTarget>()
val applicableTargets = applicableTargetsLazy() val applicableTargets = applicableTargetsLazy()
@@ -116,7 +107,7 @@ public class AnnotationSplitter(
private inner class LazySplitAnnotations(target: AnnotationUseSiteTarget?) : Annotations { private inner class LazySplitAnnotations(target: AnnotationUseSiteTarget?) : Annotations {
private val annotations: Annotations by lazy { private val annotations: Annotations by lazy {
val splitAnnotations = this@AnnotationSplitter.splitAnnotations() val splitAnnotations = this@AnnotationSplitter.splitAnnotations
if (target != null) if (target != null)
AnnotationsImpl.create(splitAnnotations.first[target] ?: emptyList()) AnnotationsImpl.create(splitAnnotations.first[target] ?: emptyList())
@@ -343,7 +343,7 @@ public class DescriptorResolver {
if (modifierList != null) { if (modifierList != null) {
if (valueParameter.hasValOrVar()) { if (valueParameter.hasValOrVar()) {
AnnotationSplitter annotationSplitter = AnnotationSplitter.create( AnnotationSplitter annotationSplitter = AnnotationSplitter.create(
storageManager, allAnnotations, KotlinPackage.setOf(CONSTRUCTOR_PARAMETER)); allAnnotations, KotlinPackage.setOf(CONSTRUCTOR_PARAMETER));
valueParameterAnnotations = annotationSplitter.getAnnotationsForTarget(CONSTRUCTOR_PARAMETER); valueParameterAnnotations = annotationSplitter.getAnnotationsForTarget(CONSTRUCTOR_PARAMETER);
} }
else { else {
@@ -718,8 +718,7 @@ public class DescriptorResolver {
final AnnotationSplitter.PropertyWrapper wrapper = new AnnotationSplitter.PropertyWrapper(); final AnnotationSplitter.PropertyWrapper wrapper = new AnnotationSplitter.PropertyWrapper();
Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, modifierList, trace); Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, modifierList, trace);
AnnotationSplitter annotationSplitter = AnnotationSplitter annotationSplitter = new AnnotationSplitter(allAnnotations, new Function0<Set<AnnotationUseSiteTarget>>() {
new AnnotationSplitter(storageManager, allAnnotations, new Function0<Set<AnnotationUseSiteTarget>>() {
@Override @Override
public Set<AnnotationUseSiteTarget> invoke() { public Set<AnnotationUseSiteTarget> invoke() {
return AnnotationSplitter.getTargetSet(false, trace.getBindingContext(), wrapper); return AnnotationSplitter.getTargetSet(false, trace.getBindingContext(), wrapper);
@@ -1077,7 +1076,8 @@ public class DescriptorResolver {
@NotNull ClassDescriptor classDescriptor, @NotNull ClassDescriptor classDescriptor,
@NotNull ValueParameterDescriptor valueParameter, @NotNull ValueParameterDescriptor valueParameter,
@NotNull LexicalScope scope, @NotNull LexicalScope scope,
@NotNull JetParameter parameter, BindingTrace trace @NotNull JetParameter parameter,
final BindingTrace trace
) { ) {
JetType type = resolveParameterType(scope, parameter, trace); JetType type = resolveParameterType(scope, parameter, trace);
Name name = parameter.getNameAsSafeName(); Name name = parameter.getNameAsSafeName();
@@ -1092,13 +1092,12 @@ public class DescriptorResolver {
final AnnotationSplitter.PropertyWrapper propertyWrapper = new AnnotationSplitter.PropertyWrapper(); final AnnotationSplitter.PropertyWrapper propertyWrapper = new AnnotationSplitter.PropertyWrapper();
Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, parameter.getModifierList(), trace); Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, parameter.getModifierList(), trace);
AnnotationSplitter annotationSplitter = AnnotationSplitter annotationSplitter = new AnnotationSplitter(allAnnotations, new Function0<Set<AnnotationUseSiteTarget>>() {
new AnnotationSplitter(storageManager, allAnnotations, new Function0<Set<AnnotationUseSiteTarget>>() { @Override
@Override public Set<AnnotationUseSiteTarget> invoke() {
public Set<AnnotationUseSiteTarget> invoke() { return AnnotationSplitter.getTargetSet(true, trace.getBindingContext(), propertyWrapper);
return AnnotationSplitter.getTargetSet(true, trace.getBindingContext(), propertyWrapper); }
} });
});
Annotations propertyAnnotations = new CompositeAnnotations( Annotations propertyAnnotations = new CompositeAnnotations(
annotationSplitter.getAnnotationsForTargets(PROPERTY, FIELD), annotationSplitter.getAnnotationsForTargets(PROPERTY, FIELD),