Smart completion: fixed items ordering issue

This commit is contained in:
Valentin Kipyatkov
2014-10-28 20:20:33 +03:00
parent caf44969a4
commit 2b33501471
52 changed files with 103 additions and 88 deletions
@@ -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" }
+2 -2
View File
@@ -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
@@ -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");