'annotation' keyword should be allowed only on classes

#KT-2785 Fixed
This commit is contained in:
Natalia.Ukhorskaya
2013-07-25 16:15:00 +04:00
parent 09b163069f
commit e11f130278
5 changed files with 31 additions and 5 deletions
@@ -116,6 +116,8 @@ public interface Errors {
DiagnosticFactory0<PsiElement> ANNOTATION_CLASS_WITH_BODY = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<JetTypeReference> INVALID_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<JetTypeReference> NULLABLE_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<JetModifierListOwner> ILLEGAL_ANNOTATION_KEYWORD = DiagnosticFactory0
.create(ERROR, modifierSetPosition(JetTokens.ANNOTATION_KEYWORD));
// Classes and traits
@@ -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");
@@ -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);
@@ -0,0 +1,15 @@
annotation class B
class A {
<!ILLEGAL_ANNOTATION_KEYWORD!>annotation<!> class object {}
}
<!ILLEGAL_ANNOTATION_KEYWORD!>annotation<!> object O {}
<!ILLEGAL_ANNOTATION_KEYWORD!>annotation<!> trait T {}
<!ILLEGAL_ANNOTATION_KEYWORD!>annotation<!> fun f() = 0
<!ILLEGAL_ANNOTATION_KEYWORD!>annotation<!> val x = 0
<!ILLEGAL_ANNOTATION_KEYWORD!>annotation<!> var y = 0
@@ -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");