From 9f96de3f7bbd0460a102cc5f7f1ccc39b4126017 Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Wed, 7 Oct 2015 13:43:17 +0300 Subject: [PATCH] Compare descriptors by topmost override --- .../idea/completion/CompletionSession.kt | 2 +- .../kotlin/idea/core/descriptorUtils.kt | 39 ++++++++++--------- .../extractableAnalysisUtil.kt | 4 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 5d10dfa9472..38dc529749a 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -266,7 +266,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC val restrictedKindFilter = descriptorKindFilter!!.restrictedToKinds(DescriptorKindFilter.FUNCTIONS_MASK or DescriptorKindFilter.VARIABLES_MASK) // optimization val descriptors = referenceVariantsHelper.getReferenceVariants(nameExpression!!, restrictedKindFilter, descriptorNameFilter, useRuntimeReceiverType = true) return descriptors.filter { descriptor -> - referenceVariants.filter { it.name == descriptor.name }.none { comparePossiblyOverridingDescriptors(project, it, descriptor) } + referenceVariants.none { compareDescriptors(project, it, descriptor) } } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt index 55434f3fbb3..ca57ec056cf 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt @@ -19,11 +19,11 @@ package org.jetbrains.kotlin.idea.core import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.lexer.JetModifierKeywordToken import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.JetSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression -import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver @@ -58,31 +58,34 @@ fun DeclarationDescriptorWithVisibility.isVisible( return false } -public fun compareDescriptors(project: Project, d1: DeclarationDescriptor?, d2: DeclarationDescriptor?): Boolean { +private fun compareDescriptorsText(project: Project, d1: DeclarationDescriptor?, d2: DeclarationDescriptor?): Boolean { if (d1 == d2) return true if (d1 == null || d2 == null) return false + if (d1.name != d2.name) return false + + val renderedD1 = IdeDescriptorRenderers.SOURCE_CODE.render(d1) + val renderedD2 = IdeDescriptorRenderers.SOURCE_CODE.render(d2) + if (renderedD1 == renderedD2) return true + val declarations1 = DescriptorToSourceUtilsIde.getAllDeclarations(project, d1) val declarations2 = DescriptorToSourceUtilsIde.getAllDeclarations(project, d2) if (declarations1 == declarations2 && declarations1.isNotEmpty()) return true - return DescriptorRenderer.FQ_NAMES_IN_TYPES.render(d1) == DescriptorRenderer.FQ_NAMES_IN_TYPES.render(d2) + + return false } -public fun comparePossiblyOverridingDescriptors(project: Project, - currentDescriptor: DeclarationDescriptor?, - originalDescriptor: DeclarationDescriptor?): Boolean { - if (compareDescriptors(project, currentDescriptor, originalDescriptor)) return true - if (originalDescriptor is CallableDescriptor) { - if (!OverridingUtil.traverseOverridenDescriptors(originalDescriptor) { !compareDescriptors(project, currentDescriptor, it) }) return true - if (originalDescriptor !is CallableMemberDescriptor || currentDescriptor !is CallableMemberDescriptor) return false - val kind = originalDescriptor.getKind() - if (kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE && kind != CallableMemberDescriptor.Kind.DELEGATION) return false - if (currentDescriptor.getKind() != kind) return false +public fun compareDescriptors(project: Project, currentDescriptor: DeclarationDescriptor?, originalDescriptor: DeclarationDescriptor?): Boolean { + if (currentDescriptor?.name != originalDescriptor?.name) return false - val originalOverriddenDescriptors = originalDescriptor.getOverriddenDescriptors() - val currentOverriddenDescriptors = currentDescriptor.getOverriddenDescriptors() - if (originalOverriddenDescriptors.size() != currentOverriddenDescriptors.size()) return false - return (currentOverriddenDescriptors zip originalOverriddenDescriptors ).all { - comparePossiblyOverridingDescriptors(project, it.first, it.second) + if (compareDescriptorsText(project, currentDescriptor, originalDescriptor)) return true + + if (originalDescriptor is CallableDescriptor && currentDescriptor is CallableDescriptor) { + val overriddenOriginalDescriptor = OverridingUtil.getTopmostOverridenDescriptors(originalDescriptor) + val overriddenCurrentDescriptor = OverridingUtil.getTopmostOverridenDescriptors(currentDescriptor) + + if (overriddenOriginalDescriptor.size() != overriddenCurrentDescriptor.size()) return false + return (overriddenCurrentDescriptor zip overriddenOriginalDescriptor ).all { + compareDescriptorsText(project, it.first, it.second) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt index 5c6179f9d91..880703e2620 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/extractableAnalysisUtil.kt @@ -44,7 +44,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator -import org.jetbrains.kotlin.idea.core.comparePossiblyOverridingDescriptors +import org.jetbrains.kotlin.idea.core.compareDescriptors import org.jetbrains.kotlin.idea.core.getResolutionScope import org.jetbrains.kotlin.idea.core.refactoring.createTempCopy import org.jetbrains.kotlin.idea.refactoring.JetRefactoringBundle @@ -1031,7 +1031,7 @@ fun ExtractableCodeDescriptor.validate(): ExtractableCodeDescriptorWithConflicts if (diagnostics.any { it.getFactory() in Errors.UNRESOLVED_REFERENCE_DIAGNOSTICS } || (currentDescriptor != null && !ErrorUtils.isError(currentDescriptor) - && !comparePossiblyOverridingDescriptors(extractionData.project, currentDescriptor, resolveResult.descriptor))) { + && !compareDescriptors(extractionData.project, currentDescriptor, resolveResult.descriptor))) { conflicts.putValue( resolveResult.originalRefExpr, getDeclarationMessage(resolveResult.declaration, "0.will.no.longer.be.accessible.after.extraction")