From f4ccb16c2e5405e5184f7288a8318e44c683da7b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 28 Sep 2015 13:49:23 +0300 Subject: [PATCH] Function expressions can be now annotated with expression-targeted annotation #KT-9323 Fixed --- .../kotlin/resolve/AnnotationChecker.kt | 16 ++++++++++------ .../kotlin/resolve/ModifiersChecker.java | 3 +-- .../annotations/options/functionExpression.kt | 11 +++++++++++ .../annotations/options/functionExpression.txt | 17 +++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ .../descriptors/annotations/KotlinTarget.kt | 1 + 6 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/annotations/options/functionExpression.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/options/functionExpression.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt index 0c20e4cd409..7c89f336b78 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.annotations.* import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.psi.* @@ -28,14 +29,12 @@ import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isRepeatableAnnotation import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.* -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.getAnnotationRetention import org.jetbrains.kotlin.resolve.inline.InlineUtil public class AnnotationChecker(private val additionalCheckers: Iterable) { - public fun check(annotated: JetAnnotated, trace: BindingTrace, descriptor: ClassDescriptor? = null) { + public fun check(annotated: JetAnnotated, trace: BindingTrace, descriptor: DeclarationDescriptor? = null) { if (annotated is JetTypeParameter) return // TODO: support type parameter annotations val actualTargets = getActualTargetList(annotated, descriptor) checkEntries(annotated.annotationEntries, actualTargets, trace) @@ -157,9 +156,10 @@ public class AnnotationChecker(private val additionalCheckers: Iterable descriptor?.let { TargetList(KotlinTarget.classActualTargets(it)) } ?: TargetLists.T_CLASSIFIER + is JetClassOrObject -> + (descriptor as? ClassDescriptor)?.let { TargetList(KotlinTarget.classActualTargets(it)) } ?: TargetLists.T_CLASSIFIER is JetMultiDeclarationEntry -> TargetLists.T_LOCAL_VARIABLE is JetProperty -> { if (annotated.isLocal) @@ -177,7 +177,9 @@ public class AnnotationChecker(private val additionalCheckers: Iterable -> TargetLists.T_CONSTRUCTOR is JetFunction -> { - if (annotated.isLocal) + if (DescriptorUtils.isFunctionExpression(descriptor)) + TargetLists.T_FUNCTION_EXPRESSION + else if (annotated.isLocal) TargetLists.T_LOCAL_FUNCTION else if (annotated.parent is JetClassOrObject || annotated.parent is JetClassBody) TargetLists.T_MEMBER_FUNCTION @@ -250,6 +252,8 @@ public class AnnotationChecker(private val additionalCheckers: Iterable