From 89af94be950b22739fa15ca328733b9e54cbdfca Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 4 Apr 2018 12:49:50 +0200 Subject: [PATCH] Report warning (1.2) or error (1.3) on local annotations #KT-23277 Fixed #KT-23589 Fixed --- .../jetbrains/kotlin/diagnostics/Errors.java | 3 +++ .../rendering/DefaultErrorMessages.java | 3 +++ .../kotlin/resolve/DeclarationsChecker.kt | 11 ++++++++++ .../localClasses/localAnnotationClass.kt | 9 ++++++++ .../localClasses/localAnnotationClass.txt | 3 +++ .../localClasses/localAnnotationClassError.kt | 9 ++++++++ .../localAnnotationClassError.txt | 3 +++ .../checkers/DiagnosticsTestGenerated.java | 21 +++++++++++++++++++ .../DiagnosticsUsingJavacTestGenerated.java | 21 +++++++++++++++++++ .../kotlin/config/LanguageVersionSettings.kt | 8 +++---- 10 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.kt create mode 100644 compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.txt create mode 100644 compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.kt create mode 100644 compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 4fe13c7a459..dd4b4e1531f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -227,6 +227,9 @@ public interface Errors { DiagnosticFactory0 ANNOTATION_USED_AS_ANNOTATION_ARGUMENT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 ANNOTATION_ARGUMENT_IS_NON_CONST = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 LOCAL_ANNOTATION_CLASS = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 LOCAL_ANNOTATION_CLASS_ERROR = DiagnosticFactory0.create(ERROR); + DiagnosticFactory1 ILLEGAL_KOTLIN_VERSION_STRING_VALUE = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 NEWER_VERSION_IN_SINCE_KOTLIN = DiagnosticFactory1.create(WARNING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index e33f35f9da6..6dd3c1346ec 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -831,6 +831,9 @@ public class DefaultErrorMessages { MAP.put(ANNOTATION_USED_AS_ANNOTATION_ARGUMENT, "An annotation can't be used as the annotations argument"); MAP.put(ANNOTATION_ARGUMENT_IS_NON_CONST, "An annotation argument must be a compile-time constant"); + MAP.put(LOCAL_ANNOTATION_CLASS, "Local annotation classes are deprecated and will be unsupported in a future release"); + MAP.put(LOCAL_ANNOTATION_CLASS_ERROR, "Annotation class cannot be local"); + MAP.put(CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT, "Const 'val' are only allowed on top level or in objects"); MAP.put(CONST_VAL_WITH_DELEGATE, "Const 'val' should not have a delegate"); MAP.put(CONST_VAL_WITH_GETTER, "Const 'val' should not have a getter"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 46378209cf6..b4848d70b6c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -309,6 +309,7 @@ class DeclarationsChecker( private fun checkClass(classDescriptor: ClassDescriptorWithResolutionScopes, classOrObject: KtClassOrObject) { checkSupertypesForConsistency(classDescriptor, classOrObject) + checkLocalAnnotation(classDescriptor, classOrObject) checkTypesInClassHeader(classOrObject) when (classOrObject) { @@ -328,6 +329,16 @@ class DeclarationsChecker( checkPrivateExpectedDeclaration(classOrObject, classDescriptor) } + private fun checkLocalAnnotation(classDescriptor: ClassDescriptor, classOrObject: KtClassOrObject) { + if (classDescriptor.kind == ClassKind.ANNOTATION_CLASS && DescriptorUtils.isLocal(classDescriptor)) { + if (languageVersionSettings.supportsFeature(LanguageFeature.ProhibitLocalAnnotations)) { + trace.report(LOCAL_ANNOTATION_CLASS_ERROR.on(classOrObject)) + } else { + trace.report(LOCAL_ANNOTATION_CLASS.on(classOrObject)) + } + } + } + private fun checkTypesInClassHeader(classOrObject: KtClassOrObject) { fun KtTypeReference.type(): KotlinType? = trace.bindingContext.get(TYPE, this) diff --git a/compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.kt b/compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.kt new file mode 100644 index 00000000000..26eef4232be --- /dev/null +++ b/compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: -ProhibitLocalAnnotations + +fun f() { + annotation class Anno + + @Anno class Local { + annotation class Nested + } +} diff --git a/compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.txt b/compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.txt new file mode 100644 index 00000000000..c0c05c8eaba --- /dev/null +++ b/compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.txt @@ -0,0 +1,3 @@ +package + +public fun f(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.kt b/compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.kt new file mode 100644 index 00000000000..835df6f3cab --- /dev/null +++ b/compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.kt @@ -0,0 +1,9 @@ +// !LANGUAGE: +ProhibitLocalAnnotations + +fun f() { + annotation class Anno + + @Anno class Local { + annotation class Nested + } +} diff --git a/compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.txt b/compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.txt new file mode 100644 index 00000000000..c0c05c8eaba --- /dev/null +++ b/compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.txt @@ -0,0 +1,3 @@ +package + +public fun f(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 98fd66576a6..b54816bc196 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13692,6 +13692,27 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { } } + @TestMetadata("compiler/testData/diagnostics/tests/localClasses") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class LocalClasses extends AbstractDiagnosticsTest { + public void testAllFilesPresentInLocalClasses() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/localClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("localAnnotationClass.kt") + public void testLocalAnnotationClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.kt"); + doTest(fileName); + } + + @TestMetadata("localAnnotationClassError.kt") + public void testLocalAnnotationClassError() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/diagnostics/tests/modifiers") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 9869a5b8361..4b65701ce59 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -13692,6 +13692,27 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing } } + @TestMetadata("compiler/testData/diagnostics/tests/localClasses") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class LocalClasses extends AbstractDiagnosticsUsingJavacTest { + public void testAllFilesPresentInLocalClasses() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/localClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("localAnnotationClass.kt") + public void testLocalAnnotationClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/localClasses/localAnnotationClass.kt"); + doTest(fileName); + } + + @TestMetadata("localAnnotationClassError.kt") + public void testLocalAnnotationClassError() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/localClasses/localAnnotationClassError.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/diagnostics/tests/modifiers") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index f091f0e07ca..326149f04b8 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -68,14 +68,14 @@ enum class LanguageFeature( InlineClasses(KOTLIN_1_3), ProhibitVisibilityOfNestedClassifiersFromSupertypesOfCompanion(KOTLIN_1_3), ProhibitNonConstValuesAsVarargsInAnnotations(KOTLIN_1_3), - - StrictJavaNullabilityAssertions(sinceVersion = null, defaultState = State.DISABLED), - ProperIeee754Comparisons(sinceVersion = null, defaultState = State.DISABLED), - ReadDeserializedContracts(KOTLIN_1_3), UseReturnsEffect(KOTLIN_1_3), UseCallsInPlaceEffect(KOTLIN_1_3), AllowContractsForCustomFunctions(KOTLIN_1_3), + ProhibitLocalAnnotations(KOTLIN_1_3), + + StrictJavaNullabilityAssertions(sinceVersion = null, defaultState = State.DISABLED), + ProperIeee754Comparisons(sinceVersion = null, defaultState = State.DISABLED), // Experimental features