From 89c5799155a7b095c05905bcb76150e700919e4e Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 20 Jul 2016 17:56:54 +0300 Subject: [PATCH] Move utilities used in IDE from OverrideResolver to descriptorUtils.kt --- .../kotlin/resolve/OverrideResolver.java | 39 ++----------------- .../kotlin/idea/core/descriptorUtils.kt | 29 ++++++++++++++ .../codeInsight/GotoSuperActionHandler.java | 7 ++-- .../markers/SuperDeclarationMarker.kt | 5 +-- .../idea/refactoring/CallableRefactoring.kt | 11 +++--- .../changeSignature/KotlinChangeSignature.kt | 13 +++---- .../rename/RenameKotlinParameterProcessor.kt | 4 +- .../rename/RenameKotlinPropertyProcessor.kt | 4 +- ...inOverridingMethodsWithGenericsSearcher.kt | 9 ++--- 9 files changed, 57 insertions(+), 64 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java index 04528bc204c..b349125c7c1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java @@ -32,7 +32,6 @@ import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.ReadOnly; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2; @@ -50,7 +49,8 @@ import org.jetbrains.kotlin.utils.HashSetUtil; import java.util.*; import static kotlin.collections.CollectionsKt.sortedBy; -import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.*; +import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION; +import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE; import static org.jetbrains.kotlin.diagnostics.Errors.*; import static org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveAbstractMembers; import static org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE; @@ -135,7 +135,7 @@ public class OverrideResolver { } @NotNull - private static Set filterOutOverriding(@NotNull Set candidateSet) { + public static Set filterOutOverriding(@NotNull Set candidateSet) { //noinspection unchecked return filterOverrides(candidateSet, Function.ID, Filtering.RETAIN_OVERRIDDEN); } @@ -1216,37 +1216,4 @@ public class OverrideResolver { } } } - - @NotNull - public static Collection getDirectlyOverriddenDeclarations(@NotNull D descriptor) { - Set result = new LinkedHashSet(); - //noinspection unchecked - for (D overriddenDescriptor : (Collection) descriptor.getOverriddenDescriptors()) { - CallableMemberDescriptor.Kind kind = overriddenDescriptor.getKind(); - if (kind == DECLARATION) { - result.add(overriddenDescriptor); - } - else if (kind == FAKE_OVERRIDE || kind == DELEGATION) { - result.addAll(getDirectlyOverriddenDeclarations(overriddenDescriptor)); - } - else if (kind == SYNTHESIZED) { - //do nothing - } - else { - throw new AssertionError("Unexpected callable kind " + kind); - } - } - return filterOutOverridden(result); - } - - @NotNull - @ReadOnly - public static Set getDeepestSuperDeclarations(@NotNull D functionDescriptor) { - Set overriddenDeclarations = DescriptorUtils.getAllOverriddenDeclarations(functionDescriptor); - if (overriddenDeclarations.isEmpty()) { - return Collections.singleton(functionDescriptor); - } - - return filterOutOverriding(overriddenDeclarations); - } } 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 cc01d53f900..9a71ee47f55 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,6 +19,7 @@ package org.jetbrains.kotlin.idea.core import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.* import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers @@ -27,11 +28,14 @@ import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.OverrideResolver import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor +import java.util.* fun DeclarationDescriptorWithVisibility.isVisible(from: DeclarationDescriptor): Boolean { return isVisible(from, null) @@ -124,3 +128,28 @@ fun Visibility.toKeywordToken(): KtModifierKeywordToken { } } } + +fun D.getDirectlyOverriddenDeclarations(): Collection { + val result = LinkedHashSet() + for (overriddenDescriptor in overriddenDescriptors) { + @Suppress("UNCHECKED_CAST") + when (overriddenDescriptor.kind) { + DECLARATION -> result.add(overriddenDescriptor as D) + FAKE_OVERRIDE, DELEGATION -> result.addAll((overriddenDescriptor as D).getDirectlyOverriddenDeclarations()) + SYNTHESIZED -> { + //do nothing + } + else -> throw AssertionError("Unexpected callable kind ${overriddenDescriptor.kind}: $overriddenDescriptor") + } + } + return OverrideResolver.filterOutOverridden(result) +} + +fun D.getDeepestSuperDeclarations(): Set { + val overriddenDeclarations = DescriptorUtils.getAllOverriddenDeclarations(this) + if (overriddenDeclarations.isEmpty()) { + return setOf(this) + } + + return OverrideResolver.filterOutOverriding(overriddenDeclarations) +} diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/GotoSuperActionHandler.java b/idea/src/org/jetbrains/kotlin/idea/codeInsight/GotoSuperActionHandler.java index bbde49edb73..4c364729ace 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/GotoSuperActionHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/GotoSuperActionHandler.java @@ -36,9 +36,9 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils; +import org.jetbrains.kotlin.idea.core.DescriptorUtilsKt; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; -import org.jetbrains.kotlin.resolve.OverrideResolver; import org.jetbrains.kotlin.types.KotlinType; import java.util.Collection; @@ -119,10 +119,11 @@ public class GotoSuperActionHandler implements CodeInsightActionHandler { superDescriptors = superclasses; } else if (descriptor instanceof CallableMemberDescriptor) { - superDescriptors = OverrideResolver.getDirectlyOverriddenDeclarations((CallableMemberDescriptor) descriptor); + superDescriptors = DescriptorUtilsKt.getDirectlyOverriddenDeclarations((CallableMemberDescriptor) descriptor); } - else + else { return null; + } return ContainerUtil.mapNotNull(superDescriptors, new Function() { @Override diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SuperDeclarationMarker.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SuperDeclarationMarker.kt index 77fa867e800..f5479466fdc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SuperDeclarationMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/SuperDeclarationMarker.kt @@ -30,12 +30,12 @@ import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.codeInsight.KtFunctionPsiElementCellRenderer +import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations import org.jetbrains.kotlin.idea.search.usagesSearch.propertyDescriptor import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.RenderingFormat -import org.jetbrains.kotlin.resolve.OverrideResolver import java.awt.event.MouseEvent import java.util.* @@ -119,6 +119,5 @@ fun resolveDeclarationWithParents(element: KtDeclaration): ResolveWithParentsRes if (descriptor !is CallableMemberDescriptor) return ResolveWithParentsResult(null, listOf()) - val overriddenMembers = OverrideResolver.getDirectlyOverriddenDeclarations(descriptor) - return ResolveWithParentsResult(descriptor, overriddenMembers) + return ResolveWithParentsResult(descriptor, descriptor.getDirectlyOverriddenDeclarations()) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/CallableRefactoring.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/CallableRefactoring.kt index 910a69611d0..480c899afcb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/CallableRefactoring.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/CallableRefactoring.kt @@ -33,6 +33,8 @@ import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde +import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations +import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtDeclarationWithBody @@ -40,7 +42,6 @@ import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.resolve.OverrideResolver import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.memberScopeAsImportingScope import java.util.* @@ -60,10 +61,10 @@ abstract class CallableRefactoring( private fun getClosestModifiableDescriptors(): Collection { return when (kind) { DECLARATION -> { - Collections.singleton(callableDescriptor) + setOf(callableDescriptor) } DELEGATION, FAKE_OVERRIDE -> { - OverrideResolver.getDirectlyOverriddenDeclarations(callableDescriptor as CallableMemberDescriptor) + (callableDescriptor as CallableMemberDescriptor).getDirectlyOverriddenDeclarations() } else -> { throw IllegalStateException("Unexpected callable kind: $kind") @@ -141,8 +142,8 @@ abstract class CallableRefactoring( assert(!closestModifiableDescriptors.isEmpty()) { "Should contain original declaration or some of its super declarations" } val deepestSuperDeclarations = - (callableDescriptor as? CallableMemberDescriptor)?.let { OverrideResolver.getDeepestSuperDeclarations(it) } - ?: Collections.singletonList(callableDescriptor) + (callableDescriptor as? CallableMemberDescriptor)?.let(CallableMemberDescriptor::getDeepestSuperDeclarations) + ?: listOf(callableDescriptor) if (ApplicationManager.getApplication()!!.isUnitTestMode) { performRefactoring(deepestSuperDeclarations) return true diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignature.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignature.kt index 45fe2ae65ab..01fa0805a8c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignature.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignature.kt @@ -28,7 +28,6 @@ import com.intellij.psi.PsiType import com.intellij.refactoring.BaseRefactoringProcessor import com.intellij.refactoring.changeSignature.* import com.intellij.refactoring.util.CanonicalTypes -import com.intellij.testFramework.LightVirtualFile import com.intellij.util.VisibilityUtil import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.getRepresentativeLightMethod @@ -36,16 +35,14 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde -import org.jetbrains.kotlin.idea.refactoring.createJavaMethod -import org.jetbrains.kotlin.idea.refactoring.toPsiFile +import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations import org.jetbrains.kotlin.idea.refactoring.CallableRefactoring import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.KotlinChangePropertySignatureDialog import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.KotlinChangeSignatureDialog +import org.jetbrains.kotlin.idea.refactoring.createJavaMethod import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext -import org.jetbrains.kotlin.resolve.OverrideResolver interface KotlinChangeSignatureConfiguration { fun configure(originalDescriptor: KotlinMethodDescriptor): KotlinMethodDescriptor = originalDescriptor @@ -224,9 +221,9 @@ class KotlinChangeSignature(project: Project, defaultValueContext: PsiElement ): KotlinChangeInfo? { val jetChangeSignature = KotlinChangeSignature(project, callableDescriptor, configuration, defaultValueContext, null) - val declarations = if (callableDescriptor is CallableMemberDescriptor) { - OverrideResolver.getDeepestSuperDeclarations(callableDescriptor) - } else listOf(callableDescriptor) + val declarations = + if (callableDescriptor is CallableMemberDescriptor) callableDescriptor.getDeepestSuperDeclarations() + else listOf(callableDescriptor) val adjustedDescriptor = jetChangeSignature.adjustDescriptor(declarations) ?: return null diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt index 67fac258cab..46e3672afa8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt @@ -27,13 +27,13 @@ import org.jetbrains.kotlin.asJava.namedUnwrappedElement import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations import org.jetbrains.kotlin.idea.refactoring.canRefactor import org.jetbrains.kotlin.idea.refactoring.getAffectedCallables import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.resolve.OverrideResolver import org.jetbrains.kotlin.utils.SmartList class RenameKotlinParameterProcessor : RenameKotlinPsiProcessor() { @@ -75,7 +75,7 @@ class RenameKotlinParameterProcessor : RenameKotlinPsiProcessor() { val function = element.ownerFunction ?: return val originalDescriptor = function.resolveToDescriptor() as FunctionDescriptor - val affectedCallables = getAffectedCallables(element.project, OverrideResolver.getDeepestSuperDeclarations(originalDescriptor)) + val affectedCallables = getAffectedCallables(element.project, originalDescriptor.getDeepestSuperDeclarations()) for (callable in affectedCallables) { if (!callable.canRefactor()) continue val parameter: PsiNamedElement? = when (callable) { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt index a26bfacf864..cfa672e72ed 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations import org.jetbrains.kotlin.idea.core.isEnumCompanionPropertyWithEntryConflict import org.jetbrains.kotlin.idea.refactoring.dropOverrideKeywordIfNecessary import org.jetbrains.kotlin.idea.references.KtReference @@ -53,7 +54,6 @@ import org.jetbrains.kotlin.psi.psiUtil.findPropertyByName import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.OverrideResolver import org.jetbrains.kotlin.resolve.dataClassUtils.isComponentLike import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.util.findCallableMemberBySignature @@ -426,7 +426,7 @@ class RenameKotlinPropertyProcessor : RenameKotlinPsiProcessor() { if (descriptor != null) { assert(descriptor is PropertyDescriptor) { "Property descriptor is expected" } - val supers = OverrideResolver.getDeepestSuperDeclarations(descriptor as PropertyDescriptor) + val supers = (descriptor as PropertyDescriptor).getDeepestSuperDeclarations() // Take one of supers for now - API doesn't support substitute to several elements (IDEA-48796) val deepest = supers.first() diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinOverridingMethodsWithGenericsSearcher.kt b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinOverridingMethodsWithGenericsSearcher.kt index 9309766c009..cd282e758a3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinOverridingMethodsWithGenericsSearcher.kt +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinOverridingMethodsWithGenericsSearcher.kt @@ -28,18 +28,17 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.getDirectlyOverriddenDeclarations import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.resolve.OverrideResolver class KotlinOverridingMethodsWithGenericsSearcher : QueryExecutor { override fun execute(p: OverridingMethodsSearch.SearchParameters, consumer: Processor): Boolean { val method = p.method if (method !is KtLightMethod) return true - val declaration = method.kotlinOrigin as? KtCallableDeclaration - if (declaration == null) return true + val declaration = method.kotlinOrigin as? KtCallableDeclaration ?: return true val callDescriptor = runReadAction { declaration.resolveToDescriptor() } if (callDescriptor !is CallableDescriptor) return true @@ -70,7 +69,7 @@ class KotlinOverridingMethodsWithGenericsSearcher : QueryExecutor