diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index 26602951faf..bc7893f0e83 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -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); } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java index 94554c41fa1..99c6449d28a 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java @@ -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; } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index 2a4d73b4618..41cf35dc101 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -79,9 +79,9 @@ public class JetSourceNavigationHelper { } @Nullable - private static Pair getBindingContextAndClassDescriptor(@NotNull JetClass decompiledClass) { - return getBindingContextAndClassOrNamespaceDescriptor(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, decompiledClass, - JetPsiUtil.getFQName(decompiledClass)); + private static Pair 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 bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(decompiledClass); + public static JetClassOrObject getSourceClassOrObject(@NotNull JetClassOrObject decompiledClassOrObject) { + Pair bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(decompiledClassOrObject); if (bindingContextAndClassDescriptor == null) return null; PsiElement declaration = BindingContextUtils.classDescriptorToDeclaration( bindingContextAndClassDescriptor.first, bindingContextAndClassDescriptor.second); diff --git a/idea/testData/libraries/decompiled/NamedObject.kt b/idea/testData/libraries/decompiled/NamedObject.kt new file mode 100644 index 00000000000..3a9d8036ca5 --- /dev/null +++ b/idea/testData/libraries/decompiled/NamedObject.kt @@ -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 */ +}] \ No newline at end of file diff --git a/idea/testData/libraries/library/main.kt b/idea/testData/libraries/library/main.kt index af9c18f16b1..773b7ff30f7 100644 --- a/idea/testData/libraries/library/main.kt +++ b/idea/testData/libraries/library/main.kt @@ -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) diff --git a/idea/tests/org/jetbrains/jet/plugin/libraries/NavigateToDecompiledLibraryTest.java b/idea/tests/org/jetbrains/jet/plugin/libraries/NavigateToDecompiledLibraryTest.java index aefdf4ccac4..9909415e8d2 100644 --- a/idea/tests/org/jetbrains/jet/plugin/libraries/NavigateToDecompiledLibraryTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/libraries/NavigateToDecompiledLibraryTest.java @@ -71,6 +71,10 @@ public class NavigateToDecompiledLibraryTest extends AbstractNavigateToLibraryTe doTest(); } + public void testNamedObject() { + doTest(); + } + private void doTest() { classFile = getClassFile();