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