Refactor getDeprecation() -> getDeprecations()

In subsequent commits, another kind of deprecation is introduced which should
be reported alongside with deprecation by the `@Deprecated` annotation
This commit is contained in:
Alexander Udalov
2016-12-14 13:00:32 +03:00
parent 3540bc008b
commit 122c631fcf
5 changed files with 23 additions and 23 deletions
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
import org.jetbrains.kotlin.resolve.createDeprecationDiagnostic import org.jetbrains.kotlin.resolve.createDeprecationDiagnostic
import org.jetbrains.kotlin.resolve.getDeprecation import org.jetbrains.kotlin.resolve.getDeprecations
object DeprecatedCallChecker : CallChecker { object DeprecatedCallChecker : CallChecker {
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
@@ -42,13 +42,17 @@ object DeprecatedCallChecker : CallChecker {
// Objects will be checked by DeprecatedClassifierUsageChecker // Objects will be checked by DeprecatedClassifierUsageChecker
if (targetDescriptor is FakeCallableDescriptorForObject) return if (targetDescriptor is FakeCallableDescriptorForObject) return
val deprecation = targetDescriptor.getDeprecation() val deprecations = targetDescriptor.getDeprecations().toMutableList()
// avoid duplicating diagnostic when deprecation for property effectively deprecates setter // avoid duplicating diagnostic when deprecation for property effectively deprecates setter
if (targetDescriptor is PropertySetterDescriptor && targetDescriptor.correspondingProperty.getDeprecation() == deprecation) return if (targetDescriptor is PropertySetterDescriptor) {
deprecations -= targetDescriptor.correspondingProperty.getDeprecations()
}
if (deprecation != null) { if (deprecations.isNotEmpty()) {
trace.report(createDeprecationDiagnostic(element, deprecation)) for (deprecation in deprecations) {
trace.report(createDeprecationDiagnostic(element, deprecation))
}
} }
else if (targetDescriptor is PropertyDescriptor && shouldCheckPropertyGetter(element)) { else if (targetDescriptor is PropertyDescriptor && shouldCheckPropertyGetter(element)) {
targetDescriptor.getter?.let { check(it, trace, element) } targetDescriptor.getter?.let { check(it, trace, element) }
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.createDeprecationDiagnostic import org.jetbrains.kotlin.resolve.createDeprecationDiagnostic
import org.jetbrains.kotlin.resolve.getDeprecation import org.jetbrains.kotlin.resolve.getDeprecations
class DeprecatedClassifierUsageChecker : ClassifierUsageChecker { class DeprecatedClassifierUsageChecker : ClassifierUsageChecker {
override fun check( override fun check(
@@ -30,8 +30,8 @@ class DeprecatedClassifierUsageChecker : ClassifierUsageChecker {
element: PsiElement, element: PsiElement,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
) { ) {
val deprecation = targetDescriptor.getDeprecation() val deprecations = targetDescriptor.getDeprecations()
if (deprecation != null) { for (deprecation in deprecations) {
trace.report(createDeprecationDiagnostic(element, deprecation)) trace.report(createDeprecationDiagnostic(element, deprecation))
} }
} }
@@ -89,17 +89,17 @@ private data class DeprecatedByOverridden(private val deprecations: Collection<D
internal fun additionalMessage() = "Overrides deprecated member in '${DescriptorUtils.getContainingClass(target)!!.fqNameSafe.asString()}'" internal fun additionalMessage() = "Overrides deprecated member in '${DescriptorUtils.getContainingClass(target)!!.fqNameSafe.asString()}'"
} }
fun DeclarationDescriptor.getDeprecation(): Deprecation? { fun DeclarationDescriptor.getDeprecations(): List<Deprecation> {
val deprecation = this.getDeprecationByAnnotation() val deprecation = this.getDeprecationByAnnotation()
if (deprecation != null) { if (deprecation != null) {
return deprecation return listOf(deprecation)
} }
if (this is CallableMemberDescriptor) { if (this is CallableMemberDescriptor) {
return deprecationByOverridden(this) return listOfNotNull(deprecationByOverridden(this))
} }
return null return emptyList()
} }
private fun deprecationByOverridden(root: CallableMemberDescriptor): Deprecation? { private fun deprecationByOverridden(root: CallableMemberDescriptor): Deprecation? {
@@ -200,9 +200,8 @@ enum class DeprecationLevelValue {
WARNING, ERROR, HIDDEN WARNING, ERROR, HIDDEN
} }
fun DeclarationDescriptor.isDeprecatedHidden(): Boolean { fun DeclarationDescriptor.isDeprecatedHidden(): Boolean =
return getDeprecation()?.deprecationLevel == HIDDEN getDeprecations().any { it.deprecationLevel == HIDDEN }
}
@JvmOverloads @JvmOverloads
fun DeclarationDescriptor.isHiddenInResolution(languageVersionSettings: LanguageVersionSettings, isSuperCall: Boolean = false): Boolean { fun DeclarationDescriptor.isHiddenInResolution(languageVersionSettings: LanguageVersionSettings, isSuperCall: Boolean = false): Boolean {
@@ -18,15 +18,12 @@ package org.jetbrains.kotlin.idea
import com.google.common.html.HtmlEscapers import com.google.common.html.HtmlEscapers
import com.intellij.codeInsight.documentation.DocumentationManagerUtil import com.intellij.codeInsight.documentation.DocumentationManagerUtil
import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator
import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory
import com.intellij.lang.documentation.AbstractDocumentationProvider import com.intellij.lang.documentation.AbstractDocumentationProvider
import com.intellij.lang.java.JavaDocumentationProvider import com.intellij.lang.java.JavaDocumentationProvider
import com.intellij.lang.java.JavaLanguage
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration
import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
@@ -51,7 +48,7 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.deprecatedByAnnotationReplaceWithExpression import org.jetbrains.kotlin.resolve.deprecatedByAnnotationReplaceWithExpression
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.getDeprecation import org.jetbrains.kotlin.resolve.getDeprecations
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.utils.addToStdlib.constant import org.jetbrains.kotlin.utils.addToStdlib.constant
@@ -196,7 +193,7 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
} }
private fun renderDeprecationInfo(declarationDescriptor: DeclarationDescriptor): String { private fun renderDeprecationInfo(declarationDescriptor: DeclarationDescriptor): String {
val deprecation = declarationDescriptor.getDeprecation() ?: return "" val deprecation = declarationDescriptor.getDeprecations().firstOrNull() ?: return ""
return buildString { return buildString {
wrapTag("DL") { wrapTag("DL") {
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.deprecatedByOverriddenMessage import org.jetbrains.kotlin.resolve.deprecatedByOverriddenMessage
import org.jetbrains.kotlin.resolve.getDeprecation import org.jetbrains.kotlin.resolve.getDeprecations
class OverridingDeprecatedMemberInspection : AbstractKotlinInspection() { class OverridingDeprecatedMemberInspection : AbstractKotlinInspection() {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
@@ -41,7 +41,7 @@ class OverridingDeprecatedMemberInspection : AbstractKotlinInspection() {
if (declaration is KtDestructuringDeclarationEntry) return if (declaration is KtDestructuringDeclarationEntry) return
val accessorDescriptor = declaration.resolveToDescriptor() as? CallableMemberDescriptor ?: return val accessorDescriptor = declaration.resolveToDescriptor() as? CallableMemberDescriptor ?: return
val message = accessorDescriptor.getDeprecation()?.deprecatedByOverriddenMessage() ?: return val message = accessorDescriptor.getDeprecations().firstOrNull()?.deprecatedByOverriddenMessage() ?: return
val problem = holder.manager.createProblemDescriptor( val problem = holder.manager.createProblemDescriptor(
targetForProblem, targetForProblem,
message, message,