From dee3617dd8410ec50596ae32a6eecb9ff373b7a7 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Fri, 7 Sep 2018 14:59:02 +0300 Subject: [PATCH] Refine deprecation diagnostics for mod depending on api version #KT-25217 Fixed #KT-26654 Open --- .../kotlin/resolve/deprecationUtil.kt | 44 +++++++++++++++---- .../warningOnExplicitModCall1_1.kt | 5 +++ .../warningOnExplicitModCall1_1.txt | 3 ++ .../warningOnExplicitModCall1_2.kt | 5 +++ .../warningOnExplicitModCall1_2.txt | 3 ++ .../checkers/DiagnosticsTestGenerated.java | 10 +++++ .../DiagnosticsUsingJavacTestGenerated.java | 10 +++++ 7 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.kt create mode 100644 compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.txt create mode 100644 compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.kt create mode 100644 compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt index 31d6fad5f07..e1ad7bead88 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt @@ -18,9 +18,7 @@ package org.jetbrains.kotlin.resolve import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.config.KotlinCompilerVersion -import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.config.MavenComparableVersion +import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.impl.DescriptorDerivedFromTypeAlias @@ -113,6 +111,30 @@ private data class DeprecatedExperimentalCoroutine( "Experimental coroutine cannot be used with API version 1.3" } +private data class DeprecatedOperatorMod( + val languageVersionSettings: LanguageVersionSettings, + val currentDeprecation: Deprecation +) : Deprecation { + init { + assert(shouldWarnAboutDeprecatedModFromBuiltIns(languageVersionSettings)) { + "Deprecation created for mod that shouldn't have any deprecations; languageVersionSettings: $languageVersionSettings" + } + } + + override val deprecationLevel: DeprecationLevelValue + get() = when (languageVersionSettings.apiVersion) { + ApiVersion.KOTLIN_1_1, ApiVersion.KOTLIN_1_2 -> WARNING + ApiVersion.KOTLIN_1_3 -> ERROR + else -> ERROR + } + + override val message: String? + get() = currentDeprecation.message + + override val target: DeclarationDescriptor + get() = currentDeprecation.target +} + private data class DeprecatedByVersionRequirement( val versionRequirement: VersionRequirement, override val target: DeclarationDescriptor @@ -293,10 +315,9 @@ class DeprecationResolver( private fun DeclarationDescriptor.getOwnDeprecations(): List { // The problem is that declaration `mod` in built-ins has @Deprecated annotation but actually it was deprecated only in version 1.1 - if (this is FunctionDescriptor && this.isOperatorMod() && KotlinBuiltIns.isUnderKotlinPackage(this)) { - if (!shouldWarnAboutDeprecatedModFromBuiltIns(languageVersionSettings)) { - return emptyList() - } + val isBuiltInOperatorMod = this is FunctionDescriptor && this.isOperatorMod() && KotlinBuiltIns.isUnderKotlinPackage(this) + if (isBuiltInOperatorMod && !shouldWarnAboutDeprecatedModFromBuiltIns(languageVersionSettings)) { + return emptyList() } val result = SmartList() @@ -306,8 +327,13 @@ class DeprecationResolver( ?: target.annotations.findAnnotation(JAVA_DEPRECATED) if (annotation != null) { val deprecatedByAnnotation = DeprecatedByAnnotation(annotation, target) - val deprecation = when (target) { - is TypeAliasConstructorDescriptor -> DeprecatedTypealiasByAnnotation(target.typeAliasDescriptor, deprecatedByAnnotation) + val deprecation = when { + target is TypeAliasConstructorDescriptor -> + DeprecatedTypealiasByAnnotation(target.typeAliasDescriptor, deprecatedByAnnotation) + + isBuiltInOperatorMod -> + DeprecatedOperatorMod(languageVersionSettings, deprecatedByAnnotation) + else -> deprecatedByAnnotation } result.add(deprecation) diff --git a/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.kt b/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.kt new file mode 100644 index 00000000000..ef36cdbca04 --- /dev/null +++ b/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.kt @@ -0,0 +1,5 @@ +// !API_VERSION: 1.1 + +fun test() { + 1.mod(3) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.txt b/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.txt new file mode 100644 index 00000000000..93e27f34c8c --- /dev/null +++ b/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.txt @@ -0,0 +1,3 @@ +package + +public fun test(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.kt b/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.kt new file mode 100644 index 00000000000..f4683a9fab8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.kt @@ -0,0 +1,5 @@ +// !API_VERSION: 1.2 + +fun test() { + 1.mod(3) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.txt b/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.txt new file mode 100644 index 00000000000..93e27f34c8c --- /dev/null +++ b/compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.txt @@ -0,0 +1,3 @@ +package + +public fun test(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 59ef953ee60..959d84cd2b1 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -14156,6 +14156,16 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { public void testResolveToModWhenNoOperatorRemFeature() throws Exception { runTest("compiler/testData/diagnostics/tests/operatorRem/resolveToModWhenNoOperatorRemFeature.kt"); } + + @TestMetadata("warningOnExplicitModCall1_1.kt") + public void testWarningOnExplicitModCall1_1() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.kt"); + } + + @TestMetadata("warningOnExplicitModCall1_2.kt") + public void testWarningOnExplicitModCall1_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.kt"); + } } @TestMetadata("compiler/testData/diagnostics/tests/operatorsOverloading") diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index be79aa85ce6..273628785d5 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -14156,6 +14156,16 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing public void testResolveToModWhenNoOperatorRemFeature() throws Exception { runTest("compiler/testData/diagnostics/tests/operatorRem/resolveToModWhenNoOperatorRemFeature.kt"); } + + @TestMetadata("warningOnExplicitModCall1_1.kt") + public void testWarningOnExplicitModCall1_1() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_1.kt"); + } + + @TestMetadata("warningOnExplicitModCall1_2.kt") + public void testWarningOnExplicitModCall1_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/operatorRem/warningOnExplicitModCall1_2.kt"); + } } @TestMetadata("compiler/testData/diagnostics/tests/operatorsOverloading")