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:
Alexander Udalov
2018-02-28 14:23:05 +01:00
parent 90802f2d7c
commit bbaea6a062
2 changed files with 30 additions and 26 deletions
@@ -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)
}