diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index bc7893f0e83..7c8acbfa947 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -197,6 +197,13 @@ public class DecompiledDataFactory { PsiElement clsMember = BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor); if (clsMember != null) { clsMembersToRanges.put(clsMember, new TextRange(startOffset, endOffset)); + + if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() == ClassKind.OBJECT) { + assert clsMember instanceof PsiClass; + PsiField instanceField = ((PsiClass) clsMember).findFieldByName(JvmAbi.INSTANCE_FIELD, false); + assert instanceField != null; + clsMembersToRanges.put(instanceField, new TextRange(startOffset, endOffset)); + } } } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java index 99c6449d28a..d9a9ab0d778 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetClsNavigationPolicy.java @@ -73,6 +73,12 @@ public class JetClsNavigationPolicy implements ClsCustomNavigationPolicy { return sourceProperty; } } + else if (jetDeclaration instanceof JetClassOrObject) { + JetClassOrObject sourceClass = JetSourceNavigationHelper.getSourceClassOrObject((JetClassOrObject) jetDeclaration); + if (sourceClass != null) { + return sourceClass; + } + } return jetDeclaration; } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index 41cf35dc101..3f2d32be00d 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -188,13 +188,12 @@ public class JetSourceNavigationHelper { } else if (declarationContainer instanceof JetClassBody) { JetClassOrObject parent = (JetClassOrObject)declarationContainer.getParent(); - boolean isClassObject = parent instanceof JetObjectDeclaration; - JetClass jetClass = - isClassObject ? PsiTreeUtil.getParentOfType(parent, JetClass.class) : (JetClass)parent; - if (jetClass == null) { + boolean isClassObject = parent instanceof JetObjectDeclaration && parent.getParent() instanceof JetClassObject; + JetClassOrObject classOrObject = isClassObject ? PsiTreeUtil.getParentOfType(parent, JetClass.class) : parent; + if (classOrObject == null) { return null; } - Pair bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(jetClass); + Pair bindingContextAndClassDescriptor = getBindingContextAndClassDescriptor(classOrObject); if (bindingContextAndClassDescriptor != null) { BindingContext bindingContext = bindingContextAndClassDescriptor.first; ClassDescriptor classDescriptor = bindingContextAndClassDescriptor.second; diff --git a/idea/testData/libraries/decompiled/NamedObject.kt b/idea/testData/libraries/decompiled/NamedObject.kt index 3a9d8036ca5..bb6b5a2bed2 100644 --- a/idea/testData/libraries/decompiled/NamedObject.kt +++ b/idea/testData/libraries/decompiled/NamedObject.kt @@ -3,6 +3,6 @@ package testData.libraries -[public object NamedObject { +[[public object NamedObject { [public final val objectMember : jet.Int] /* compiled code */ -}] \ No newline at end of file +}]] \ No newline at end of file diff --git a/idea/testData/libraries/usercode/NamedObject.kt b/idea/testData/libraries/usercode/NamedObject.kt new file mode 100644 index 00000000000..ffb385c7877 --- /dev/null +++ b/idea/testData/libraries/usercode/NamedObject.kt @@ -0,0 +1,7 @@ +import testData.libraries.* + +val x = NamedObject.objectMember + +// main.kt +//public object <1>NamedObject { +// public val <2>objectMember: Int = 1 diff --git a/idea/tests/org/jetbrains/jet/plugin/libraries/NavigateToLibrarySourceTest.java b/idea/tests/org/jetbrains/jet/plugin/libraries/NavigateToLibrarySourceTest.java index bd9fbf7e1ec..d375f43d98e 100644 --- a/idea/tests/org/jetbrains/jet/plugin/libraries/NavigateToLibrarySourceTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/libraries/NavigateToLibrarySourceTest.java @@ -76,6 +76,10 @@ public class NavigateToLibrarySourceTest extends AbstractNavigateToLibraryTest { doTest(); } + public void testNamedObject() { + doTest(); + } + private void doTest() { userFile = LocalFileSystem.getInstance().findFileByPath(TEST_DATA_PATH + "/usercode/" + getTestName(false) + ".kt"); assertNotNull(userFile);