Do not show warning for mod from built-ins when LV=1.0

#KT-16372 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2017-03-13 13:51:51 +03:00
parent 071744a57f
commit e4188f889e
3 changed files with 31 additions and 2 deletions
@@ -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<Deprecation>()
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
}
@@ -24,5 +24,13 @@ fun local() {
}
fun noOverflow() {
(-1).<!DEPRECATION!>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
}
@@ -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