Refactor deprecation by version requirement
- Get rid of ApiVersion in favor of MavenComparableVersion - Don't crash on invalid versions in RequireKotlin - Extract to a separate function
This commit is contained in:
@@ -18,9 +18,9 @@ package org.jetbrains.kotlin.resolve
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.config.ApiVersion
|
||||
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.config.MavenComparableVersion
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
@@ -287,26 +287,7 @@ class DeprecationResolver(
|
||||
result.add(deprecation)
|
||||
}
|
||||
|
||||
val versionRequirement =
|
||||
(target as? DeserializedMemberDescriptor)?.versionRequirement
|
||||
?: (target as? DeserializedClassDescriptor)?.versionRequirement
|
||||
if (versionRequirement != null) {
|
||||
// We're using ApiVersion because it's convenient to compare versions, "-api-version" is not involved in any way
|
||||
// TODO: usage of ApiVersion is confusing here, refactor
|
||||
val requiredVersion = ApiVersion.createByVersionRequirement(versionRequirement)
|
||||
val currentVersion = when (versionRequirement.kind) {
|
||||
ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION ->
|
||||
ApiVersion.createByLanguageVersion(languageVersionSettings.languageVersion)
|
||||
ProtoBuf.VersionRequirement.VersionKind.API_VERSION ->
|
||||
languageVersionSettings.apiVersion
|
||||
ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION ->
|
||||
KotlinCompilerVersion.getVersion()?.let((ApiVersion)::parse)
|
||||
else -> null
|
||||
}
|
||||
if (currentVersion != null && currentVersion < requiredVersion) {
|
||||
result.add(DeprecatedByVersionRequirement(versionRequirement, target))
|
||||
}
|
||||
}
|
||||
getDeprecationByVersionRequirement(target)?.let(result::add)
|
||||
}
|
||||
|
||||
fun addUseSiteTargetedDeprecationIfPresent(annotatedDescriptor: DeclarationDescriptor, useSiteTarget: AnnotationUseSiteTarget?) {
|
||||
@@ -345,4 +326,32 @@ class DeprecationResolver(
|
||||
|
||||
return result.distinct()
|
||||
}
|
||||
|
||||
private fun getDeprecationByVersionRequirement(target: DeclarationDescriptor): DeprecatedByVersionRequirement? {
|
||||
fun createVersion(version: String): MavenComparableVersion? = try {
|
||||
MavenComparableVersion(version)
|
||||
} catch (e: Exception) {
|
||||
null
|
||||
}
|
||||
|
||||
val versionRequirement =
|
||||
(target as? DeserializedMemberDescriptor)?.versionRequirement
|
||||
?: (target as? DeserializedClassDescriptor)?.versionRequirement
|
||||
if (versionRequirement != null) {
|
||||
val requiredVersion = createVersion(versionRequirement.version.asString())
|
||||
val currentVersion = when (versionRequirement.kind) {
|
||||
ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION ->
|
||||
MavenComparableVersion(languageVersionSettings.languageVersion.versionString)
|
||||
ProtoBuf.VersionRequirement.VersionKind.API_VERSION ->
|
||||
languageVersionSettings.apiVersion.version
|
||||
ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION ->
|
||||
KotlinCompilerVersion.getVersion()?.let(::createVersion)
|
||||
else -> null
|
||||
}
|
||||
if (currentVersion != null && currentVersion < requiredVersion) {
|
||||
return DeprecatedByVersionRequirement(versionRequirement, target)
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.config
|
||||
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirement
|
||||
import org.jetbrains.kotlin.utils.DescriptionAware
|
||||
|
||||
class ApiVersion private constructor(
|
||||
@@ -59,10 +58,6 @@ class ApiVersion private constructor(
|
||||
@JvmStatic
|
||||
fun createByLanguageVersion(version: LanguageVersion): ApiVersion = parse(version.versionString)!!
|
||||
|
||||
@JvmStatic
|
||||
fun createByVersionRequirement(versionRequirement: VersionRequirement): ApiVersion =
|
||||
versionRequirement.version.let { version -> parse(version.asString()) ?: error("Could not parse version: $version") }
|
||||
|
||||
fun parse(versionString: String): ApiVersion? = try {
|
||||
ApiVersion(MavenComparableVersion(versionString), versionString)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user