From cce6b952bd6812bace714fcf7345fa79f9ee8148 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Wed, 18 Dec 2013 19:16:45 +0400 Subject: [PATCH] Add warning when 'val' keyword on annotation parameter is missing #KT-1900 --- .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 1 + .../jet/lang/diagnostics/rendering/DefaultErrorMessages.java | 1 + .../org/jetbrains/jet/lang/resolve/DeclarationResolver.java | 5 +++++ .../diagnostics/tests/annotations/BasicAnnotations.kt | 4 ++-- .../diagnostics/tests/annotations/kt1886annotationBody.kt | 2 +- .../diagnostics/tests/annotations/missingValOnParameter.kt | 5 +++++ .../jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 7 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/annotations/missingValOnParameter.kt 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 3419eb1a879..ee8568a8683 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -111,6 +111,7 @@ public interface Errors { // Annotations + DiagnosticFactory0 MISSING_VAL_ON_ANNOTATION_PARAMETER = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 ANNOTATION_CLASS_CONSTRUCTOR_CALL = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 NOT_AN_ANNOTATION_CLASS = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 ANNOTATION_CLASS_WITH_BODY = DiagnosticFactory0.create(ERROR); 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 d5162dadaaf..693535507fb 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 @@ -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(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(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"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 53b86ee8497..719aa1fb8a7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -277,6 +277,8 @@ public class DeclarationResolver { } } + boolean isAnnotationClass = DescriptorUtils.isAnnotationClass(classDescriptor); + // TODO : not all the parameters are real properties JetScope memberScope = classDescriptor.getScopeForSupertypeResolution(); ConstructorDescriptor constructorDescriptor = descriptorResolver.resolvePrimaryConstructorDescriptor(memberScope, classDescriptor, klass, trace); @@ -298,6 +300,9 @@ public class DeclarationResolver { context.getPrimaryConstructorParameterProperties().put(parameter, propertyDescriptor); } else { + if (isAnnotationClass) { + trace.report(MISSING_VAL_ON_ANNOTATION_PARAMETER.on(parameter)); + } notProperties.add(valueParameterDescriptor); } } diff --git a/compiler/testData/diagnostics/tests/annotations/BasicAnnotations.kt b/compiler/testData/diagnostics/tests/annotations/BasicAnnotations.kt index 3c87fee5d72..95df6b01ccc 100644 --- a/compiler/testData/diagnostics/tests/annotations/BasicAnnotations.kt +++ b/compiler/testData/diagnostics/tests/annotations/BasicAnnotations.kt @@ -1,6 +1,6 @@ annotation class my -annotation class my1(i : Int) -annotation class my2(i : Int = 0) +annotation class my1(val i : Int) +annotation class my2(val i : Int = 0) my fun foo() {} my1 fun foo2() {} diff --git a/compiler/testData/diagnostics/tests/annotations/kt1886annotationBody.kt b/compiler/testData/diagnostics/tests/annotations/kt1886annotationBody.kt index d298cdb4e4c..9e4df8a205b 100644 --- a/compiler/testData/diagnostics/tests/annotations/kt1886annotationBody.kt +++ b/compiler/testData/diagnostics/tests/annotations/kt1886annotationBody.kt @@ -24,6 +24,6 @@ annotation class Annotation7(val name: String) {}< annotation class Annotation8(var name: String = "") {} -annotation class Annotation9(name: String) +annotation class Annotation9(val name: String) annotation class Annotation10 diff --git a/compiler/testData/diagnostics/tests/annotations/missingValOnParameter.kt b/compiler/testData/diagnostics/tests/annotations/missingValOnParameter.kt new file mode 100644 index 00000000000..799a8989e9d --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/missingValOnParameter.kt @@ -0,0 +1,5 @@ +annotation class Ann( + val a: Int, + var b: Int, + c: String + ) diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index c9cf1490751..b8f51ce6a06 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -610,6 +610,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/annotations/kt1886annotationBody.kt"); } + @TestMetadata("missingValOnParameter.kt") + public void testMissingValOnParameter() throws Exception { + doTest("compiler/testData/diagnostics/tests/annotations/missingValOnParameter.kt"); + } + @TestMetadata("NonAnnotationClass.kt") public void testNonAnnotationClass() throws Exception { doTest("compiler/testData/diagnostics/tests/annotations/NonAnnotationClass.kt");