Smart completion: fixed items ordering issue
This commit is contained in:
@@ -41,8 +41,7 @@ class StaticMembers(val bindingContext: BindingContext, val resolveSession: Reso
|
||||
context: JetExpression,
|
||||
enumEntriesToSkip: Set<DeclarationDescriptor>) {
|
||||
|
||||
val scope = bindingContext[BindingContext.RESOLUTION_SCOPE, context]
|
||||
if (scope == null) return
|
||||
val scope = bindingContext[BindingContext.RESOLUTION_SCOPE, context] ?: return
|
||||
|
||||
val expectedInfosByClass = expectedInfos.groupBy { TypeUtils.getClassDescriptor(it.type) }
|
||||
for ((classDescriptor, expectedInfosForClass) in expectedInfosByClass) {
|
||||
@@ -64,8 +63,7 @@ class StaticMembers(val bindingContext: BindingContext, val resolveSession: Reso
|
||||
|
||||
val classifier: (ExpectedInfo) -> ExpectedInfoClassification
|
||||
if (descriptor is CallableDescriptor) {
|
||||
val returnType = descriptor.getReturnType()
|
||||
if (returnType == null) return
|
||||
val returnType = descriptor.getReturnType() ?: return
|
||||
classifier = {
|
||||
expectedInfo ->
|
||||
when {
|
||||
@@ -109,12 +107,9 @@ class StaticMembers(val bindingContext: BindingContext, val resolveSession: Reso
|
||||
private fun createLookupElement(memberDescriptor: DeclarationDescriptor, classDescriptor: ClassDescriptor): LookupElement {
|
||||
val lookupElement = createLookupElement(memberDescriptor, resolveSession, bindingContext)
|
||||
val qualifierPresentation = classDescriptor.getName().asString()
|
||||
val lookupString = qualifierPresentation + "." + lookupElement.getLookupString()
|
||||
val qualifierText = qualifiedNameForSourceCode(classDescriptor)
|
||||
|
||||
return object: LookupElementDecorator<LookupElement>(lookupElement) {
|
||||
override fun getLookupString() = lookupString
|
||||
|
||||
override fun renderElement(presentation: LookupElementPresentation) {
|
||||
getDelegate().renderElement(presentation)
|
||||
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val v: `class`= <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: class.val
|
||||
// ELEMENT: val
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val v: `class`= `class`.`val`<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: class.val
|
||||
// ELEMENT: val
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val k : K = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: K.bar
|
||||
// ELEMENT: bar
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val k : K = K.bar()<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: K.bar
|
||||
// ELEMENT: bar
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val k : K = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: K.bar
|
||||
// ELEMENT: bar
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val k : K = K.bar(<caret>)
|
||||
}
|
||||
|
||||
// ELEMENT: K.bar
|
||||
// ELEMENT: bar
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val k : K = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: K.bar
|
||||
// ELEMENT: bar
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val k : K = K.bar { <caret> }
|
||||
}
|
||||
|
||||
// ELEMENT: K.bar
|
||||
// ELEMENT: bar
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val k : K = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: K.bar
|
||||
// ELEMENT: bar
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(){
|
||||
val k : K = K.bar(<caret>)
|
||||
}
|
||||
|
||||
// ELEMENT: K.bar
|
||||
// ELEMENT: bar
|
||||
|
||||
@@ -9,4 +9,4 @@ fun bar(){
|
||||
foo(<caret>)
|
||||
}
|
||||
|
||||
// ELEMENT: Foo.X
|
||||
// ELEMENT: X
|
||||
|
||||
@@ -9,4 +9,4 @@ fun bar(){
|
||||
foo(Foo.X, <caret>)
|
||||
}
|
||||
|
||||
// ELEMENT: Foo.X
|
||||
// ELEMENT: X
|
||||
|
||||
@@ -7,4 +7,4 @@ fun foo(){
|
||||
val f : Foo = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: Foo.X
|
||||
// ELEMENT: X
|
||||
|
||||
@@ -7,4 +7,4 @@ fun foo(){
|
||||
val f : Foo = Foo.X<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: Foo.X
|
||||
// ELEMENT: X
|
||||
|
||||
@@ -2,4 +2,4 @@ fun foo(){
|
||||
val e : java.lang.annotation.ElementType = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: ElementType.FIELD
|
||||
// ELEMENT: FIELD
|
||||
|
||||
@@ -4,4 +4,4 @@ fun foo(){
|
||||
val e : java.lang.annotation.ElementType = ElementType.FIELD<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: ElementType.FIELD
|
||||
// ELEMENT: FIELD
|
||||
|
||||
@@ -4,4 +4,4 @@ fun foo(){
|
||||
var l : Locale = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: Locale.ENGLISH
|
||||
// ELEMENT: ENGLISH
|
||||
|
||||
@@ -4,4 +4,4 @@ fun foo(){
|
||||
var l : Locale = Locale.ENGLISH<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: Locale.ENGLISH
|
||||
// ELEMENT: ENGLISH
|
||||
|
||||
@@ -2,4 +2,4 @@ fun foo(){
|
||||
var l : java.util.Locale = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: Locale.ENGLISH
|
||||
// ELEMENT: ENGLISH
|
||||
|
||||
@@ -4,4 +4,4 @@ fun foo(){
|
||||
var l : java.util.Locale = Locale.ENGLISH<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: Locale.ENGLISH
|
||||
// ELEMENT: ENGLISH
|
||||
|
||||
@@ -2,4 +2,4 @@ fun foo(){
|
||||
val l : java.lang.Thread = <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: Thread.currentThread
|
||||
// ELEMENT: currentThread
|
||||
|
||||
@@ -2,4 +2,4 @@ fun foo(){
|
||||
val l : java.lang.Thread = Thread.currentThread()<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: Thread.currentThread
|
||||
// ELEMENT: currentThread
|
||||
|
||||
@@ -13,4 +13,4 @@ fun foo() {
|
||||
foo(<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: C.f1
|
||||
// ELEMENT: f1
|
||||
|
||||
@@ -13,4 +13,4 @@ fun foo() {
|
||||
foo(C.f1()<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: C.f1
|
||||
// ELEMENT: f1
|
||||
|
||||
@@ -13,4 +13,4 @@ fun foo() {
|
||||
foo(<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: C.f3
|
||||
// ELEMENT: f3
|
||||
|
||||
@@ -13,4 +13,4 @@ fun foo() {
|
||||
foo(C.f3(), <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: C.f3
|
||||
// ELEMENT: f3
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(): Outer.T {
|
||||
return <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: "T.Null"
|
||||
// ELEMENT: Null
|
||||
|
||||
@@ -10,4 +10,4 @@ fun foo(): Outer.T {
|
||||
return Outer.T.Null<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: "T.Null"
|
||||
// ELEMENT: Null
|
||||
|
||||
@@ -14,10 +14,10 @@ fun foo(){
|
||||
val k : K = <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"K.foo", itemText:"K.foo", tailText:" (sample)", typeText:"K" }
|
||||
// EXIST: { lookupString:"K.bar", itemText:"K.bar()", tailText:" (sample)", typeText:"K" }
|
||||
// ABSENT: K.x
|
||||
// EXIST: { lookupString:"foo", itemText:"K.foo", tailText:" (sample)", typeText:"K" }
|
||||
// EXIST: { lookupString:"bar", itemText:"K.bar()", tailText:" (sample)", typeText:"K" }
|
||||
// ABSENT: { itemText: "K.x" }
|
||||
// ABSENT: { itemText:"K.kk" }
|
||||
// EXIST: { lookupString:"K.kk", itemText:"!! K.kk", tailText:" (sample)", typeText:"K?" }
|
||||
// EXIST: { lookupString:"K.kk", itemText:"?: K.kk", tailText:" (sample)", typeText:"K?" }
|
||||
// ABSENT: K.privateVal
|
||||
// EXIST: { lookupString:"kk", itemText:"!! K.kk", tailText:" (sample)", typeText:"K?" }
|
||||
// EXIST: { lookupString:"kk", itemText:"?: K.kk", tailText:" (sample)", typeText:"K?" }
|
||||
// ABSENT: { itemText: "K.privateVal" }
|
||||
|
||||
@@ -13,7 +13,7 @@ fun foo(){
|
||||
val k : K? = <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"K.foo", itemText:"K.foo", tailText:" (sample)", typeText:"K" }
|
||||
// EXIST: { lookupString:"K.bar", itemText:"K.bar()", tailText:" (sample)", typeText:"K" }
|
||||
// ABSENT: K.x
|
||||
// EXIST: { lookupString:"K.kk", itemText:"K.kk", tailText:" (sample)", typeText:"K?" }
|
||||
// EXIST: { lookupString:"foo", itemText:"K.foo", tailText:" (sample)", typeText:"K" }
|
||||
// EXIST: { lookupString:"bar", itemText:"K.bar()", tailText:" (sample)", typeText:"K" }
|
||||
// ABSENT: { itemText: "K.x" }
|
||||
// EXIST: { lookupString:"kk", itemText:"K.kk", tailText:" (sample)", typeText:"K?" }
|
||||
|
||||
@@ -9,5 +9,5 @@ fun foo(){
|
||||
val f : Foo = <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"Foo.X", itemText:"Foo.X", tailText:" (sample)", typeText:"Foo" }
|
||||
// EXIST: { lookupString:"Foo.Y", itemText:"Foo.Y", tailText:" (sample)", typeText:"Foo" }
|
||||
// EXIST: { lookupString:"X", itemText:"Foo.X", tailText:" (sample)", typeText:"Foo" }
|
||||
// EXIST: { lookupString:"Y", itemText:"Foo.Y", tailText:" (sample)", typeText:"Foo" }
|
||||
|
||||
@@ -7,8 +7,8 @@ fun f(e1: E, e2: E?, x: Any) {
|
||||
if (e1 == <caret>
|
||||
}
|
||||
|
||||
// EXIST: E.A
|
||||
// EXIST: E.B
|
||||
// EXIST: { lookupString:"A", itemText:"E.A", typeText:"E" }
|
||||
// EXIST: { lookupString:"B", itemText:"E.B", typeText:"E" }
|
||||
// EXIST: { itemText:"e2" }
|
||||
// ABSENT: { itemText:"!! e2" }
|
||||
// ABSENT: e1
|
||||
|
||||
@@ -4,5 +4,5 @@ fun foo(){
|
||||
val e : ElementType = <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"ElementType.TYPE", itemText:"ElementType.TYPE", tailText:" (java.lang.annotation)", typeText:"ElementType" }
|
||||
// EXIST: { lookupString:"ElementType.FIELD", itemText:"ElementType.FIELD", tailText:" (java.lang.annotation)", typeText:"ElementType" }
|
||||
// EXIST: { lookupString:"TYPE", itemText:"ElementType.TYPE", tailText:" (java.lang.annotation)", typeText:"ElementType" }
|
||||
// EXIST: { lookupString:"FIELD", itemText:"ElementType.FIELD", tailText:" (java.lang.annotation)", typeText:"ElementType" }
|
||||
|
||||
@@ -4,5 +4,5 @@ fun foo(){
|
||||
var e : ElementType? = <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"ElementType.TYPE", itemText:"ElementType.TYPE", tailText:" (java.lang.annotation)", typeText:"ElementType" }
|
||||
// EXIST: { lookupString:"ElementType.FIELD", itemText:"ElementType.FIELD", tailText:" (java.lang.annotation)", typeText:"ElementType" }
|
||||
// EXIST: { lookupString:"TYPE", itemText:"ElementType.TYPE", tailText:" (java.lang.annotation)", typeText:"ElementType" }
|
||||
// EXIST: { lookupString:"FIELD", itemText:"ElementType.FIELD", tailText:" (java.lang.annotation)", typeText:"ElementType" }
|
||||
|
||||
@@ -2,5 +2,5 @@ fun foo(){
|
||||
var l : java.util.Locale = <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"Locale.ENGLISH", itemText:"Locale.ENGLISH", tailText:" (java.util)", typeText:"Locale!" }
|
||||
// EXIST: { lookupString:"Locale.FRENCH", itemText:"Locale.FRENCH", tailText:" (java.util)", typeText:"Locale!" }
|
||||
// EXIST: { lookupString:"ENGLISH", itemText:"Locale.ENGLISH", tailText:" (java.util)", typeText:"Locale!" }
|
||||
// EXIST: { lookupString:"FRENCH", itemText:"Locale.FRENCH", tailText:" (java.util)", typeText:"Locale!" }
|
||||
|
||||
@@ -2,5 +2,5 @@ fun foo(){
|
||||
var l : java.util.Locale? = <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"Locale.ENGLISH", itemText:"Locale.ENGLISH", tailText:" (java.util)", typeText:"Locale!" }
|
||||
// EXIST: { lookupString:"Locale.FRENCH", itemText:"Locale.FRENCH", tailText:" (java.util)", typeText:"Locale!" }
|
||||
// EXIST: { lookupString:"ENGLISH", itemText:"Locale.ENGLISH", tailText:" (java.util)", typeText:"Locale!" }
|
||||
// EXIST: { lookupString:"FRENCH", itemText:"Locale.FRENCH", tailText:" (java.util)", typeText:"Locale!" }
|
||||
|
||||
@@ -2,6 +2,6 @@ fun foo(){
|
||||
val l : java.util.Calendar = <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"Calendar.getInstance", itemText:"Calendar.getInstance()", tailText:" (java.util)", typeText:"Calendar!" }
|
||||
// EXIST: { lookupString:"Calendar.getInstance", itemText:"Calendar.getInstance(TimeZone!)", tailText:" (java.util)", typeText:"Calendar!" }
|
||||
// EXIST: { lookupString:"Calendar.getInstance", itemText:"Calendar.getInstance(TimeZone!, Locale!)", tailText:" (java.util)", typeText:"Calendar!" }
|
||||
// EXIST: { lookupString:"getInstance", itemText:"Calendar.getInstance()", tailText:" (java.util)", typeText:"Calendar!" }
|
||||
// EXIST: { lookupString:"getInstance", itemText:"Calendar.getInstance(TimeZone!)", tailText:" (java.util)", typeText:"Calendar!" }
|
||||
// EXIST: { lookupString:"getInstance", itemText:"Calendar.getInstance(TimeZone!, Locale!)", tailText:" (java.util)", typeText:"Calendar!" }
|
||||
|
||||
@@ -9,5 +9,5 @@ fun foo(): X {
|
||||
return <caret>
|
||||
}
|
||||
|
||||
// ABSENT: X.f
|
||||
// EXIST: X.g
|
||||
// ABSENT: f
|
||||
// EXIST: { lookupString:"g", itemText:"X.g()" }
|
||||
|
||||
@@ -7,8 +7,8 @@ fun f(e1: E, e2: E?, x: Any) {
|
||||
if (e1 != <caret>
|
||||
}
|
||||
|
||||
// EXIST: E.A
|
||||
// EXIST: E.B
|
||||
// EXIST: { lookupString:"A", itemText:"E.A" }
|
||||
// EXIST: { lookupString:"B", itemText:"E.B" }
|
||||
// EXIST: e2
|
||||
// ABSENT: e1
|
||||
// ABSENT: x
|
||||
|
||||
@@ -10,5 +10,5 @@ fun foo(): T {
|
||||
return <caret>
|
||||
}
|
||||
|
||||
// EXIST: { lookupString:"T.Null", itemText:"T.Null", tailText:" (p)", typeText:"T" }
|
||||
// ABSENT: T.Other
|
||||
// EXIST: { lookupString:"Null", itemText:"T.Null", tailText:" (p)", typeText:"T" }
|
||||
// ABSENT: Other
|
||||
|
||||
@@ -10,7 +10,7 @@ fun foo(e: E) {
|
||||
}
|
||||
}
|
||||
|
||||
// EXIST: E.A
|
||||
// EXIST: E.B
|
||||
// EXIST: E.C
|
||||
// EXIST: { lookupString:"A", itemText:"E.A" }
|
||||
// EXIST: { lookupString:"B", itemText:"E.B" }
|
||||
// EXIST: { lookupString:"C", itemText:"E.C" }
|
||||
// EXIST: {"lookupString":"else","tailText":" ->","itemText":"else"}
|
||||
|
||||
@@ -10,7 +10,7 @@ fun foo(e: E) {
|
||||
}
|
||||
}
|
||||
|
||||
// ABSENT: E.A
|
||||
// EXIST: E.B
|
||||
// EXIST: E.C
|
||||
// ABSENT: A
|
||||
// EXIST: { lookupString:"B", itemText:"E.B" }
|
||||
// EXIST: { lookupString:"C", itemText:"E.C" }
|
||||
// ABSENT:else
|
||||
|
||||
@@ -11,7 +11,7 @@ fun foo(e: E) {
|
||||
}
|
||||
}
|
||||
|
||||
// ABSENT: E.A
|
||||
// EXIST: E.B
|
||||
// EXIST: E.C
|
||||
// ABSENT: A
|
||||
// EXIST: { lookupString:"B", itemText:"E.B" }
|
||||
// EXIST: { lookupString:"C", itemText:"E.C" }
|
||||
// EXIST: {"lookupString":"else","tailText":" ->","itemText":"else"}
|
||||
|
||||
@@ -11,7 +11,7 @@ fun foo(e: E) {
|
||||
}
|
||||
}
|
||||
|
||||
// EXIST: E.A
|
||||
// EXIST: E.B
|
||||
// EXIST: E.C
|
||||
// EXIST: { lookupString:"A", itemText:"E.A" }
|
||||
// EXIST: { lookupString:"B", itemText:"E.B" }
|
||||
// EXIST: { lookupString:"C", itemText:"E.C" }
|
||||
// ABSENT: else
|
||||
|
||||
@@ -11,8 +11,8 @@ fun foo(e: E?) {
|
||||
}
|
||||
}
|
||||
|
||||
// ABSENT: E.A
|
||||
// EXIST: E.B
|
||||
// EXIST: E.C
|
||||
// ABSENT: A
|
||||
// EXIST: B
|
||||
// EXIST: C
|
||||
// EXIST: null
|
||||
// EXIST: {"lookupString":"else","tailText":" ->","itemText":"else"}
|
||||
|
||||
@@ -11,5 +11,5 @@ fun foo(e: E) {
|
||||
}
|
||||
}
|
||||
|
||||
// EXIST: E.A
|
||||
// EXIST: A
|
||||
// ABSENT: else
|
||||
|
||||
@@ -7,6 +7,6 @@ fun foo(e: ElementType) {
|
||||
}
|
||||
}
|
||||
|
||||
// ABSENT: ElementType.FIELD
|
||||
// EXIST: ElementType.TYPE
|
||||
// ABSENT: FIELD
|
||||
// EXIST: TYPE
|
||||
// ABSENT: e
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
class Name {
|
||||
class object {
|
||||
fun create(): Name = Name()
|
||||
}
|
||||
}
|
||||
|
||||
fun foo(name: Name){}
|
||||
|
||||
fun bar() {
|
||||
val v: (Name) -> Unit = { foo(<caret>) }
|
||||
}
|
||||
|
||||
// ORDER: it
|
||||
// ORDER: create
|
||||
// ORDER: Name
|
||||
@@ -15,6 +15,6 @@ fun foo(p: C?) {
|
||||
// ORDER: p
|
||||
// ORDER: local
|
||||
// ORDER: global
|
||||
// ORDER: C.INSTANCE
|
||||
// ORDER: INSTANCE
|
||||
// ORDER: object
|
||||
// ORDER: null
|
||||
|
||||
@@ -19,10 +19,10 @@ fun foo(pFoo: C, s: String) {
|
||||
// ORDER: pFoo
|
||||
// ORDER: nullableFoo
|
||||
// ORDER: nullableFoo
|
||||
// ORDER: C.INSTANCE_FOO
|
||||
// ORDER: INSTANCE_FOO
|
||||
// ORDER: local
|
||||
// ORDER: nonNullable
|
||||
// ORDER: nullableX
|
||||
// ORDER: nullableX
|
||||
// ORDER: C.INSTANCE_X
|
||||
// ORDER: INSTANCE_X
|
||||
// ORDER: object
|
||||
|
||||
+6
-1
@@ -19,7 +19,6 @@ package org.jetbrains.jet.completion.weighers;
|
||||
import com.intellij.testFramework.TestDataPath;
|
||||
import org.jetbrains.jet.JUnit3RunnerWithInners;
|
||||
import org.jetbrains.jet.JetTestUtils;
|
||||
import org.jetbrains.jet.test.InnerTestClasses;
|
||||
import org.jetbrains.jet.test.TestMetadata;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
@@ -180,6 +179,12 @@ public class SmartCompletionWeigherTestGenerated extends AbstractSmartCompletion
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NoNameSimilarityForQualifier.kt")
|
||||
public void testNoNameSimilarityForQualifier() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/weighers/smart/NoNameSimilarityForQualifier.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NullableExpected.kt")
|
||||
public void testNullableExpected() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/weighers/smart/NullableExpected.kt");
|
||||
|
||||
Reference in New Issue
Block a user