diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt index b688c05fa12..46ffeb50e11 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/deprecationUtil.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ 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.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor @@ -28,12 +29,15 @@ import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.isSubpackageOf import org.jetbrains.kotlin.resolve.DeprecationLevelValue.* import org.jetbrains.kotlin.resolve.annotations.argumentValue +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.SinceKotlinInfo +import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.SmartList private val JAVA_DEPRECATED = FqName("java.lang.Deprecated") @@ -181,6 +185,11 @@ private fun DeclarationDescriptor.getOwnDeprecations(languageVersionSettings: La typeAliasDescriptor.getOwnDeprecations(languageVersionSettings) } + // The problem is that declaration `mod` in built-ins has @Deprecated annotation but actually it was deprecated only in version 1.1 + if (!languageVersionSettings.supportsFeature(LanguageFeature.OperatorRem) && isOperatorModFromBuiltIns(this)) { + return emptyList() + } + val result = SmartList() fun addDeprecationIfPresent(target: DeclarationDescriptor) { @@ -272,3 +281,14 @@ fun DeclarationDescriptor.isHiddenInResolution(languageVersionSettings: Language return isDeprecatedHidden(languageVersionSettings) } + +private fun isOperatorModFromBuiltIns(descriptor: DeclarationDescriptor): Boolean { + if (descriptor is FunctionDescriptor && descriptor.isOperator) { + val isOperatorMod = descriptor.name == OperatorNameConventions.MOD + + val descriptorFqName = descriptor.fqNameOrNull() ?: return false + return isOperatorMod && descriptorFqName.isSubpackageOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) + } + + return false +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/operatorRem/noOperatorRemFeature.kt b/compiler/testData/diagnostics/tests/operatorRem/noOperatorRemFeature.kt index 841a80045ed..b92ed64b842 100644 --- a/compiler/testData/diagnostics/tests/operatorRem/noOperatorRemFeature.kt +++ b/compiler/testData/diagnostics/tests/operatorRem/noOperatorRemFeature.kt @@ -24,5 +24,13 @@ fun local() { } fun noOverflow() { - (-1).mod(5) + (-1).mod(5) +} + +fun builtIns(b: Byte, s: Short) { + var a = 1 % 2 + a %= 3 + 1.mod(2) + b % s + 1.0 % 2.0 } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/operatorRem/noOperatorRemFeature.txt b/compiler/testData/diagnostics/tests/operatorRem/noOperatorRemFeature.txt index dd250413129..793301cae5a 100644 --- a/compiler/testData/diagnostics/tests/operatorRem/noOperatorRemFeature.txt +++ b/compiler/testData/diagnostics/tests/operatorRem/noOperatorRemFeature.txt @@ -1,5 +1,6 @@ package +public fun builtIns(/*0*/ b: kotlin.Byte, /*1*/ s: kotlin.Short): kotlin.Unit public fun local(): kotlin.Unit public fun noOverflow(): kotlin.Unit public operator fun Baz.rem(/*0*/ x: kotlin.Int): kotlin.Unit