Supported navigation to decompiled named object and its members.
This commit is contained in:
@@ -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 */
|
||||
}]
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user