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 ed4de016321..512286da2ea 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -115,6 +115,7 @@ public interface Errors { DiagnosticFactory1 NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR); 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); // 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 b578856dff6..f3124bddb83 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 @@ -435,6 +435,7 @@ public class DefaultErrorMessages { MAP.put(NOT_AN_ANNOTATION_CLASS, "''{0}'' is not an annotation class", TO_STRING); 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(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/AnnotationUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationUtils.java index 947f0a498f2..8c298ec0284 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationUtils.java @@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.List; import static org.jetbrains.jet.lang.diagnostics.Errors.INVALID_TYPE_OF_ANNOTATION_MEMBER; +import static org.jetbrains.jet.lang.diagnostics.Errors.NULLABLE_TYPE_OF_ANNOTATION_MEMBER; import static org.jetbrains.jet.lang.resolve.BindingContext.VALUE_PARAMETER; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isAnnotationClass; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClass; @@ -42,9 +43,12 @@ public class AnnotationUtils { VariableDescriptor parameterDescriptor = trace.getBindingContext().get(VALUE_PARAMETER, parameter); if (parameterDescriptor == null) continue; JetType parameterType = parameterDescriptor.getType(); - if (!isAcceptableTypeForAnnotationParameter(parameterType)) { - JetTypeReference typeReference = parameter.getTypeReference(); - if (typeReference != null) { + JetTypeReference typeReference = parameter.getTypeReference(); + if (typeReference != null) { + if (parameterType.isNullable()) { + trace.report(NULLABLE_TYPE_OF_ANNOTATION_MEMBER.on(typeReference)); + } + else if (!isAcceptableTypeForAnnotationParameter(parameterType)) { trace.report(INVALID_TYPE_OF_ANNOTATION_MEMBER.on(typeReference)); } } @@ -52,9 +56,6 @@ public class AnnotationUtils { } private static boolean isAcceptableTypeForAnnotationParameter(@NotNull JetType parameterType) { - if (parameterType.isNullable()) { - return false; - } ClassDescriptor typeDescriptor = TypeUtils.getClassDescriptor(parameterType); if (typeDescriptor == null) { return false; diff --git a/compiler/testData/diagnostics/tests/annotations/invalidTypesInAnnotationConstructor.kt b/compiler/testData/diagnostics/tests/annotations/invalidTypesInAnnotationConstructor.kt index 0f3c448614e..2abd3811cac 100644 --- a/compiler/testData/diagnostics/tests/annotations/invalidTypesInAnnotationConstructor.kt +++ b/compiler/testData/diagnostics/tests/annotations/invalidTypesInAnnotationConstructor.kt @@ -40,19 +40,19 @@ annotation class Ann9(vararg val p1: String, vararg val p5: Int) // INCORRECT -annotation class InAnn1(val p1: Int?, - val p3: Short?, - val p4: Long?, - val p5: Double?, - val p6: Float?, - val p7: Char?, - val p8: Boolean?) +annotation class InAnn1(val p1: Int?, + val p3: Short?, + val p4: Long?, + val p5: Double?, + val p6: Float?, + val p7: Char?, + val p8: Boolean?) annotation class InAnn4(val p1: Array, - val p2: Array?) + val p2: Array?) -annotation class InAnn6(val p: Class<*>?) -annotation class InAnn7(val p: RetentionPolicy?) +annotation class InAnn6(val p: Class<*>?) +annotation class InAnn7(val p: RetentionPolicy?) annotation class InAnn8(val p1: Array, val p2: Array, val p3: Array, @@ -60,9 +60,9 @@ annotation class InAnn8(val p1: Array< annotation class InAnn9(val p: MyClass) -annotation class InAnn10(val p1: String?) -annotation class InAnn11(val p1: Ann1?) -annotation class InAnn12(val p1: MyEnum?) +annotation class InAnn10(val p1: String?) +annotation class InAnn11(val p1: Ann1?) +annotation class InAnn12(val p1: MyEnum?) enum class MyEnum {