diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/StaticMembers.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/StaticMembers.kt index 7efad5ad0b2..d3b15998770 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/StaticMembers.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/StaticMembers.kt @@ -82,6 +82,11 @@ class StaticMembers(val bindingContext: BindingContext, val resolveSession: Reso else if (DescriptorUtils.isEnumEntry(descriptor) && !enumEntriesToSkip.contains(descriptor)) { classifier = { ExpectedInfoClassification.MATCHES } /* we do not need to check type of enum entry because it's taken from proper enum */ } + else if (descriptor is ClassDescriptor && DescriptorUtils.isObject(descriptor)) { + classifier = { expectedInfo -> + if (descriptor.getDefaultType().isSubtypeOf(expectedInfo.`type`)) ExpectedInfoClassification.MATCHES else ExpectedInfoClassification.NOT_MATCHES + } + } else { return } @@ -101,9 +106,11 @@ class StaticMembers(val bindingContext: BindingContext, val resolveSession: Reso classObject.getDefaultType().getMemberScope().getAllDescriptors().forEach(::processMember) } - if (classDescriptor.getKind() == ClassKind.ENUM_CLASS) { - classDescriptor.getDefaultType().getMemberScope().getAllDescriptors().forEach(::processMember) + var members = classDescriptor.getDefaultType().getMemberScope().getAllDescriptors() + if (classDescriptor.getKind() != ClassKind.ENUM_CLASS) { + members = members.filter { DescriptorUtils.isObject(it) } } + members.forEach(::processMember) } private fun createLookupElement(memberDescriptor: DeclarationDescriptor, classDescriptor: ClassDescriptor): LookupElement { diff --git a/idea/testData/completion/handlers/smart/ObjectFromType.kt b/idea/testData/completion/handlers/smart/ObjectFromType.kt new file mode 100644 index 00000000000..808686aa2f7 --- /dev/null +++ b/idea/testData/completion/handlers/smart/ObjectFromType.kt @@ -0,0 +1,13 @@ +package p + +class Outer { + trait T { + object Null : T { } + } +} + +fun foo(): Outer.T { + return +} + +// ELEMENT: "T.Null" diff --git a/idea/testData/completion/handlers/smart/ObjectFromType.kt.after b/idea/testData/completion/handlers/smart/ObjectFromType.kt.after new file mode 100644 index 00000000000..d0d4d7db74e --- /dev/null +++ b/idea/testData/completion/handlers/smart/ObjectFromType.kt.after @@ -0,0 +1,13 @@ +package p + +class Outer { + trait T { + object Null : T { } + } +} + +fun foo(): Outer.T { + return Outer.T.Null +} + +// ELEMENT: "T.Null" diff --git a/idea/testData/completion/smart/ObjectsFromType.kt b/idea/testData/completion/smart/ObjectsFromType.kt new file mode 100644 index 00000000000..b8e22374d81 --- /dev/null +++ b/idea/testData/completion/smart/ObjectsFromType.kt @@ -0,0 +1,14 @@ +package p + +trait T { + object Null : T { } + + object Other {} +} + +fun foo(): T { + return +} + +// EXIST: { lookupString:"T.Null", itemText:"T.Null", tailText:" (p)", typeText:"T" } +// ABSENT: T.Other diff --git a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java index f763a52c0fe..16480b575bf 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java @@ -416,6 +416,11 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest("idea/testData/completion/smart/NullableThis.kt"); } + @TestMetadata("ObjectsFromType.kt") + public void testObjectsFromType() throws Exception { + doTest("idea/testData/completion/smart/ObjectsFromType.kt"); + } + @TestMetadata("OverloadedConstructorArgument.kt") public void testOverloadedConstructorArgument() throws Exception { doTest("idea/testData/completion/smart/OverloadedConstructorArgument.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java index c2771868e47..d5e800bc67a 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java @@ -381,6 +381,11 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion doTest("idea/testData/completion/handlers/smart/NullableValueKeepOldArguments.kt"); } + @TestMetadata("ObjectFromType.kt") + public void testObjectFromType() throws Exception { + doTest("idea/testData/completion/handlers/smart/ObjectFromType.kt"); + } + @TestMetadata("SAMExpected1.kt") public void testSAMExpected1() throws Exception { doTest("idea/testData/completion/handlers/smart/SAMExpected1.kt");