KT-15286: Provide object member extensions in the completion

- Add extensions only when completion of static members is enabled (double ctrl + space and nonempty prefix)
- Add full import for callables with receiver in `LookupElement.decorateAsStaticMember`
This commit is contained in:
Roman Golyshev
2019-10-07 12:18:32 +03:00
committed by Roman Golyshev
parent 15613afa20
commit 6560ecc82b
31 changed files with 686 additions and 4 deletions
@@ -0,0 +1,16 @@
class T
class A {
companion object {
fun T.fooExtension() {}
val T.fooProperty get() = 10
}
}
fun usage(t: T) {
t.foo<caret>
}
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "fooExtension", itemText: "fooExtension" }
// EXIST: { lookupString: "fooProperty", itemText: "fooProperty" }
@@ -0,0 +1,16 @@
class T
class A {
companion object {
fun T.fooExtension() {}
val T.fooProperty get() = 10
}
}
fun T.usage() {
foo<caret>
}
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "fooExtension", itemText: "fooExtension" }
// EXIST: { lookupString: "fooProperty", itemText: "fooProperty" }
@@ -0,0 +1,35 @@
interface T
interface B: T
interface C: T
object A {
fun Any.fooForAny() {}
fun T.fooForT() {}
fun B.fooForB() {}
fun C.fooForC() {}
fun <TT> TT.fooForAnyGeneric() {}
fun <TT: T> TT.fooForTGeneric() {}
fun <TT: B> TT.fooForBGeneric() {}
fun <TT: C> TT.fooForCGeneric() {}
fun fooNoReceiver() {}
}
fun usage(b: B) {
b.foo<caret>
}
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "fooForAny", itemText: "fooForAny" }
// EXIST: { lookupString: "fooForT", itemText: "fooForT" }
// EXIST: { lookupString: "fooForB", itemText: "fooForB" }
// EXIST: { lookupString: "fooForTGeneric", itemText: "fooForTGeneric" }
// EXIST: { lookupString: "fooForBGeneric", itemText: "fooForBGeneric" }
// ABSENT: fooForC
// ABSENT: fooForCGeneric
// ABSENT: fooNoReceiver
@@ -0,0 +1,36 @@
interface T
interface B: T
interface C: T
object A {
fun Any.fooForAny() {}
fun T.fooForT() {}
fun B.fooForB() {}
fun C.fooForC() {}
fun <TT> TT.fooForAnyGeneric() {}
fun <TT: T> TT.fooForTGeneric() {}
fun <TT: B> TT.fooForBGeneric() {}
fun <TT: C> TT.fooForCGeneric() {}
fun fooNoReceiver() {}
}
fun B.usage() {
foo<caret>
}
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "fooForAny", itemText: "fooForAny" }
// EXIST: { lookupString: "fooForT", itemText: "fooForT" }
// EXIST: { lookupString: "fooForB", itemText: "fooForB" }
// EXIST: { lookupString: "fooForTGeneric", itemText: "fooForTGeneric" }
// EXIST: { lookupString: "fooForBGeneric", itemText: "fooForBGeneric" }
// EXIST: fooNoReceiver
// ABSENT: fooForC
// ABSENT: fooForCGeneric
@@ -0,0 +1,24 @@
class T
object O {
fun A.fooForA() {}
fun A.B.fooForB() {}
fun A.B.C.fooForC() {}
fun T.fooForT() {}
}
class A {
inner class B {
fun T.usage() {
foo<caret>
}
inner class C {}
}
}
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "fooForA", itemText: "fooForA" }
// EXIST: { lookupString: "fooForB", itemText: "fooForB" }
// EXIST: { lookupString: "fooForT", itemText: "fooForT" }
// ABSENT: fooForC
@@ -0,0 +1,14 @@
class T
object A {
fun T.fooExtension() {}
val T.fooProperty get() = 10
}
fun usage(t: T) {
t.foo<caret>
}
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "fooExtension", itemText: "fooExtension" }
// EXIST: { lookupString: "fooProperty", itemText: "fooProperty" }
@@ -0,0 +1,14 @@
class T
object A {
fun T.fooExtension() {}
val T.fooProperty get() = 10
}
fun T.usage() {
foo<caret>
}
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "fooExtension", itemText: "fooExtension" }
// EXIST: { lookupString: "fooProperty", itemText: "fooProperty" }
@@ -0,0 +1,19 @@
class T
interface Foo {
fun T.fooExtension()
val T.fooProperty: Int
}
object A : Foo {
override fun T.fooExtension() {}
override val T.fooProperty get() = 10
}
fun T.usage() {
foo<caret>
}
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "fooExtension", itemText: "fooExtension" }
// EXIST: { lookupString: "fooProperty", itemText: "fooProperty" }