From b2cdf2dc74128b68a713b30f39edb30205441ad8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 13 Feb 2019 19:13:53 +0100 Subject: [PATCH] Simplify AnnotationSplitter creation and target set computation --- .../annotations/AnnotationSplitter.kt | 32 ++----------------- .../kotlin/resolve/DescriptorResolver.java | 29 ++++++++++------- .../resolve/FunctionDescriptorResolver.kt | 2 +- 3 files changed, 21 insertions(+), 42 deletions(-) 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 07ea3b123b6..68c6acb0e40 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationSplitter.kt @@ -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 + applicableTargets: Set ) { companion object { private val TARGET_PRIORITIES = setOf(CONSTRUCTOR_PARAMETER, PROPERTY, FIELD) - - @JvmStatic - fun create(storageManager: StorageManager, annotations: Annotations, targets: Set): AnnotationSplitter = - AnnotationSplitter(storageManager, annotations) { targets } - - @JvmStatic - fun getTargetSet(parameter: Boolean, wrapper: PropertyWrapper): Set = - 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>() val other = arrayListOf() - val applicableTargets = applicableTargetsLazy() val applicableTargetsWithoutUseSiteTarget = applicableTargets.intersect(TARGET_PRIORITIES) outer@ for (annotation in allAnnotations) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 600674e55f2..0bea6f7c2bb 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -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 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 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 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); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index acf6a4a6170..5337657b888 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -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) )