Simplify AnnotationSplitter creation and target set computation
This commit is contained in:
+2
-30
@@ -16,11 +16,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.annotations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.resolve.AnnotationChecker
|
||||
import org.jetbrains.kotlin.resolve.lazy.LazyEntity
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
@@ -40,42 +37,17 @@ import org.jetbrains.kotlin.storage.getValue
|
||||
*/
|
||||
|
||||
class AnnotationSplitter(
|
||||
val storageManager: StorageManager,
|
||||
private val storageManager: StorageManager,
|
||||
allAnnotations: Annotations,
|
||||
applicableTargetsLazy: () -> Set<AnnotationUseSiteTarget>
|
||||
applicableTargets: Set<AnnotationUseSiteTarget>
|
||||
) {
|
||||
companion object {
|
||||
private val TARGET_PRIORITIES = setOf(CONSTRUCTOR_PARAMETER, PROPERTY, FIELD)
|
||||
|
||||
@JvmStatic
|
||||
fun create(storageManager: StorageManager, annotations: Annotations, targets: Set<AnnotationUseSiteTarget>): AnnotationSplitter =
|
||||
AnnotationSplitter(storageManager, annotations) { targets }
|
||||
|
||||
@JvmStatic
|
||||
fun getTargetSet(parameter: Boolean, wrapper: PropertyWrapper): Set<AnnotationUseSiteTarget> =
|
||||
hashSetOf(PROPERTY, PROPERTY_GETTER).apply {
|
||||
if (parameter) {
|
||||
add(CONSTRUCTOR_PARAMETER)
|
||||
add(PROPERTY_GETTER)
|
||||
add(PROPERTY_SETTER)
|
||||
}
|
||||
add(FIELD)
|
||||
if (wrapper.descriptor!!.isVar) {
|
||||
add(PROPERTY_SETTER)
|
||||
add(SETTER_PARAMETER)
|
||||
}
|
||||
if (wrapper.declaration is KtProperty && wrapper.declaration.hasDelegate()) {
|
||||
add(PROPERTY_DELEGATE_FIELD)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PropertyWrapper @JvmOverloads constructor(val declaration: KtDeclaration, var descriptor: PropertyDescriptor? = null)
|
||||
|
||||
private val splitAnnotations = storageManager.createLazyValue {
|
||||
val map = hashMapOf<AnnotationUseSiteTarget, MutableList<AnnotationDescriptor>>()
|
||||
val other = arrayListOf<AnnotationDescriptor>()
|
||||
val applicableTargets = applicableTargetsLazy()
|
||||
val applicableTargetsWithoutUseSiteTarget = applicableTargets.intersect(TARGET_PRIORITIES)
|
||||
|
||||
outer@ for (annotation in allAnnotations) {
|
||||
|
||||
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.config.LanguageFeature;
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings;
|
||||
import org.jetbrains.kotlin.descriptors.*;
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter;
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget;
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
|
||||
import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations;
|
||||
import org.jetbrains.kotlin.descriptors.impl.*;
|
||||
@@ -395,7 +396,7 @@ public class DescriptorResolver {
|
||||
return new CompositeAnnotations(allAnnotations, additionalAnnotations);
|
||||
}
|
||||
|
||||
AnnotationSplitter splitter = AnnotationSplitter.create(storageManager, allAnnotations, SetsKt.setOf(CONSTRUCTOR_PARAMETER));
|
||||
AnnotationSplitter splitter = new AnnotationSplitter(storageManager, allAnnotations, SetsKt.setOf(CONSTRUCTOR_PARAMETER));
|
||||
return new CompositeAnnotations(splitter.getAnnotationsForTarget(CONSTRUCTOR_PARAMETER), additionalAnnotations);
|
||||
}
|
||||
|
||||
@@ -868,11 +869,16 @@ public class DescriptorResolver {
|
||||
trace.getBindingContext(), container)
|
||||
: Modality.FINAL;
|
||||
|
||||
AnnotationSplitter.PropertyWrapper wrapper = new AnnotationSplitter.PropertyWrapper(variableDeclaration);
|
||||
|
||||
Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scopeForDeclarationResolution, modifierList, trace);
|
||||
AnnotationSplitter annotationSplitter =
|
||||
new AnnotationSplitter(storageManager, allAnnotations, () -> AnnotationSplitter.getTargetSet(false, wrapper));
|
||||
Set<AnnotationUseSiteTarget> targetSet = EnumSet.of(PROPERTY, PROPERTY_GETTER, FIELD);
|
||||
if (isVar) {
|
||||
targetSet.add(PROPERTY_SETTER);
|
||||
targetSet.add(SETTER_PARAMETER);
|
||||
}
|
||||
if (variableDeclaration instanceof KtProperty && ((KtProperty) variableDeclaration).hasDelegate()) {
|
||||
targetSet.add(PROPERTY_DELEGATE_FIELD);
|
||||
}
|
||||
AnnotationSplitter annotationSplitter = new AnnotationSplitter(storageManager, allAnnotations, targetSet);
|
||||
|
||||
Annotations propertyAnnotations = new CompositeAnnotations(CollectionsKt.listOf(
|
||||
annotationSplitter.getAnnotationsForTarget(PROPERTY),
|
||||
@@ -896,7 +902,6 @@ public class DescriptorResolver {
|
||||
modifierList != null && modifierList.hasModifier(KtTokens.EXTERNAL_KEYWORD),
|
||||
propertyInfo.getHasDelegate()
|
||||
);
|
||||
wrapper.setDescriptor(propertyDescriptor);
|
||||
|
||||
List<TypeParameterDescriptorImpl> typeParameterDescriptors;
|
||||
LexicalScope scopeForDeclarationResolutionWithTypeParameters;
|
||||
@@ -939,7 +944,7 @@ public class DescriptorResolver {
|
||||
|
||||
ReceiverParameterDescriptor receiverDescriptor;
|
||||
if (receiverType != null) {
|
||||
AnnotationSplitter splitter = AnnotationSplitter.create(storageManager, receiverType.getAnnotations(), EnumSet.of(RECEIVER));
|
||||
AnnotationSplitter splitter = new AnnotationSplitter(storageManager, receiverType.getAnnotations(), EnumSet.of(RECEIVER));
|
||||
receiverDescriptor = DescriptorFactory.createExtensionReceiverParameterForCallable(
|
||||
propertyDescriptor, receiverType, splitter.getAnnotationsForTarget(RECEIVER)
|
||||
);
|
||||
@@ -1224,10 +1229,13 @@ public class DescriptorResolver {
|
||||
}
|
||||
}
|
||||
|
||||
AnnotationSplitter.PropertyWrapper propertyWrapper = new AnnotationSplitter.PropertyWrapper(parameter);
|
||||
Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, parameter.getModifierList(), trace);
|
||||
AnnotationSplitter annotationSplitter =
|
||||
new AnnotationSplitter(storageManager, allAnnotations, () -> AnnotationSplitter.getTargetSet(true, propertyWrapper));
|
||||
Set<AnnotationUseSiteTarget> targetSet = EnumSet.of(PROPERTY, PROPERTY_GETTER, FIELD, CONSTRUCTOR_PARAMETER, PROPERTY_SETTER);
|
||||
if (isMutable) {
|
||||
targetSet.add(PROPERTY_SETTER);
|
||||
targetSet.add(SETTER_PARAMETER);
|
||||
}
|
||||
AnnotationSplitter annotationSplitter = new AnnotationSplitter(storageManager, allAnnotations, targetSet);
|
||||
|
||||
Annotations propertyAnnotations = new CompositeAnnotations(
|
||||
annotationSplitter.getAnnotationsForTarget(PROPERTY),
|
||||
@@ -1250,7 +1258,6 @@ public class DescriptorResolver {
|
||||
false,
|
||||
false
|
||||
);
|
||||
propertyWrapper.setDescriptor(propertyDescriptor);
|
||||
propertyDescriptor.setType(type, Collections.emptyList(), getDispatchReceiverParameterIfNeeded(classDescriptor), null);
|
||||
|
||||
Annotations setterAnnotations = annotationSplitter.getAnnotationsForTarget(PROPERTY_SETTER);
|
||||
|
||||
@@ -215,7 +215,7 @@ class FunctionDescriptorResolver(
|
||||
}
|
||||
|
||||
val extensionReceiver = receiverType?.let {
|
||||
val splitter = AnnotationSplitter.create(storageManager, receiverType.annotations, EnumSet.of(AnnotationUseSiteTarget.RECEIVER))
|
||||
val splitter = AnnotationSplitter(storageManager, receiverType.annotations, EnumSet.of(AnnotationUseSiteTarget.RECEIVER))
|
||||
DescriptorFactory.createExtensionReceiverParameterForCallable(
|
||||
functionDescriptor, it, splitter.getAnnotationsForTarget(AnnotationUseSiteTarget.RECEIVER)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user