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) { if (nd != null) {
for (DeclarationDescriptor member : sortDeclarations(nd.getMemberScope().getAllDescriptors())) { 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; continue;
} }
appendDescriptor(member, ""); appendDescriptor(member, "");
@@ -127,6 +128,7 @@ public class DecompiledDataFactory {
} }
private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) { private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) {
// Don't render property for object declaration
int startOffset = builder.length(); int startOffset = builder.length();
String renderedDescriptor = DESCRIPTOR_RENDERER.render(descriptor); String renderedDescriptor = DESCRIPTOR_RENDERER.render(descriptor);
renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT); renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT);
@@ -163,6 +165,9 @@ public class DecompiledDataFactory {
if (member instanceof CallableMemberDescriptor && ((CallableMemberDescriptor) member).getKind() != CallableMemberDescriptor.Kind.DECLARATION) { if (member instanceof CallableMemberDescriptor && ((CallableMemberDescriptor) member).getKind() != CallableMemberDescriptor.Kind.DECLARATION) {
continue; continue;
} }
if (isNamedObjectProperty(member, bindingContext)) {
continue;
}
if (firstPassed) { if (firstPassed) {
builder.append("\n"); builder.append("\n");
@@ -209,6 +214,16 @@ public class DecompiledDataFactory {
return false; 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) { public static boolean isKotlinClass(@NotNull PsiClass psiClass) {
return hasAnnotation(psiClass, JET_CLASS); return hasAnnotation(psiClass, JET_CLASS);
} }
@@ -27,14 +27,14 @@ public class JetClsNavigationPolicy implements ClsCustomNavigationPolicy {
@Override @Override
@Nullable @Nullable
public PsiElement getNavigationElement(@NotNull ClsClassImpl clsClass) { public PsiElement getNavigationElement(@NotNull ClsClassImpl clsClass) {
JetClass jetClass = (JetClass) getJetDeclarationByClsElement(clsClass); JetClassOrObject jetClassOrObject = (JetClassOrObject) getJetDeclarationByClsElement(clsClass);
if (jetClass != null) { if (jetClassOrObject != null) {
JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClass(jetClass); JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClassOrObject(jetClassOrObject);
if (sourceClass != null) { if (sourceClass != null) {
return sourceClass; return sourceClass;
} }
} }
return jetClass; return jetClassOrObject;
} }
@Override @Override
@@ -55,7 +55,7 @@ public class JetClsNavigationPolicy implements ClsCustomNavigationPolicy {
} }
else if (jetDeclaration instanceof JetClass) { else if (jetDeclaration instanceof JetClass) {
assert clsMethod.getReturnType() == null; // constructor assert clsMethod.getReturnType() == null; // constructor
JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClass((JetClass) jetDeclaration); JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClassOrObject((JetClass) jetDeclaration);
if (sourceClass != null) { if (sourceClass != null) {
return sourceClass; return sourceClass;
} }
@@ -79,9 +79,9 @@ public class JetSourceNavigationHelper {
} }
@Nullable @Nullable
private static Pair<BindingContext, ClassDescriptor> getBindingContextAndClassDescriptor(@NotNull JetClass decompiledClass) { private static Pair<BindingContext, ClassDescriptor> getBindingContextAndClassDescriptor(@NotNull JetClassOrObject decompiledClassOrObject) {
return getBindingContextAndClassOrNamespaceDescriptor(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, decompiledClass, return getBindingContextAndClassOrNamespaceDescriptor(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, decompiledClassOrObject,
JetPsiUtil.getFQName(decompiledClass)); JetPsiUtil.getFQName((JetNamedDeclaration) decompiledClassOrObject));
} }
@Nullable @Nullable
@@ -93,8 +93,8 @@ public class JetSourceNavigationHelper {
} }
@Nullable @Nullable
public static JetClassOrObject getSourceClass(@NotNull JetClass decompiledClass) { public static JetClassOrObject getSourceClassOrObject(@NotNull JetClassOrObject decompiledClassOrObject) {
Pair<BindingContext, ClassDescriptor> bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(decompiledClass); Pair<BindingContext, ClassDescriptor> bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(decompiledClassOrObject);
if (bindingContextAndClassDescriptor == null) return null; if (bindingContextAndClassDescriptor == null) return null;
PsiElement declaration = BindingContextUtils.classDescriptorToDeclaration( PsiElement declaration = BindingContextUtils.classDescriptorToDeclaration(
bindingContextAndClassDescriptor.first, bindingContextAndClassDescriptor.second); 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 abstract class AbstractClass {
} }
public object NamedObject {
public val objectMember: Int = 1
}
public enum class Color(val rgb : Int) { public enum class Color(val rgb : Int) {
RED : Color(0xFF0000) RED : Color(0xFF0000)
GREEN : Color(0x00FF00) GREEN : Color(0x00FF00)
@@ -71,6 +71,10 @@ public class NavigateToDecompiledLibraryTest extends AbstractNavigateToLibraryTe
doTest(); doTest();
} }
public void testNamedObject() {
doTest();
}
private void doTest() { private void doTest() {
classFile = getClassFile(); classFile = getClassFile();