Use KotlinCallHierarchyNodeDescriptor for Kotlin declarations only

This commit is contained in:
Alexey Sedunov
2013-09-26 21:21:18 +04:00
parent 5b7881f40c
commit c93d35ad57
15 changed files with 114 additions and 154 deletions
@@ -12,10 +12,8 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.Navigatable;
import com.intellij.psi.*;
import com.intellij.psi.presentation.java.ClassPresentationUtil;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiFormatUtilBase;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.ui.LayeredIcon;
import com.intellij.util.Function;
@@ -32,12 +30,9 @@ import org.jetbrains.jet.renderer.DescriptorRenderer;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor implements Navigatable {
private int usageCount = 1;
private final List<PsiReference> references = new ArrayList<PsiReference>();
private final CallHierarchyNodeDescriptor javaDelegate;
public KotlinCallHierarchyNodeDescriptor(@NotNull Project project,
@@ -57,14 +52,6 @@ public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i
usageCount++;
}
public void addReference(PsiReference reference) {
references.add(reference);
}
public boolean hasReference(PsiReference reference) {
return references.contains(reference);
}
public final PsiElement getTargetElement(){
return myElement;
}
@@ -132,9 +119,10 @@ public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i
);
}
if (packageName != null && packageName.length() > 0) {
myHighlightedText.getEnding().addText(" (" + packageName + ")", HierarchyNodeDescriptor.getPackageNameAttributes());
if (packageName == null) {
packageName = "";
}
myHighlightedText.getEnding().addText(" (" + packageName + ")", HierarchyNodeDescriptor.getPackageNameAttributes());
myName = myHighlightedText.getText();
@@ -196,32 +184,12 @@ public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i
containerDescriptor = containerDescriptor.getContainingDeclaration();
}
}
else if (element instanceof PsiMember) {
PsiMember member = (PsiMember) element;
if (member instanceof PsiMethod) {
elementText = renderPsiMethod((PsiMethod) member);
} else if (member instanceof PsiClass) {
elementText = ClassPresentationUtil.getNameForClass((PsiClass) member, false);
} else return null;
PsiClass containingClass = member.getContainingClass();
if (containingClass != null) {
containerText = ClassPresentationUtil.getNameForClass(containingClass, false);
}
}
else return null;
if (elementText == null) return null;
return containerText != null ? containerText + "." + elementText : elementText;
}
private static String renderPsiMethod(PsiMethod member) {
return PsiFormatUtil.formatMethod(
member, PsiSubstitutor.EMPTY, PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS, PsiFormatUtilBase.SHOW_TYPE
);
}
private static String renderNamedFunction(FunctionDescriptor descriptor) {
String name = descriptor.getName().asString();
String paramTypes = StringUtil.join(
@@ -89,8 +89,8 @@ public class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStructure {
private Object[] processCallers(PsiElement element, HierarchyNodeDescriptor descriptor) {
SearchScope searchScope = getSearchScope(scopeType, basePsiClass);
Map<PsiElement, KotlinCallHierarchyNodeDescriptor> methodToDescriptorMap =
new HashMap<PsiElement, KotlinCallHierarchyNodeDescriptor>();
Map<PsiElement, HierarchyNodeDescriptor> methodToDescriptorMap =
new HashMap<PsiElement, HierarchyNodeDescriptor>();
Object[] javaCallers = null;
if (element instanceof PsiMethod && javaTreeStructure != null) {
@@ -118,7 +118,7 @@ public class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStructure {
private void processPsiMethodCallers(
@Nullable PsiMethod lightMethod,
HierarchyNodeDescriptor descriptor,
Map<PsiElement, KotlinCallHierarchyNodeDescriptor> methodToDescriptorMap,
Map<PsiElement, HierarchyNodeDescriptor> methodToDescriptorMap,
SearchScope searchScope,
boolean kotlinOnly
) {
@@ -130,7 +130,7 @@ public class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStructure {
private void processJetClassOrObjectCallers(
final JetClassOrObject classOrObject,
HierarchyNodeDescriptor descriptor,
Map<PsiElement, KotlinCallHierarchyNodeDescriptor> methodToDescriptorMap,
Map<PsiElement, HierarchyNodeDescriptor> methodToDescriptorMap,
SearchScope searchScope
) {
Processor<PsiReference> processor = new FilteringProcessor<PsiReference>(
@@ -147,7 +147,7 @@ public class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStructure {
private Processor<PsiReference> defaultQueryProcessor(
final HierarchyNodeDescriptor descriptor,
final Map<PsiElement, KotlinCallHierarchyNodeDescriptor> methodToDescriptorMap,
final Map<PsiElement, HierarchyNodeDescriptor> methodToDescriptorMap,
final boolean kotlinOnly
) {
return new ReadActionProcessor<PsiReference>() {
@@ -188,15 +188,7 @@ public class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStructure {
}
if (element != null) {
KotlinCallHierarchyNodeDescriptor d = methodToDescriptorMap.get(element);
if (d == null) {
d = new KotlinCallHierarchyNodeDescriptor(myProject, descriptor, element, false, true);
methodToDescriptorMap.put(element, d);
}
else if (!d.hasReference(ref)) {
d.incrementUsageCount();
}
d.addReference(ref);
addNodeDescriptorForElement(element, methodToDescriptorMap, descriptor);
}
return true;
@@ -1,4 +1,4 @@
<node text="KClient.KClient()" base="true">
<node text="KClient.KClient() ()" base="true">
<node text="KA.KA()(2 usages) ()"/>
<node text="KA.foo(String) ()"/>
<node text="JA.JA()(2 usages) ()"/>
@@ -1,4 +1,4 @@
<node text="KClient.bar()" base="true">
<node text="KClient.bar() ()" base="true">
<node text="KA.KA()(2 usages) ()"/>
<node text="KA.foo(String)(2 usages) ()"/>
<node text="JA.JA()(4 usages) ()"/>
@@ -1,15 +1,15 @@
<node text="KClient" base="true">
<node text="KClientBase"/>
<node text="KA(4 usages)"/>
<node text="KA.foo(String)(2 usages)"/>
<node text="KA.name(2 usages)"/>
<node text="JA.JA()(4 usages)"/>
<node text="JA.foo(String)(2 usages)">
<node text="KClient ()" base="true">
<node text="KA.name(2 usages) ()"/>
<node text="KClientBase ()"/>
<node text="packageVal ()"/>
<node text="KA.foo(String)(2 usages) ()"/>
<node text="JA.JA()(4 usages) ()"/>
<node text="JA.foo(String)(2 usages) ()">
<node text="PrintStream.println(String) (java.io)"/>
</node>
<node text="KClient.localFun(String)">
<node text="packageFun(String)"/>
<node text="KA(4 usages) ()"/>
<node text="KClient.localFun(String) ()">
<node text="packageFun(String) ()"/>
</node>
<node text="packageVal"/>
<node text="packageFun(String)(2 usages)"/>
<node text="packageFun(String)(2 usages) ()"/>
</node>
@@ -1,10 +1,10 @@
<node text="KClient" base="true">
<node text="packageFun(String)(2 usages)"/>
<node text="KA(2 usages)"/>
<node text="KA.name"/>
<node text="KA.foo(String)"/>
<node text="JA.JA()(2 usages)"/>
<node text="JA.foo(String)">
<node text="KClient ()" base="true">
<node text="KA.name ()"/>
<node text="JA.JA()(2 usages) ()"/>
<node text="JA.foo(String) ()">
<node text="PrintStream.println(String) (java.io)"/>
</node>
</node>
<node text="packageFun(String)(2 usages) ()"/>
<node text="KA.foo(String) ()"/>
<node text="KA(2 usages) ()"/>
</node>
@@ -1,10 +1,10 @@
<node text="MyEnum.FIRST" base="true">
<node text="packageFun(String)(2 usages)"/>
<node text="KA(2 usages)"/>
<node text="KA.name"/>
<node text="KA.foo(String)"/>
<node text="JA.JA()(2 usages)"/>
<node text="JA.foo(String)">
<node text="MyEnum.FIRST ()" base="true">
<node text="KA.name ()"/>
<node text="JA.foo(String) ()">
<node text="PrintStream.println(String) (java.io)"/>
</node>
</node>
<node text="KA(2 usages) ()"/>
<node text="KA.foo(String) ()"/>
<node text="packageFun(String)(2 usages) ()"/>
<node text="JA.JA()(2 usages) ()"/>
</node>
@@ -1,14 +1,14 @@
<node text="KClient.bar()" base="true">
<node text="bar.localFun(String)(2 usages)">
<node text="packageFun(String)"/>
</node>
<node text="KA(4 usages)"/>
<node text="KA.foo(String)(2 usages)"/>
<node text="KA.name(2 usages)"/>
<node text="JA.JA()(4 usages)"/>
<node text="JA.foo(String)(2 usages)">
<node text="KClient.bar() ()" base="true">
<node text="KA.foo(String)(2 usages) ()"/>
<node text="packageFun(String) ()"/>
<node text="packageVal ()"/>
<node text="JA.foo(String)(2 usages) ()">
<node text="PrintStream.println(String) (java.io)"/>
</node>
<node text="packageVal"/>
<node text="packageFun(String)"/>
<node text="JA.JA()(4 usages) ()"/>
<node text="bar.localFun(String)(2 usages) ()">
<node text="packageFun(String) ()"/>
</node>
<node text="KA.name(2 usages) ()"/>
<node text="KA(4 usages) ()"/>
</node>
@@ -1,15 +1,15 @@
<node text="KClient" base="true">
<node text="KClientBase"/>
<node text="KA(4 usages)"/>
<node text="KA.foo(String)(2 usages)"/>
<node text="KA.name(2 usages)"/>
<node text="JA.JA()(4 usages)"/>
<node text="JA.foo(String)(2 usages)">
<node text="KClient ()" base="true">
<node text="JA.foo(String)(2 usages) ()">
<node text="PrintStream.println(String) (java.io)"/>
</node>
<node text="KClient.localFun(String)">
<node text="packageFun(String)"/>
<node text="KA.name(2 usages) ()"/>
<node text="packageFun(String)(2 usages) ()"/>
<node text="packageVal ()"/>
<node text="KA(4 usages) ()"/>
<node text="KClientBase ()"/>
<node text="KClient.localFun(String) ()">
<node text="packageFun(String) ()"/>
</node>
<node text="packageVal"/>
<node text="packageFun(String)(2 usages)"/>
<node text="JA.JA()(4 usages) ()"/>
<node text="KA.foo(String)(2 usages) ()"/>
</node>
@@ -1,14 +1,14 @@
<node text="KClient.bar" base="true">
<node text="KClient.localFun(String)(2 usages)">
<node text="packageFun(String)"/>
<node text="KClient.bar ()" base="true">
<node text="KClient.localFun(String)(2 usages) ()">
<node text="packageFun(String) ()"/>
</node>
<node text="KA(4 usages)"/>
<node text="KA.foo(String)(2 usages)"/>
<node text="KA.name(2 usages)"/>
<node text="JA.JA()(4 usages)"/>
<node text="JA.foo(String)(2 usages)">
<node text="KA.name(2 usages) ()"/>
<node text="KA.foo(String)(2 usages) ()"/>
<node text="KA(4 usages) ()"/>
<node text="packageFun(String) ()"/>
<node text="packageVal ()"/>
<node text="JA.JA()(4 usages) ()"/>
<node text="JA.foo(String)(2 usages) ()">
<node text="PrintStream.println(String) (java.io)"/>
</node>
<node text="packageVal"/>
<node text="packageFun(String)"/>
</node>
@@ -1,7 +1,7 @@
<node text="KA.KA()" base="true">
<node text="KA.KA() ()" base="true">
<node text="KClient ()"/>
<node text="KClient.bar() ()"/>
<node text="KClient.getBar() ()"/>
<node text="KClient ()"/>
<node text="JA.newKA()"/>
<node text="JA"/>
<node text="JA.newKA() ()"/>
<node text="JA ()"/>
</node>
@@ -1,7 +1,7 @@
<node text="KA.foo(String)" base="true">
<node text="KClient(2 usages) ()"/>
<node text="KClient.getBar() ()"/>
<node text="KA.foo(String) ()" base="true">
<node text="KClient.bar() ()"/>
<node text="JA.foo()"/>
<node text="JA"/>
<node text="KClient.getBar() ()"/>
<node text="KClient(2 usages) ()"/>
<node text="JA.foo() ()"/>
<node text="JA ()"/>
</node>
@@ -1,12 +1,12 @@
<node text="KA" base="true">
<node text="KClientObj"/>
<node text="bar.localFun()"/>
<node text="packageFun(String)"/>
<node text="KClient"/>
<node text="KClient.bar()"/>
<node text="main0.kt"/>
<node text="JA.newKA()"/>
<node text="JA"/>
<node text="KClient.bar"/>
<node text="KClient"/>
<node text="KA ()" base="true">
<node text="JA ()"/>
<node text="packageFun(String) ()"/>
<node text="KClient.bar ()"/>
<node text="bar.localFun() ()"/>
<node text="main0.kt ()"/>
<node text="KClientObj ()"/>
<node text="JA.newKA() ()"/>
<node text="KClient ()"/>
<node text="KClient ()"/>
<node text="KClient.bar() ()"/>
</node>
@@ -1,12 +1,12 @@
<node text="KA.foo(String)" base="true">
<node text="KClient"/>
<node text="bar.localFun()"/>
<node text="packageFun(String)"/>
<node text="KClientObj"/>
<node text="KClient.bar"/>
<node text="main0.kt"/>
<node text="JA.foo()"/>
<node text="JA"/>
<node text="KClient"/>
<node text="KClient.bar()"/>
<node text="KA.foo(String) ()" base="true">
<node text="KClientObj ()"/>
<node text="JA.foo() ()"/>
<node text="packageFun(String) ()"/>
<node text="KClient ()"/>
<node text="KClient ()"/>
<node text="bar.localFun() ()"/>
<node text="KClient.bar() ()"/>
<node text="KClient.bar ()"/>
<node text="main0.kt ()"/>
<node text="JA ()"/>
</node>
@@ -1,12 +1,12 @@
<node text="KA.name" base="true">
<node text="packageFun(String)(2 usages)"/>
<node text="KClient.bar()(2 usages)"/>
<node text="KClient.bar(4 usages)"/>
<node text="bar.localFun()(2 usages)"/>
<node text="JA.getName()"/>
<node text="JA"/>
<node text="KClient(2 usages)"/>
<node text="KClient(2 usages)"/>
<node text="KClientObj(4 usages)"/>
<node text="main0.kt(2 usages)"/>
<node text="KA.name ()" base="true">
<node text="KClient(2 usages) ()"/>
<node text="main0.kt(2 usages) ()"/>
<node text="KClient(2 usages) ()"/>
<node text="packageFun(String)(2 usages) ()"/>
<node text="KClientObj(4 usages) ()"/>
<node text="bar.localFun()(2 usages) ()"/>
<node text="KClient.bar(4 usages) ()"/>
<node text="JA.getName() ()"/>
<node text="KClient.bar()(2 usages) ()"/>
<node text="JA ()"/>
</node>