From 4550999288a84625a673094191282de341d0008c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 25 Nov 2021 11:18:08 +0300 Subject: [PATCH] FE: use proper version in version requirement error message #KT-48690 Fixed --- .../jetbrains/kotlin/diagnostics/Errors.java | 4 ++-- .../rendering/DefaultErrorMessages.java | 4 ++-- .../resolve/deprecation/deprecationUtil.kt | 9 ++++++++- .../cli/jvm/requireKotlinCompilerVersion.args | 5 +++++ .../cli/jvm/requireKotlinCompilerVersion.kt | 16 ++++++++++++++++ .../cli/jvm/requireKotlinCompilerVersion.out | 7 +++++++ .../test/access/Foo.class | Bin 0 -> 488 bytes .../jetbrains/kotlin/cli/CliTestGenerated.java | 5 +++++ 8 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/cli/jvm/requireKotlinCompilerVersion.args create mode 100644 compiler/testData/cli/jvm/requireKotlinCompilerVersion.kt create mode 100644 compiler/testData/cli/jvm/requireKotlinCompilerVersion.out create mode 100644 compiler/testData/cli/jvm/requireKotlinCompilerVersion/test/access/Foo.class diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 62131795258..8b5d322ece2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -99,9 +99,9 @@ public interface Errors { DiagnosticFactory2 DEPRECATION_ERROR = DiagnosticFactory2.create(ERROR); DiagnosticFactory3 TYPEALIAS_EXPANSION_DEPRECATION = DiagnosticFactory3.create(WARNING); DiagnosticFactory3 TYPEALIAS_EXPANSION_DEPRECATION_ERROR = DiagnosticFactory3.create(ERROR); - DiagnosticFactory3> + DiagnosticFactory3> VERSION_REQUIREMENT_DEPRECATION = DiagnosticFactory3.create(WARNING); - DiagnosticFactory3> + DiagnosticFactory3> VERSION_REQUIREMENT_DEPRECATION_ERROR = DiagnosticFactory3.create(ERROR); // descriptor and deprecation infos are needed only for IDE quickfix for this warning DiagnosticFactory3> OVERRIDE_DEPRECATION = DiagnosticFactory3.create(WARNING, DECLARATION_NAME); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index fa7967933a3..4244237e6b1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -385,9 +385,9 @@ public class DefaultErrorMessages { MAP.put(TYPEALIAS_EXPANSION_DEPRECATION, "''{0}'' uses ''{1}'', which is deprecated. {2}", DEPRECATION_RENDERER, DEPRECATION_RENDERER, STRING); MAP.put(TYPEALIAS_EXPANSION_DEPRECATION_ERROR, "''{0}'' uses ''{1}'', which is an error. {2}", DEPRECATION_RENDERER, DEPRECATION_RENDERER, STRING); - DiagnosticParameterRenderer> versionRequirementMessage = (pair, renderingContext) -> { + DiagnosticParameterRenderer> versionRequirementMessage = (pair, renderingContext) -> { String message = pair.getSecond(); - return pair.getFirst().getVersionString() + (message != null ? ". " + message : ""); + return pair.getFirst() + (message != null ? ". " + message : ""); }; MAP.put(VERSION_REQUIREMENT_DEPRECATION, "''{0}''{1} should not be used in Kotlin {2}", DEPRECATION_RENDERER, (obj, renderingContext) -> obj.equals(VersionRequirement.Version.INFINITY) ? "" : " is only supported since Kotlin " + obj.asString() + " and", diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/deprecationUtil.kt index 3b23f6b7ad5..5790d14f524 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/deprecationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecation/deprecationUtil.kt @@ -7,11 +7,13 @@ package org.jetbrains.kotlin.resolve.deprecation import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.ApiVersion +import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.DefaultImplementation import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.resolve.annotations.argumentValue import org.jetbrains.kotlin.resolve.constants.StringValue import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue.* @@ -48,9 +50,14 @@ internal fun createDeprecationDiagnostic( WARNING -> Errors.VERSION_REQUIREMENT_DEPRECATION ERROR, HIDDEN -> Errors.VERSION_REQUIREMENT_DEPRECATION_ERROR } + val currentVersionString = when (deprecation.versionRequirement.kind) { + ProtoBuf.VersionRequirement.VersionKind.COMPILER_VERSION -> KotlinCompilerVersion.VERSION + ProtoBuf.VersionRequirement.VersionKind.LANGUAGE_VERSION -> languageVersionSettings.languageVersion.versionString + ProtoBuf.VersionRequirement.VersionKind.API_VERSION -> languageVersionSettings.apiVersion.versionString + } factory.on( element, targetOriginal, deprecation.versionRequirement.version, - languageVersionSettings.languageVersion to deprecation.message + currentVersionString to deprecation.message ) } diff --git a/compiler/testData/cli/jvm/requireKotlinCompilerVersion.args b/compiler/testData/cli/jvm/requireKotlinCompilerVersion.args new file mode 100644 index 00000000000..8d3feddc06e --- /dev/null +++ b/compiler/testData/cli/jvm/requireKotlinCompilerVersion.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/requireKotlinCompilerVersion.kt +-classpath +$TESTDATA_DIR$/requireKotlinCompilerVersion +-d +$TEMP_DIR$ diff --git a/compiler/testData/cli/jvm/requireKotlinCompilerVersion.kt b/compiler/testData/cli/jvm/requireKotlinCompilerVersion.kt new file mode 100644 index 00000000000..fcdc0395811 --- /dev/null +++ b/compiler/testData/cli/jvm/requireKotlinCompilerVersion.kt @@ -0,0 +1,16 @@ +// Library part (build separately) + +//@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") +//package test.access +// +//import kotlin.internal.RequireKotlin +//import kotlin.internal.RequireKotlinVersionKind +// +//@RequireKotlin("9.9.90", versionKind = RequireKotlinVersionKind.COMPILER_VERSION) +//class Foo + +import test.access.Foo + +fun main() { + Foo() +} diff --git a/compiler/testData/cli/jvm/requireKotlinCompilerVersion.out b/compiler/testData/cli/jvm/requireKotlinCompilerVersion.out new file mode 100644 index 00000000000..13f7cbf71be --- /dev/null +++ b/compiler/testData/cli/jvm/requireKotlinCompilerVersion.out @@ -0,0 +1,7 @@ +compiler/testData/cli/jvm/requireKotlinCompilerVersion.kt:12:20: error: 'Foo' is only available since Kotlin 9.9.90 and cannot be used in Kotlin $VERSION$ +import test.access.Foo + ^ +compiler/testData/cli/jvm/requireKotlinCompilerVersion.kt:15:5: error: 'Foo' is only available since Kotlin 9.9.90 and cannot be used in Kotlin $VERSION$ + Foo() + ^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/requireKotlinCompilerVersion/test/access/Foo.class b/compiler/testData/cli/jvm/requireKotlinCompilerVersion/test/access/Foo.class new file mode 100644 index 0000000000000000000000000000000000000000..ac95579d2d840708837982e913bd45bfd283e823 GIT binary patch literal 488 zcmZ8dJx?1!5PiF6-`N)j4)TE=5^A8}FhoiuqDTP=$&!;u5V>)+zFWa!dsp(VEtgih zwEP4rx2Y0QMAp&eM@7tnt2A%kyqTSuw}1cL{sHh7TMVmCT9=9}lh&rE#zbHY$(5Lh zbRhIa`n7i@GZ!IX2tO#T+((9Bd#6)F8DWePB8HN?RF+|_{okx3ul0=^D4l+mPUOM~ z()e%^(0b+}^Z*9dCw;1Xwofc?GQ3~RYB8_#m?w)_%qzUUm>uwac3duQLZ0xu-)u1} zzVm7vCB={8`fg6eVjj|^JU?K5YIH7ier%=;)klYWeMje>m|T+cw$k#;c-WJpZ=yFK zWxZ`OG3bbq^7&GX&&_z0$y4P!8fRne)KGSmRn+oHYvY7dMq4z&={J^c{O8dA2BnAI z9mVqQFI0XK;dn(DQv@P