Check experimental API markers for deprecation
#KT-22759 In Progress
This commit is contained in:
+24
-2
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.resolve.constants.KClassValue
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.utils.SmartSet
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
|
||||
@@ -237,7 +238,17 @@ object ExperimentalUsageChecker : CallChecker {
|
||||
}
|
||||
}
|
||||
|
||||
fun checkCompilerArguments(module: ModuleDescriptor, languageVersionSettings: LanguageVersionSettings, reportError: (String) -> Unit) {
|
||||
fun checkCompilerArguments(
|
||||
module: ModuleDescriptor,
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
reportError: (String) -> Unit,
|
||||
reportWarning: (String) -> Unit
|
||||
) {
|
||||
// Ideally, we should run full resolution (with all classifier usage checkers) on classifiers used in "-Xexperimental" and
|
||||
// "-Xuse-experimental" arguments. However, it's not easy to do this. This should be solved in the future with the support of
|
||||
// module annotations. For now, we only check deprecations because this is needed to correctly retire unneeded compiler arguments.
|
||||
val deprecationResolver = DeprecationResolver(LockBasedStorageManager(), languageVersionSettings)
|
||||
|
||||
fun checkAnnotation(fqName: String, allowNonCompilationImpact: Boolean): Boolean {
|
||||
val descriptor = module.resolveClassByFqName(FqName(fqName), NoLookupLocation.FOR_NON_TRACKED_SCOPE)
|
||||
val experimentality = descriptor?.loadExperimentalityForMarkerAnnotation()
|
||||
@@ -250,9 +261,20 @@ object ExperimentalUsageChecker : CallChecker {
|
||||
!allowNonCompilationImpact && !experimentality.impact.all(Experimentality.Impact.COMPILATION::equals) ->
|
||||
"Experimental API marker $fqName has impact other than COMPILATION, " +
|
||||
"therefore it can't be used with -Xuse-experimental"
|
||||
else -> return true
|
||||
else -> {
|
||||
for (deprecation in deprecationResolver.getDeprecations(descriptor)) {
|
||||
val report = when (deprecation.deprecationLevel) {
|
||||
DeprecationLevelValue.WARNING -> reportWarning
|
||||
DeprecationLevelValue.ERROR, DeprecationLevelValue.HIDDEN -> reportError
|
||||
}
|
||||
report("Experimental API marker $fqName is deprecated" + deprecation.message?.let { ". $it" }.orEmpty())
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
reportError(message)
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
@@ -201,10 +201,8 @@ class DeprecationResolver(
|
||||
descriptor.checkSinceKotlinVersionAccessibility(languageVersionSettings)
|
||||
}
|
||||
|
||||
fun getDeprecations(
|
||||
descriptor: DeclarationDescriptor
|
||||
) = deprecations(descriptor.original)
|
||||
|
||||
fun getDeprecations(descriptor: DeclarationDescriptor): List<Deprecation> =
|
||||
deprecations(descriptor.original)
|
||||
|
||||
fun isDeprecatedHidden(descriptor: DeclarationDescriptor): Boolean =
|
||||
getDeprecations(descriptor).any { it.deprecationLevel == HIDDEN }
|
||||
|
||||
Reference in New Issue
Block a user