From 73934656969e19bb7435645d299c448af721b6ff Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 19 May 2021 16:14:52 +0300 Subject: [PATCH] Don't report EXPERIMENTAL_OVERRIDE_ERROR on annotated local functions #KT-31728 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 6 +++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 +++++ .../checkers/ExperimentalUsageChecker.kt | 3 +-- .../experimental/overrideInAnonymousObject.kt | 23 +++++++++++++++++++ .../overrideInAnonymousObject.txt | 18 +++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ ...CompilerTestFE10TestdataTestGenerated.java | 5 ++++ 7 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.txt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 68a2811ea1e..3be58c0c16c 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -34339,6 +34339,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt"); } + @Test + @TestMetadata("overrideInAnonymousObject.kt") + public void testOverrideInAnonymousObject() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt"); + } + @Test @TestMetadata("topLevel.kt") public void testTopLevel() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 03c74ac6ea0..b3e352a93dd 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -34339,6 +34339,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt"); } + @Test + @TestMetadata("overrideInAnonymousObject.kt") + public void testOverrideInAnonymousObject() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt"); + } + @Test @TestMetadata("topLevel.kt") public void testTopLevel() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt index 2be5174a0fc..5b8aab4b64c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt @@ -214,8 +214,7 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { if (this !is KtDeclaration) return false val descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, this) - return descriptor != null && !DescriptorUtils.isLocal(descriptor) && - descriptor.annotations.hasAnnotation(annotationFqName) + return descriptor != null && descriptor.annotations.hasAnnotation(annotationFqName) } private fun PsiElement.isElementAnnotatedWithUseExperimentalOf(annotationFqName: FqName, bindingContext: BindingContext): Boolean { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt new file mode 100644 index 00000000000..aed41ab4f9f --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt @@ -0,0 +1,23 @@ +// FIR_IDENTICAL +// !USE_EXPERIMENTAL: kotlin.RequiresOptIn + +@RequiresOptIn +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) +annotation class MyAnn + +interface MyInterface { + @MyAnn + fun foo() + + @MyAnn + fun bar() +} + +val field = object : MyInterface { + @MyAnn + override fun foo() {} + + @OptIn(MyAnn::class) + override fun bar() {} +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.txt new file mode 100644 index 00000000000..eea12fcf2ce --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.txt @@ -0,0 +1,18 @@ +package + +public val field: MyInterface + +@kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION}) public final annotation class MyAnn : kotlin.Annotation { + public constructor MyAnn() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface MyInterface { + @MyAnn public abstract fun bar(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @MyAnn public abstract fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index ba45e67e885..6d1c8af712b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -34435,6 +34435,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt"); } + @Test + @TestMetadata("overrideInAnonymousObject.kt") + public void testOverrideInAnonymousObject() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt"); + } + @Test @TestMetadata("topLevel.kt") public void testTopLevel() throws Exception { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 979462e1402..9c033c773ac 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -30151,6 +30151,11 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideDifferentExperimentalities.kt"); } + @TestMetadata("overrideInAnonymousObject.kt") + public void testOverrideInAnonymousObject() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt"); + } + @TestMetadata("topLevel.kt") public void testTopLevel() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/topLevel.kt");