diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt index 8a396c1c0ef..a5fb526aad9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationChecker.kt @@ -54,7 +54,7 @@ public class AnnotationChecker(private val additionalCheckers: Iterable TargetLists.T_INITIALIZER is JetMultiDeclaration -> TargetLists.T_MULTI_DECLARATION + is JetFunctionLiteralExpression -> TargetLists.T_FUNCTION_LITERAL + is JetExpression -> TargetLists.T_EXPRESSION else -> TargetLists.EMPTY } } @@ -225,6 +227,8 @@ public class AnnotationChecker(private val additionalCheckers: Iterable Int) = arg() + +@FunAnn fun gav() = 13 + +fun foo(arg: Int) { + // Literal is annotatable + bar @FunAnn { arg } + // Function expression too + val f = @FunAnn fun(): Int { return 42 } + // But here, f and gav should be annotated instead + bar(@FunAnn f) + bar(@FunAnn ::gav) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/options/functions.txt b/compiler/testData/diagnostics/tests/annotations/options/functions.txt new file mode 100644 index 00000000000..82735a9a431 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/options/functions.txt @@ -0,0 +1,12 @@ +package + +public fun bar(/*0*/ arg: () -> kotlin.Int): kotlin.Int +public fun foo(/*0*/ arg: kotlin.Int): kotlin.Unit +@FunAnn() public fun gav(): kotlin.Int + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) @kotlin.annotation.annotation() public final class FunAnn : kotlin.Annotation { + public constructor FunAnn() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/options/targets/expr.kt b/compiler/testData/diagnostics/tests/annotations/options/targets/expr.kt index 156e175b619..3a55789d3b0 100644 --- a/compiler/testData/diagnostics/tests/annotations/options/targets/expr.kt +++ b/compiler/testData/diagnostics/tests/annotations/options/targets/expr.kt @@ -7,5 +7,5 @@ fun transform(i: Int, tr: (Int) -> Int): Int = @base< @base @special fun foo(i: Int): Int { val j = @base @special i + 1 if (j == 1) return foo(@special @base 42) - return transform(@special j, @base @special { @special it * 2 }) + return transform(@special j, @base @special { @special it * 2 }) } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index f859dc0cd82..660022d82b8 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1034,6 +1034,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("functions.kt") + public void testFunctions() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/functions.kt"); + doTest(fileName); + } + @TestMetadata("javaDocumented.kt") public void testJavaDocumented() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/options/javaDocumented.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt index cab41a1465f..bfc25e5015f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/KotlinTarget.kt @@ -32,11 +32,11 @@ public enum class KotlinTarget(val description: String, val isDefault: Boolean = LOCAL_VARIABLE("local variable"), VALUE_PARAMETER("value parameter"), CONSTRUCTOR("constructor"), - FUNCTION("function"), // includes *_FUNCTION + FUNCTION("function"), // includes *_FUNCTION and FUNCTION_LITERAL PROPERTY_GETTER("getter"), PROPERTY_SETTER("setter"), TYPE("type usage", false), - EXPRESSION("expression", false), + EXPRESSION("expression", false), // includes FUNCTION_LITERAL FILE("file", false), TYPE_PROJECTION("type projection", false), @@ -60,7 +60,8 @@ public enum class KotlinTarget(val description: String, val isDefault: Boolean = TOP_LEVEL_PROPERTY("top level property", false), INITIALIZER("initializer", false), - MULTI_DECLARATION("multi declaration", false) + MULTI_DECLARATION("multi declaration", false), + FUNCTION_LITERAL("function literal", false) ; companion object {