From 3e90d367f2f6a3b06e159bf5c66b46e283c059f2 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 19 Sep 2018 21:10:47 +0300 Subject: [PATCH] Do not report experimental usage errors in import statements #KT-25545 Fixed --- .../checkers/ExperimentalUsageChecker.kt | 9 ++++--- .../experimental/importStatement.kt | 27 +++++++++++++++++++ .../experimental/importStatement.txt | 27 +++++++++++++++++++ .../DiagnosticsTestWithStdLibGenerated.java | 5 ++++ ...ticsTestWithStdLibUsingJavacGenerated.java | 5 ++++ 5 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.txt 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 f01d9aab3a4..27006af6f3e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentQualifiedExpressionForSelector import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker @@ -263,9 +264,6 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { } } - val experimentalities = targetDescriptor.loadExperimentalities(moduleAnnotationsResolver, context.languageVersionSettings) - reportNotAcceptedExperimentalities(experimentalities, element, context) - val targetClass = when (targetDescriptor) { is ClassDescriptor -> targetDescriptor is TypeAliasDescriptor -> targetDescriptor.classDescriptor @@ -280,6 +278,11 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { ) } } + + if (element.getParentOfType(false) == null) { + val experimentalities = targetDescriptor.loadExperimentalities(moduleAnnotationsResolver, context.languageVersionSettings) + reportNotAcceptedExperimentalities(experimentalities, element, context) + } } private fun checkUsageOfKotlinExperimentalOrUseExperimental(element: PsiElement, context: CheckerContext) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt new file mode 100644 index 00000000000..724647e4367 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt @@ -0,0 +1,27 @@ +// !USE_EXPERIMENTAL: kotlin.Experimental +// FILE: api.kt + +package feature.experimental.self + +@Experimental +annotation class ImportedMarker + +@ImportedMarker +object ImportedClass { + @ImportedMarker + fun importedObjectMember() {} +} + +@ImportedMarker +fun importedFunction() {} + +@ImportedMarker +val importedProperty = Unit + +// FILE: usage.kt + +import feature.experimental.self.ImportedMarker +import feature.experimental.self.ImportedClass +import feature.experimental.self.importedFunction +import feature.experimental.self.importedProperty +import feature.experimental.self.ImportedClass.importedObjectMember diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.txt b/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.txt new file mode 100644 index 00000000000..95bd83d66d3 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.txt @@ -0,0 +1,27 @@ +package + +package feature { + + package feature.experimental { + + package feature.experimental.self { + @feature.experimental.self.ImportedMarker public val importedProperty: kotlin.Unit + @feature.experimental.self.ImportedMarker public fun importedFunction(): kotlin.Unit + + @feature.experimental.self.ImportedMarker public object ImportedClass { + private constructor ImportedClass() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + @feature.experimental.self.ImportedMarker public final fun importedObjectMember(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + @kotlin.Experimental public final annotation class ImportedMarker : kotlin.Annotation { + public constructor ImportedMarker() + 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 + } + } + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 4fd1ac6e5a7..3052ead2857 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -2407,6 +2407,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalUnsignedLiterals.kt"); } + @TestMetadata("importStatement.kt") + public void testImportStatement() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt"); + } + @TestMetadata("incorrectTargetsForExperimentalAnnotation.kt") public void testIncorrectTargetsForExperimentalAnnotation() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index e9e9e79aa30..74577b951f9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -2407,6 +2407,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/experimentalUnsignedLiterals.kt"); } + @TestMetadata("importStatement.kt") + public void testImportStatement() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/importStatement.kt"); + } + @TestMetadata("incorrectTargetsForExperimentalAnnotation.kt") public void testIncorrectTargetsForExperimentalAnnotation() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/incorrectTargetsForExperimentalAnnotation.kt");