Do not report experimental usage errors in import statements

#KT-25545 Fixed
This commit is contained in:
Alexander Udalov
2018-09-19 21:10:47 +03:00
parent 9d27771f86
commit 3e90d367f2
5 changed files with 70 additions and 3 deletions
@@ -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<KtImportDirective>(false) == null) {
val experimentalities = targetDescriptor.loadExperimentalities(moduleAnnotationsResolver, context.languageVersionSettings)
reportNotAcceptedExperimentalities(experimentalities, element, context)
}
}
private fun checkUsageOfKotlinExperimentalOrUseExperimental(element: PsiElement, context: CheckerContext) {
@@ -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
@@ -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
}
}
}
}
@@ -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");
@@ -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");