From 5d2cb2f97b067807d731e8822f696130f35c297b Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Wed, 18 Dec 2013 19:31:28 +0400 Subject: [PATCH] Annotations inheritance. Either prohibit or implement correctly #KT-3225 Fixed --- .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 1 + .../lang/diagnostics/rendering/DefaultErrorMessages.java | 1 + .../src/org/jetbrains/jet/lang/resolve/BodyResolver.java | 4 ++++ .../tests/annotations/annotationInheritance.kt | 8 ++++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 5 files changed, 19 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/annotations/annotationInheritance.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index ee8568a8683..3b9a60cd4c2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -111,6 +111,7 @@ public interface Errors { // Annotations + DiagnosticFactory0 SUPERTYPES_FOR_ANNOTATION_CLASS = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 MISSING_VAL_ON_ANNOTATION_PARAMETER = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 ANNOTATION_CLASS_CONSTRUCTOR_CALL = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 693535507fb..b399e132aa2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -451,6 +451,7 @@ public class DefaultErrorMessages { MAP.put(TYPE_PARAMETER_AS_REIFIED, "Cannot use ''{0}'' as reified type parameter. Use a class instead.", NAME); + MAP.put(SUPERTYPES_FOR_ANNOTATION_CLASS, "Annotation class cannot have supertypes"); MAP.put(MISSING_VAL_ON_ANNOTATION_PARAMETER, "'val' keyword is missing on annotation parameter"); MAP.put(ANNOTATION_CLASS_CONSTRUCTOR_CALL, "Annotation class cannot be instantiated"); MAP.put(NOT_AN_ANNOTATION_CLASS, "''{0}'' is not an annotation class", TO_STRING); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index d852eac0379..2c09faf6d2a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -283,6 +283,10 @@ public class BodyResolver { delegationSpecifier.accept(visitor); } + if (DescriptorUtils.isAnnotationClass(descriptor) && jetClass.getDelegationSpecifierList() != null) { + trace.report(SUPERTYPES_FOR_ANNOTATION_CLASS.on(jetClass.getDelegationSpecifierList())); + } + Set parentEnum = jetClass instanceof JetEnumEntry ? Collections.singleton(((ClassDescriptor) descriptor.getContainingDeclaration()).getTypeConstructor()) diff --git a/compiler/testData/diagnostics/tests/annotations/annotationInheritance.kt b/compiler/testData/diagnostics/tests/annotations/annotationInheritance.kt new file mode 100644 index 00000000000..62870d6b0ab --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/annotationInheritance.kt @@ -0,0 +1,8 @@ +val a = object: T {} +open class C +trait T + +annotation class Ann: C() +annotation class Ann2: T +annotation class Ann3: T by a +annotation class Ann4: C(), T \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index b8f51ce6a06..59956d12b0d 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -540,6 +540,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/annotations/AnnotationForObject.kt"); } + @TestMetadata("annotationInheritance.kt") + public void testAnnotationInheritance() throws Exception { + doTest("compiler/testData/diagnostics/tests/annotations/annotationInheritance.kt"); + } + @TestMetadata("annotationModifier.kt") public void testAnnotationModifier() throws Exception { doTest("compiler/testData/diagnostics/tests/annotations/annotationModifier.kt");