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 com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.config.ApiVersion
|
|
||||||
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
|
import org.jetbrains.kotlin.config.MavenComparableVersion
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
@@ -287,26 +287,7 @@ class DeprecationResolver(
|
|||||||
result.add(deprecation)
|
result.add(deprecation)
|
||||||
}
|
}
|
||||||
|
|
||||||
val versionRequirement =
|
getDeprecationByVersionRequirement(target)?.let(result::add)
|
||||||
(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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addUseSiteTargetedDeprecationIfPresent(annotatedDescriptor: DeclarationDescriptor, useSiteTarget: AnnotationUseSiteTarget?) {
|
fun addUseSiteTargetedDeprecationIfPresent(annotatedDescriptor: DeclarationDescriptor, useSiteTarget: AnnotationUseSiteTarget?) {
|
||||||
@@ -345,4 +326,32 @@ class DeprecationResolver(
|
|||||||
|
|
||||||
return result.distinct()
|
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
|
package org.jetbrains.kotlin.config
|
||||||
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.VersionRequirement
|
|
||||||
import org.jetbrains.kotlin.utils.DescriptionAware
|
import org.jetbrains.kotlin.utils.DescriptionAware
|
||||||
|
|
||||||
class ApiVersion private constructor(
|
class ApiVersion private constructor(
|
||||||
@@ -59,10 +58,6 @@ class ApiVersion private constructor(
|
|||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun createByLanguageVersion(version: LanguageVersion): ApiVersion = parse(version.versionString)!!
|
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 {
|
fun parse(versionString: String): ApiVersion? = try {
|
||||||
ApiVersion(MavenComparableVersion(versionString), versionString)
|
ApiVersion(MavenComparableVersion(versionString), versionString)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user