KT-5153 Smart completion should include objects from type
#KT-5153 Fixed
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package p
|
||||
|
||||
class Outer {
|
||||
trait T {
|
||||
object Null : T { }
|
||||
}
|
||||
}
|
||||
|
||||
fun foo(): Outer.T {
|
||||
return <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: "T.Null"
|
||||
@@ -0,0 +1,13 @@
|
||||
package p
|
||||
|
||||
class Outer {
|
||||
trait T {
|
||||
object Null : T { }
|
||||
}
|
||||
}
|
||||
|
||||
fun foo(): Outer.T {
|
||||
return Outer.T.Null<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: "T.Null"
|
||||
@@ -0,0 +1,14 @@
|
||||
package p
|
||||
|
||||
trait T {
|
||||
object Null : T { }
|
||||
|
||||
object Other {}
|
||||
}
|
||||
|
||||
fun foo(): T {
|
||||
return <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"T.Null", itemText:"T.Null", tailText:" (p)", typeText:"T" }
|
||||
// ABSENT: T.Other
|
||||
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user