Support nested classes in annotation classes
#KT-16962 In Progress
This commit is contained in:
@@ -225,7 +225,7 @@ public interface Errors {
|
||||
DiagnosticFactory0<KtParameter> VAR_ANNOTATION_PARAMETER = DiagnosticFactory0.create(ERROR, VAL_OR_VAR_NODE);
|
||||
DiagnosticFactory0<KtCallExpression> ANNOTATION_CLASS_CONSTRUCTOR_CALL = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory1<KtAnnotationEntry, DeclarationDescriptor> NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR);
|
||||
DiagnosticFactory0<PsiElement> ANNOTATION_CLASS_WITH_BODY = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<PsiElement> ANNOTATION_CLASS_MEMBER = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<KtTypeReference> INVALID_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<KtTypeReference> NULLABLE_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<KtExpression> ANNOTATION_PARAMETER_MUST_BE_CONST = DiagnosticFactory0.create(ERROR);
|
||||
|
||||
+1
-1
@@ -790,7 +790,7 @@ public class DefaultErrorMessages {
|
||||
MAP.put(VAR_ANNOTATION_PARAMETER, "An annotation parameter cannot be 'var'");
|
||||
MAP.put(ANNOTATION_CLASS_CONSTRUCTOR_CALL, "Annotation class cannot be instantiated");
|
||||
MAP.put(NOT_AN_ANNOTATION_CLASS, "''{0}'' is not an annotation class", NAME);
|
||||
MAP.put(ANNOTATION_CLASS_WITH_BODY, "Body is not allowed for annotation class");
|
||||
MAP.put(ANNOTATION_CLASS_MEMBER, "Members are not allowed in 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(ANNOTATION_PARAMETER_MUST_BE_CONST, "An annotation parameter must be a compile-time constant");
|
||||
|
||||
@@ -449,7 +449,7 @@ class DeclarationsChecker(
|
||||
}
|
||||
}
|
||||
classDescriptor.kind == ClassKind.ANNOTATION_CLASS -> {
|
||||
checkAnnotationClassWithBody(aClass)
|
||||
checkAnnotationClassMembers(aClass)
|
||||
checkValOnAnnotationParameter(aClass)
|
||||
}
|
||||
aClass is KtEnumEntry -> checkEnumEntry(aClass, classDescriptor)
|
||||
@@ -524,8 +524,13 @@ class DeclarationsChecker(
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkAnnotationClassWithBody(classOrObject: KtClassOrObject) {
|
||||
classOrObject.getBody()?.let { trace.report(ANNOTATION_CLASS_WITH_BODY.on(it)) }
|
||||
private fun checkAnnotationClassMembers(classOrObject: KtClassOrObject) {
|
||||
for (declaration in classOrObject.declarations) {
|
||||
if (declaration !is KtClassOrObject ||
|
||||
!languageVersionSettings.supportsFeature(LanguageFeature.NestedClassesInAnnotations)) {
|
||||
trace.report(ANNOTATION_CLASS_MEMBER.on(declaration))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkValOnAnnotationParameter(aClass: KtClass) {
|
||||
|
||||
@@ -158,7 +158,7 @@ object ModifierCheckerCore {
|
||||
PROTECTED_KEYWORD to always(CLASS_ONLY, LOCAL_CLASS, ENUM_CLASS, COMPANION_OBJECT),
|
||||
INTERNAL_KEYWORD to always(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, ENUM_CLASS, ENUM_ENTRY, FILE),
|
||||
PRIVATE_KEYWORD to always(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, INTERFACE, ENUM_CLASS, ENUM_ENTRY, FILE),
|
||||
COMPANION_KEYWORD to always(CLASS_ONLY, ENUM_CLASS, INTERFACE),
|
||||
COMPANION_KEYWORD to always(CLASS_ONLY, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS),
|
||||
FINAL_KEYWORD to always(CLASS_ONLY, LOCAL_CLASS, OBJECT, OBJECT_LITERAL, ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, FILE),
|
||||
VARARG_KEYWORD to always(CONSTRUCTOR, FUNCTION, CLASS)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user