From bbaea6a0624133c921ae17db0d1a99321b1d5607 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 28 Feb 2018 14:23:05 +0100 Subject: [PATCH] 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 --- .../kotlin/resolve/deprecationUtil.kt | 51 +++++++++++-------- .../org/jetbrains/kotlin/config/ApiVersion.kt | 5 -- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt index 1c9ba7ba6bd..84662198ec5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt @@ -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 + } } diff --git a/compiler/util/src/org/jetbrains/kotlin/config/ApiVersion.kt b/compiler/util/src/org/jetbrains/kotlin/config/ApiVersion.kt index 09127670ef1..bdf00e413ba 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/ApiVersion.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/ApiVersion.kt @@ -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) }