diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionUtils.kt b/idea/src/org/jetbrains/jet/plugin/completion/CompletionUtils.kt index c4caa831b0a..90005f1e42b 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionUtils.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionUtils.kt @@ -26,6 +26,8 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.renderer.DescriptorRenderer import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor +import org.jetbrains.jet.lang.descriptors.ClassKind +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor enum class ItemPriority { DEFAULT @@ -63,13 +65,14 @@ fun qualifiedNameForSourceCode(descriptor: ClassDescriptor): String? { val name = descriptor.getName() if (name.isSpecial()) return null val nameString = DescriptorRenderer.SOURCE_CODE.renderName(name) - val parent = descriptor.getContainingDeclaration() - val qualifier = when (parent) { - is ClassDescriptor -> qualifiedNameForSourceCode(parent) - is PackageViewDescriptor -> DescriptorRenderer.SOURCE_CODE.renderFqName(parent.getFqName()) - is PackageFragmentDescriptor -> DescriptorRenderer.SOURCE_CODE.renderFqName(parent.fqName) - else -> null - } + val qualifier = qualifierName(descriptor.getContainingDeclaration()) return if (qualifier != null && qualifier != "") qualifier + "." + nameString else nameString } +private fun qualifierName(descriptor: DeclarationDescriptor): String? = when (descriptor) { + is ClassDescriptor -> if (descriptor.getKind() != ClassKind.CLASS_OBJECT) qualifiedNameForSourceCode(descriptor) else qualifierName(descriptor.getContainingDeclaration()) + is PackageViewDescriptor -> DescriptorRenderer.SOURCE_CODE.renderFqName(descriptor.getFqName()) + is PackageFragmentDescriptor -> DescriptorRenderer.SOURCE_CODE.renderFqName(descriptor.fqName) + else -> null +} + diff --git a/idea/testData/completion/handlers/smart/ClassInClassObject.kt b/idea/testData/completion/handlers/smart/ClassInClassObject.kt new file mode 100644 index 00000000000..5ea15feb6bb --- /dev/null +++ b/idea/testData/completion/handlers/smart/ClassInClassObject.kt @@ -0,0 +1,9 @@ +class A { + class object { + class Inner {} + } +} + +val v: A.Inner = + +// ELEMENT: Inner diff --git a/idea/testData/completion/handlers/smart/ClassInClassObject.kt.after b/idea/testData/completion/handlers/smart/ClassInClassObject.kt.after new file mode 100644 index 00000000000..61e8cd70944 --- /dev/null +++ b/idea/testData/completion/handlers/smart/ClassInClassObject.kt.after @@ -0,0 +1,9 @@ +class A { + class object { + class Inner {} + } +} + +val v: A.Inner = A.Inner() + +// ELEMENT: Inner diff --git a/idea/testData/completion/handlers/smart/ClassInObject.kt b/idea/testData/completion/handlers/smart/ClassInObject.kt new file mode 100644 index 00000000000..497c6c0ae5a --- /dev/null +++ b/idea/testData/completion/handlers/smart/ClassInObject.kt @@ -0,0 +1,9 @@ +class A { + object O { + class Inner {} + + val v: Inner = + } +} + +// ELEMENT: Inner diff --git a/idea/testData/completion/handlers/smart/ClassInObject.kt.after b/idea/testData/completion/handlers/smart/ClassInObject.kt.after new file mode 100644 index 00000000000..33a3f93275b --- /dev/null +++ b/idea/testData/completion/handlers/smart/ClassInObject.kt.after @@ -0,0 +1,9 @@ +class A { + object O { + class Inner {} + + val v: Inner = Inner() + } +} + +// ELEMENT: Inner diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java index de65a380113..5e6cdbf8118 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java @@ -88,6 +88,16 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion doTest("idea/testData/completion/handlers/smart/AutoCompleteAfterAs3.kt"); } + @TestMetadata("ClassInClassObject.kt") + public void testClassInClassObject() throws Exception { + doTest("idea/testData/completion/handlers/smart/ClassInClassObject.kt"); + } + + @TestMetadata("ClassInObject.kt") + public void testClassInObject() throws Exception { + doTest("idea/testData/completion/handlers/smart/ClassInObject.kt"); + } + @TestMetadata("ClassObjectMethod1.kt") public void testClassObjectMethod1() throws Exception { doTest("idea/testData/completion/handlers/smart/ClassObjectMethod1.kt");