Annotations inheritance. Either prohibit or implement correctly #KT-3225 Fixed
This commit is contained in:
@@ -111,6 +111,7 @@ public interface Errors {
|
|||||||
|
|
||||||
// Annotations
|
// Annotations
|
||||||
|
|
||||||
|
DiagnosticFactory0<JetDelegationSpecifierList> SUPERTYPES_FOR_ANNOTATION_CLASS = DiagnosticFactory0.create(ERROR);
|
||||||
DiagnosticFactory0<JetParameter> MISSING_VAL_ON_ANNOTATION_PARAMETER = DiagnosticFactory0.create(WARNING);
|
DiagnosticFactory0<JetParameter> MISSING_VAL_ON_ANNOTATION_PARAMETER = DiagnosticFactory0.create(WARNING);
|
||||||
DiagnosticFactory0<JetCallExpression> ANNOTATION_CLASS_CONSTRUCTOR_CALL = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<JetCallExpression> ANNOTATION_CLASS_CONSTRUCTOR_CALL = DiagnosticFactory0.create(ERROR);
|
||||||
DiagnosticFactory1<JetAnnotationEntry, String> NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<JetAnnotationEntry, String> NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR);
|
||||||
|
|||||||
+1
@@ -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(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(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(ANNOTATION_CLASS_CONSTRUCTOR_CALL, "Annotation class cannot be instantiated");
|
||||||
MAP.put(NOT_AN_ANNOTATION_CLASS, "''{0}'' is not an annotation class", TO_STRING);
|
MAP.put(NOT_AN_ANNOTATION_CLASS, "''{0}'' is not an annotation class", TO_STRING);
|
||||||
|
|||||||
@@ -283,6 +283,10 @@ public class BodyResolver {
|
|||||||
delegationSpecifier.accept(visitor);
|
delegationSpecifier.accept(visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DescriptorUtils.isAnnotationClass(descriptor) && jetClass.getDelegationSpecifierList() != null) {
|
||||||
|
trace.report(SUPERTYPES_FOR_ANNOTATION_CLASS.on(jetClass.getDelegationSpecifierList()));
|
||||||
|
}
|
||||||
|
|
||||||
Set<TypeConstructor> parentEnum =
|
Set<TypeConstructor> parentEnum =
|
||||||
jetClass instanceof JetEnumEntry
|
jetClass instanceof JetEnumEntry
|
||||||
? Collections.singleton(((ClassDescriptor) descriptor.getContainingDeclaration()).getTypeConstructor())
|
? Collections.singleton(((ClassDescriptor) descriptor.getContainingDeclaration()).getTypeConstructor())
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
val a = object: T {}
|
||||||
|
open class C
|
||||||
|
trait T
|
||||||
|
|
||||||
|
annotation class Ann: <!SUPERTYPES_FOR_ANNOTATION_CLASS!>C()<!>
|
||||||
|
annotation class Ann2: <!SUPERTYPES_FOR_ANNOTATION_CLASS!>T<!>
|
||||||
|
annotation class Ann3: <!SUPERTYPES_FOR_ANNOTATION_CLASS!>T by a<!>
|
||||||
|
annotation class Ann4: <!SUPERTYPES_FOR_ANNOTATION_CLASS!>C(), T<!>
|
||||||
@@ -540,6 +540,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
|||||||
doTest("compiler/testData/diagnostics/tests/annotations/AnnotationForObject.kt");
|
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")
|
@TestMetadata("annotationModifier.kt")
|
||||||
public void testAnnotationModifier() throws Exception {
|
public void testAnnotationModifier() throws Exception {
|
||||||
doTest("compiler/testData/diagnostics/tests/annotations/annotationModifier.kt");
|
doTest("compiler/testData/diagnostics/tests/annotations/annotationModifier.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user