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 512286da2ea..170bdb50f36 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -116,6 +116,8 @@ public interface Errors { DiagnosticFactory0 ANNOTATION_CLASS_WITH_BODY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 INVALID_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 NULLABLE_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 ILLEGAL_ANNOTATION_KEYWORD = DiagnosticFactory0 + .create(ERROR, modifierSetPosition(JetTokens.ANNOTATION_KEYWORD)); // Classes and traits 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 f3124bddb83..babddf27d93 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 @@ -436,6 +436,7 @@ public class DefaultErrorMessages { MAP.put(ANNOTATION_CLASS_WITH_BODY, "Body is not allowed for annotation class"); MAP.put(INVALID_TYPE_OF_ANNOTATION_MEMBER, "Invalid type of annotation member"); MAP.put(NULLABLE_TYPE_OF_ANNOTATION_MEMBER, "An annotation parameter cannot be nullable"); + MAP.put(ILLEGAL_ANNOTATION_KEYWORD, "''annotation'' keyword is only applicable for class"); MAP.put(DEFAULT_VALUE_NOT_ALLOWED_IN_OVERRIDE, "An overriding function is not allowed to specify default values for its parameters"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 8e152184462..53db624a27f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -90,14 +90,17 @@ public class DeclarationsChecker { } - private void reportErrorIfHasEnumModifier(JetModifierListOwner declaration) { + private void reportErrorIfHasIllegalModifier(JetModifierListOwner declaration) { if (declaration.hasModifier(JetTokens.ENUM_KEYWORD)) { trace.report(ILLEGAL_ENUM_ANNOTATION.on(declaration)); } + if (declaration.hasModifier(JetTokens.ANNOTATION_KEYWORD)) { + trace.report(ILLEGAL_ANNOTATION_KEYWORD.on(declaration)); + } } private void checkObject(JetObjectDeclaration declaration) { - reportErrorIfHasEnumModifier(declaration); + reportErrorIfHasIllegalModifier(declaration); } private void checkClass(JetClass aClass, MutableClassDescriptor classDescriptor) { @@ -114,7 +117,7 @@ public class DeclarationsChecker { } private void checkTraitModifiers(JetClass aClass) { - reportErrorIfHasEnumModifier(aClass); + reportErrorIfHasIllegalModifier(aClass); JetModifierList modifierList = aClass.getModifierList(); if (modifierList == null) return; if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) { @@ -140,7 +143,7 @@ public class DeclarationsChecker { } private void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor) { - reportErrorIfHasEnumModifier(property); + reportErrorIfHasIllegalModifier(property); DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); if (containingDeclaration instanceof ClassDescriptor) { checkPropertyAbstractness(property, propertyDescriptor, (ClassDescriptor) containingDeclaration); @@ -270,7 +273,7 @@ public class DeclarationsChecker { } protected void checkFunction(JetNamedFunction function, SimpleFunctionDescriptor functionDescriptor) { - reportErrorIfHasEnumModifier(function); + reportErrorIfHasIllegalModifier(function); DeclarationDescriptor containingDescriptor = functionDescriptor.getContainingDeclaration(); boolean hasAbstractModifier = function.hasModifier(JetTokens.ABSTRACT_KEYWORD); checkDeclaredTypeInPublicMember(function, functionDescriptor); diff --git a/compiler/testData/diagnostics/tests/annotations/annotationModifier.kt b/compiler/testData/diagnostics/tests/annotations/annotationModifier.kt new file mode 100644 index 00000000000..5327b8ef680 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/annotationModifier.kt @@ -0,0 +1,15 @@ +annotation class B + +class A { + annotation class object {} +} + +annotation object O {} + +annotation trait T {} + +annotation fun f() = 0 + +annotation val x = 0 + +annotation var y = 0 diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 530f0bbe8a7..0fdc118a9c7 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -550,6 +550,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/annotations/AnnotationForObject.kt"); } + @TestMetadata("annotationModifier.kt") + public void testAnnotationModifier() throws Exception { + doTest("compiler/testData/diagnostics/tests/annotations/annotationModifier.kt"); + } + @TestMetadata("AnnotationsForClasses.kt") public void testAnnotationsForClasses() throws Exception { doTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt");