Call Hierarchy: Support secondary constructors

This commit is contained in:
Alexey Sedunov
2015-03-19 19:01:49 +03:00
parent fe553edfb4
commit 312a1db273
8 changed files with 71 additions and 12 deletions
@@ -26,10 +26,7 @@ import com.intellij.util.ArrayUtil;
import kotlin.Function1; import kotlin.Function1;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil; import org.jetbrains.kotlin.idea.util.ProjectRootsUtil;
import org.jetbrains.kotlin.psi.JetClassOrObject; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.psi.JetNamedFunction;
import org.jetbrains.kotlin.psi.JetProperty;
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage; import org.jetbrains.kotlin.psi.psiUtil.PsiUtilPackage;
public class HierarchyUtils { public class HierarchyUtils {
@@ -40,6 +37,7 @@ public class HierarchyUtils {
input instanceof PsiClass || input instanceof PsiClass ||
input instanceof JetFile || input instanceof JetFile ||
input instanceof JetNamedFunction || input instanceof JetNamedFunction ||
input instanceof JetSecondaryConstructor ||
input instanceof JetClassOrObject || input instanceof JetClassOrObject ||
input instanceof JetProperty; input instanceof JetProperty;
} }
@@ -36,10 +36,7 @@ import com.intellij.ui.LayeredIcon;
import com.intellij.util.Function; import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
@@ -188,7 +185,7 @@ public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i
} }
} }
} }
else if (element instanceof JetNamedFunction) { else if (element instanceof JetNamedFunction || element instanceof JetSecondaryConstructor) {
elementText = renderNamedFunction((FunctionDescriptor) descriptor); elementText = renderNamedFunction((FunctionDescriptor) descriptor);
} }
else if (element instanceof JetProperty) { else if (element instanceof JetProperty) {
@@ -213,7 +210,10 @@ public class KotlinCallHierarchyNodeDescriptor extends HierarchyNodeDescriptor i
} }
private static String renderNamedFunction(FunctionDescriptor descriptor) { private static String renderNamedFunction(FunctionDescriptor descriptor) {
String name = descriptor.getName().asString(); DeclarationDescriptor descriptorForName = descriptor instanceof ConstructorDescriptor
? descriptor.getContainingDeclaration()
: descriptor;
String name = descriptorForName.getName().asString();
String paramTypes = StringUtil.join( String paramTypes = StringUtil.join(
descriptor.getValueParameters(), descriptor.getValueParameters(),
new Function<ValueParameterDescriptor, String>() { new Function<ValueParameterDescriptor, String>() {
@@ -1,7 +1,10 @@
<node text="KA.KA() ()" base="true"> <node text="KA.KA() ()" base="true">
<node text="KClient ()"/>
<node text="KClient.bar() ()"/> <node text="KClient.bar() ()"/>
<node text="KClient.getBar() ()"/> <node text="KClient.getBar() ()"/>
<node text="KClient ()"/>
<node text="JA.JA() ()"/>
<node text="JA.newKA() ()"/> <node text="JA.newKA() ()"/>
<node text="JA ()"/> <node text="JA ()"/>
<node text="JA.JA(Int) ()"/>
<node text="JA2 ()"/>
</node> </node>
@@ -1,7 +1,19 @@
open class JA() { open class JA: KA {
constructor() {
}
constructor(a: Int): super() {
}
public var name: String = KA().getName() public var name: String = KA().getName()
public open fun newKA(): KA? { public open fun newKA(): KA? {
return KA() return KA()
} }
} }
class JA2: KA() {
}
@@ -0,0 +1,8 @@
<node text="B.B(String) ()" base="true">
<node text="JJ.JJ() ()"/>
<node text="JJ.test() ()"/>
<node text="B.B() ()"/>
<node text="A.A(Int) ()"/>
<node text="C ()"/>
<node text="test() ()"/>
</node>
@@ -0,0 +1,23 @@
open class B {
constructor(): this("") {
}
<caret>constructor(s: String) {
}
}
open class A : B {
constructor(a: Int) : super("") {
}
}
class C: B("") {
}
fun test() {
B("")
}
@@ -0,0 +1,9 @@
class JJ extends B {
JJ() {
super("");
}
static void test() {
new B("");
}
}
@@ -391,6 +391,12 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest {
doCallerHierarchyTest(fileName); doCallerHierarchyTest(fileName);
} }
@TestMetadata("kotlinSecondaryConstructor")
public void testKotlinSecondaryConstructor() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/hierarchy/calls/callers/kotlinSecondaryConstructor/");
doCallerHierarchyTest(fileName);
}
@TestMetadata("kotlinUnresolvedFunction") @TestMetadata("kotlinUnresolvedFunction")
public void testKotlinUnresolvedFunction() throws Exception { public void testKotlinUnresolvedFunction() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/hierarchy/calls/callers/kotlinUnresolvedFunction/"); String fileName = JetTestUtils.navigationMetadata("idea/testData/hierarchy/calls/callers/kotlinUnresolvedFunction/");