Use lazy to store split annotations, code simplification
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
+7
-16
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user