From a5593f1f3163840bfa607987a30584a69c5abeff Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 30 May 2018 19:55:40 +0300 Subject: [PATCH] Render entries with outer classifiers in call hierarchy (KT-22698) #KT-22698 Fixed --- .../KotlinCallHierarchyNodeDescriptor.java | 95 ++++++++++--------- .../KotlinAnonymousObject_verification.xml | 8 +- .../KotlinFunction_verification.xml | 14 +-- .../KotlinLocalFunction_verification.xml | 8 +- .../kotlinClass/KotlinClass_verification.xml | 10 +- .../KotlinFunction_verification.xml | 2 +- ...tlinFunctionNonCallUsages_verification.xml | 4 +- .../KotlinLocalClass_verification.xml | 8 +- .../KotlinLocalFunction_verification.xml | 8 +- .../KotlinNestedClass_verification.xml | 16 ++-- .../KotlinNestedInnerClass_verification.xml | 12 +-- .../KotlinPackageFunction_verification.xml | 8 +- .../KotlinPackageProperty_verification.xml | 2 +- .../KotlinProperty_verification.xml | 2 +- 14 files changed, 100 insertions(+), 97 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallHierarchyNodeDescriptor.java b/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallHierarchyNodeDescriptor.java index f0bf6121ed6..3bd8bc70358 100644 --- a/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallHierarchyNodeDescriptor.java +++ b/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallHierarchyNodeDescriptor.java @@ -31,14 +31,11 @@ import com.intellij.psi.PsiReference; import com.intellij.ui.LayeredIcon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.ClassDescriptor; -import org.jetbrains.kotlin.descriptors.ConstructorDescriptor; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.FunctionDescriptor; +import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils; +import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.renderer.DescriptorRenderer; -import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode; import javax.swing.*; @@ -141,62 +138,68 @@ public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i @Nullable private static String renderElement(@Nullable PsiElement element) { - String elementText; - String containerText = null; - if (element instanceof KtFile) { - elementText = ((KtFile) element).getName(); + return ((KtFile) element).getName(); } - else if (element instanceof KtNamedDeclaration) { - BindingContext bindingContext = ResolutionUtils.analyze((KtElement) element, BodyResolveMode.FULL); - DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element); - if (descriptor == null) return null; + if (!(element instanceof KtNamedDeclaration)) { + return null; + } - if (element instanceof KtClassOrObject) { - if (element instanceof KtObjectDeclaration && ((KtObjectDeclaration) element).isCompanion()) { - descriptor = descriptor.getContainingDeclaration(); - if (!(descriptor instanceof ClassDescriptor)) return null; + DeclarationDescriptor descriptor = ResolutionUtils.resolveToDescriptorIfAny((KtNamedDeclaration) element, BodyResolveMode.PARTIAL); + if (descriptor == null) return null; + String elementText; + if (element instanceof KtClassOrObject) { + if (element instanceof KtObjectDeclaration && ((KtObjectDeclaration) element).isCompanion()) { + descriptor = descriptor.getContainingDeclaration(); + if (!(descriptor instanceof ClassDescriptor)) return null; + + elementText = renderClassOrObject((ClassDescriptor) descriptor); + } + else if (element instanceof KtEnumEntry) { + elementText = ((KtEnumEntry) element).getName(); + } + else { + if (((KtClassOrObject) element).getName() != null) { elementText = renderClassOrObject((ClassDescriptor) descriptor); } - else if (element instanceof KtEnumEntry) { - elementText = ((KtEnumEntry) element).getName(); - } else { - if (((KtClassOrObject) element).getName() != null) { - elementText = renderClassOrObject((ClassDescriptor) descriptor); - } - else { - elementText = "[anonymous]"; - } + elementText = "[anonymous]"; } } - else if (element instanceof KtNamedFunction || element instanceof KtConstructor) { - elementText = renderNamedFunction((FunctionDescriptor) descriptor); - } - else if (element instanceof KtProperty) { - elementText = ((KtProperty) element).getName(); - } - else return null; - - DeclarationDescriptor containerDescriptor = descriptor.getContainingDeclaration(); - while (containerDescriptor != null) { - String name = containerDescriptor.getName().asString(); - if (!name.startsWith("<")) { - containerText = name; - break; - } - containerDescriptor = containerDescriptor.getContainingDeclaration(); - } + } + else if ((element instanceof KtNamedFunction || element instanceof KtConstructor)) { + if (!(descriptor instanceof FunctionDescriptor)) return null; + elementText = renderNamedFunction((FunctionDescriptor) descriptor); + } + else if (element instanceof KtProperty) { + elementText = ((KtProperty) element).getName(); } else return null; if (elementText == null) return null; - return containerText != null ? containerText + "." + elementText : elementText; - } - public static String renderNamedFunction(FunctionDescriptor descriptor) { + String containerText = null; + DeclarationDescriptor containerDescriptor = descriptor.getContainingDeclaration(); + while (containerDescriptor != null) { + if (containerDescriptor instanceof PackageFragmentDescriptor || containerDescriptor instanceof ModuleDescriptor) { + break; + } + + Name name = containerDescriptor.getName(); + if (!name.isSpecial()) { + String identifier = name.getIdentifier(); + containerText = containerText != null ? identifier + "." + containerText : identifier; + } + + containerDescriptor = containerDescriptor.getContainingDeclaration(); + } + + return containerText != null ? containerText + "." + elementText : elementText; +} + + public static String renderNamedFunction(@NotNull FunctionDescriptor descriptor) { DeclarationDescriptor descriptorForName = descriptor instanceof ConstructorDescriptor ? descriptor.getContainingDeclaration() : descriptor; diff --git a/idea/testData/hierarchy/calls/callees/kotlinAnonymousObject/KotlinAnonymousObject_verification.xml b/idea/testData/hierarchy/calls/callees/kotlinAnonymousObject/KotlinAnonymousObject_verification.xml index 841f9011f96..dc67e81bfdc 100644 --- a/idea/testData/hierarchy/calls/callees/kotlinAnonymousObject/KotlinAnonymousObject_verification.xml +++ b/idea/testData/hierarchy/calls/callees/kotlinAnonymousObject/KotlinAnonymousObject_verification.xml @@ -1,10 +1,10 @@ + + + + - - - - diff --git a/idea/testData/hierarchy/calls/callees/kotlinFunction/KotlinFunction_verification.xml b/idea/testData/hierarchy/calls/callees/kotlinFunction/KotlinFunction_verification.xml index c89544e03b0..f2ca0f4f543 100644 --- a/idea/testData/hierarchy/calls/callees/kotlinFunction/KotlinFunction_verification.xml +++ b/idea/testData/hierarchy/calls/callees/kotlinFunction/KotlinFunction_verification.xml @@ -1,14 +1,14 @@ - - - + - - + + + + - - + + diff --git a/idea/testData/hierarchy/calls/callees/kotlinLocalFunction/KotlinLocalFunction_verification.xml b/idea/testData/hierarchy/calls/callees/kotlinLocalFunction/KotlinLocalFunction_verification.xml index 7b3c459a72e..39fecde44c2 100644 --- a/idea/testData/hierarchy/calls/callees/kotlinLocalFunction/KotlinLocalFunction_verification.xml +++ b/idea/testData/hierarchy/calls/callees/kotlinLocalFunction/KotlinLocalFunction_verification.xml @@ -6,14 +6,14 @@ - + + + + - - - diff --git a/idea/testData/hierarchy/calls/callers/kotlinClass/KotlinClass_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinClass/KotlinClass_verification.xml index a040ef387e8..4bb58ee5816 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinClass/KotlinClass_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinClass/KotlinClass_verification.xml @@ -1,12 +1,12 @@ - - - - - + + + + + diff --git a/idea/testData/hierarchy/calls/callers/kotlinFunction/KotlinFunction_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinFunction/KotlinFunction_verification.xml index 6f0dd05218f..a217f227f31 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinFunction/KotlinFunction_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinFunction/KotlinFunction_verification.xml @@ -5,8 +5,8 @@ + - diff --git a/idea/testData/hierarchy/calls/callers/kotlinFunctionNonCallUsages/KotlinFunctionNonCallUsages_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinFunctionNonCallUsages/KotlinFunctionNonCallUsages_verification.xml index a5143dd7a9d..e37845f103a 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinFunctionNonCallUsages/KotlinFunctionNonCallUsages_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinFunctionNonCallUsages/KotlinFunctionNonCallUsages_verification.xml @@ -1,3 +1,3 @@ - - + + diff --git a/idea/testData/hierarchy/calls/callers/kotlinLocalClass/KotlinLocalClass_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinLocalClass/KotlinLocalClass_verification.xml index 514eb1c87de..1a16c6c1d58 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinLocalClass/KotlinLocalClass_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinLocalClass/KotlinLocalClass_verification.xml @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/idea/testData/hierarchy/calls/callers/kotlinLocalFunction/KotlinLocalFunction_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinLocalFunction/KotlinLocalFunction_verification.xml index affb0ea8dad..181309683f3 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinLocalFunction/KotlinLocalFunction_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinLocalFunction/KotlinLocalFunction_verification.xml @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/idea/testData/hierarchy/calls/callers/kotlinNestedClass/KotlinNestedClass_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinNestedClass/KotlinNestedClass_verification.xml index 4658419a1cb..2fd5633ea81 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinNestedClass/KotlinNestedClass_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinNestedClass/KotlinNestedClass_verification.xml @@ -1,12 +1,12 @@ - - - - - - - - + + + + + + + + diff --git a/idea/testData/hierarchy/calls/callers/kotlinNestedInnerClass/KotlinNestedInnerClass_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinNestedInnerClass/KotlinNestedInnerClass_verification.xml index 39c1dcbcab6..2fd5633ea81 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinNestedInnerClass/KotlinNestedInnerClass_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinNestedInnerClass/KotlinNestedInnerClass_verification.xml @@ -1,12 +1,12 @@ - - - + - + + - - + + + diff --git a/idea/testData/hierarchy/calls/callers/kotlinPackageFunction/KotlinPackageFunction_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinPackageFunction/KotlinPackageFunction_verification.xml index 750da2bacb7..bc5d565ec44 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinPackageFunction/KotlinPackageFunction_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinPackageFunction/KotlinPackageFunction_verification.xml @@ -1,11 +1,11 @@ - - + - - + + + diff --git a/idea/testData/hierarchy/calls/callers/kotlinPackageProperty/KotlinPackageProperty_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinPackageProperty/KotlinPackageProperty_verification.xml index 629adb569a3..cc5f0550703 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinPackageProperty/KotlinPackageProperty_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinPackageProperty/KotlinPackageProperty_verification.xml @@ -5,7 +5,7 @@ + - diff --git a/idea/testData/hierarchy/calls/callers/kotlinProperty/KotlinProperty_verification.xml b/idea/testData/hierarchy/calls/callers/kotlinProperty/KotlinProperty_verification.xml index 79eab2ec097..5c043b80d32 100644 --- a/idea/testData/hierarchy/calls/callers/kotlinProperty/KotlinProperty_verification.xml +++ b/idea/testData/hierarchy/calls/callers/kotlinProperty/KotlinProperty_verification.xml @@ -5,8 +5,8 @@ + -