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