Supported navigation to decompiled named object and its members.

This commit is contained in:
Evgeny Gerashchenko
2012-12-28 21:03:47 +04:00
parent 859ef8432e
commit e16ff27e57
6 changed files with 42 additions and 11 deletions
@@ -89,7 +89,8 @@ public class DecompiledDataFactory {
if (nd != null) {
for (DeclarationDescriptor member : sortDeclarations(nd.getMemberScope().getAllDescriptors())) {
if (member instanceof ClassDescriptor || member instanceof NamespaceDescriptor) {
if (member instanceof ClassDescriptor || member instanceof NamespaceDescriptor
|| isNamedObjectProperty(member, bindingContext)) {
continue;
}
appendDescriptor(member, "");
@@ -127,6 +128,7 @@ public class DecompiledDataFactory {
}
private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) {
// Don't render property for object declaration
int startOffset = builder.length();
String renderedDescriptor = DESCRIPTOR_RENDERER.render(descriptor);
renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT);
@@ -163,6 +165,9 @@ public class DecompiledDataFactory {
if (member instanceof CallableMemberDescriptor && ((CallableMemberDescriptor) member).getKind() != CallableMemberDescriptor.Kind.DECLARATION) {
continue;
}
if (isNamedObjectProperty(member, bindingContext)) {
continue;
}
if (firstPassed) {
builder.append("\n");
@@ -209,6 +214,16 @@ public class DecompiledDataFactory {
return false;
}
private static boolean isNamedObjectProperty(@NotNull DeclarationDescriptor descriptor, BindingContext bindingContext) {
if (descriptor instanceof PropertyDescriptor) {
ClassDescriptor objectDeclaration = bindingContext.get(BindingContext.OBJECT_DECLARATION_CLASS, (PropertyDescriptor) descriptor);
if (objectDeclaration != null && objectDeclaration.getKind() == ClassKind.OBJECT) {
return true;
}
}
return false;
}
public static boolean isKotlinClass(@NotNull PsiClass psiClass) {
return hasAnnotation(psiClass, JET_CLASS);
}
@@ -27,14 +27,14 @@ public class JetClsNavigationPolicy implements ClsCustomNavigationPolicy {
@Override
@Nullable
public PsiElement getNavigationElement(@NotNull ClsClassImpl clsClass) {
JetClass jetClass = (JetClass) getJetDeclarationByClsElement(clsClass);
if (jetClass != null) {
JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClass(jetClass);
JetClassOrObject jetClassOrObject = (JetClassOrObject) getJetDeclarationByClsElement(clsClass);
if (jetClassOrObject != null) {
JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClassOrObject(jetClassOrObject);
if (sourceClass != null) {
return sourceClass;
}
}
return jetClass;
return jetClassOrObject;
}
@Override
@@ -55,7 +55,7 @@ public class JetClsNavigationPolicy implements ClsCustomNavigationPolicy {
}
else if (jetDeclaration instanceof JetClass) {
assert clsMethod.getReturnType() == null; // constructor
JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClass((JetClass) jetDeclaration);
JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClassOrObject((JetClass) jetDeclaration);
if (sourceClass != null) {
return sourceClass;
}
@@ -79,9 +79,9 @@ public class JetSourceNavigationHelper {
}
@Nullable
private static Pair<BindingContext, ClassDescriptor> getBindingContextAndClassDescriptor(@NotNull JetClass decompiledClass) {
return getBindingContextAndClassOrNamespaceDescriptor(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, decompiledClass,
JetPsiUtil.getFQName(decompiledClass));
private static Pair<BindingContext, ClassDescriptor> getBindingContextAndClassDescriptor(@NotNull JetClassOrObject decompiledClassOrObject) {
return getBindingContextAndClassOrNamespaceDescriptor(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, decompiledClassOrObject,
JetPsiUtil.getFQName((JetNamedDeclaration) decompiledClassOrObject));
}
@Nullable
@@ -93,8 +93,8 @@ public class JetSourceNavigationHelper {
}
@Nullable
public static JetClassOrObject getSourceClass(@NotNull JetClass decompiledClass) {
Pair<BindingContext, ClassDescriptor> bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(decompiledClass);
public static JetClassOrObject getSourceClassOrObject(@NotNull JetClassOrObject decompiledClassOrObject) {
Pair<BindingContext, ClassDescriptor> bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(decompiledClassOrObject);
if (bindingContextAndClassDescriptor == null) return null;
PsiElement declaration = BindingContextUtils.classDescriptorToDeclaration(
bindingContextAndClassDescriptor.first, bindingContextAndClassDescriptor.second);
@@ -0,0 +1,8 @@
// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not available
package testData.libraries
[public object NamedObject {
[public final val objectMember : jet.Int] /* compiled code */
}]
+4
View File
@@ -29,6 +29,10 @@ public class WithTraitClassObject {
public abstract class AbstractClass {
}
public object NamedObject {
public val objectMember: Int = 1
}
public enum class Color(val rgb : Int) {
RED : Color(0xFF0000)
GREEN : Color(0x00FF00)
@@ -71,6 +71,10 @@ public class NavigateToDecompiledLibraryTest extends AbstractNavigateToLibraryTe
doTest();
}
public void testNamedObject() {
doTest();
}
private void doTest() {
classFile = getClassFile();