Non-imported top-level functions completion does not require second press

This commit is contained in:
Valentin Kipyatkov
2015-11-06 15:47:43 +03:00
parent 4c5d5ed18f
commit 80a1d94515
12 changed files with 22 additions and 26 deletions
@@ -108,9 +108,11 @@ class BasicCompletionSession(
return ALL return ALL
} }
public fun shouldDisableAutoPopup(): Boolean { fun shouldDisableAutoPopup(): Boolean
return completionKind.shouldDisableAutoPopup() = completionKind.shouldDisableAutoPopup()
}
override fun shouldCompleteTopLevelCallablesFromIndex()
= super.shouldCompleteTopLevelCallablesFromIndex() && prefix.isNotEmpty()
override fun doComplete() { override fun doComplete() {
assert(parameters.completionType == CompletionType.BASIC) assert(parameters.completionType == CompletionType.BASIC)
@@ -255,7 +257,7 @@ class BasicCompletionSession(
else -> classKindFilter = null else -> classKindFilter = null
} }
if (classKindFilter != null) { if (classKindFilter != null) {
if (configuration.completeNonImportedDeclarations) { if (configuration.completeNonImportedClasses) {
addClassesFromIndex(classKindFilter) addClassesFromIndex(classKindFilter)
} }
else { else {
@@ -54,7 +54,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
import java.util.* import java.util.*
class CompletionSessionConfiguration( class CompletionSessionConfiguration(
val completeNonImportedDeclarations: Boolean, val completeNonImportedClasses: Boolean,
val completeNonAccessibleDeclarations: Boolean, val completeNonAccessibleDeclarations: Boolean,
val filterOutJavaGettersAndSetters: Boolean, val filterOutJavaGettersAndSetters: Boolean,
val completeJavaClassesNotToBeUsed: Boolean, val completeJavaClassesNotToBeUsed: Boolean,
@@ -62,7 +62,7 @@ class CompletionSessionConfiguration(
) )
fun CompletionSessionConfiguration(parameters: CompletionParameters) = CompletionSessionConfiguration( fun CompletionSessionConfiguration(parameters: CompletionParameters) = CompletionSessionConfiguration(
completeNonImportedDeclarations = parameters.invocationCount >= 2, completeNonImportedClasses = parameters.invocationCount >= 2,
completeNonAccessibleDeclarations = parameters.invocationCount >= 2, completeNonAccessibleDeclarations = parameters.invocationCount >= 2,
filterOutJavaGettersAndSetters = parameters.invocationCount < 2, filterOutJavaGettersAndSetters = parameters.invocationCount < 2,
completeJavaClassesNotToBeUsed = parameters.invocationCount >= 2, completeJavaClassesNotToBeUsed = parameters.invocationCount >= 2,
@@ -389,8 +389,8 @@ abstract class CompletionSession(
return result return result
} }
protected fun shouldCompleteTopLevelCallablesFromIndex(): Boolean { protected open fun shouldCompleteTopLevelCallablesFromIndex(): Boolean {
if (!configuration.completeNonImportedDeclarations) return false if (nameExpression == null) return false
if ((descriptorKindFilter?.kindMask ?: 0).and(DescriptorKindFilter.CALLABLES_MASK) == 0) return false if ((descriptorKindFilter?.kindMask ?: 0).and(DescriptorKindFilter.CALLABLES_MASK) == 0) return false
if (callTypeAndReceiver is CallTypeAndReceiver.IMPORT_DIRECTIVE) return false if (callTypeAndReceiver is CallTypeAndReceiver.IMPORT_DIRECTIVE) return false
return callTypeAndReceiver.receiver == null return callTypeAndReceiver.receiver == null
@@ -260,7 +260,7 @@ public class KotlinCompletionContributor : CompletionContributor() {
if (!somethingAdded && parameters.invocationCount < 2) { if (!somethingAdded && parameters.invocationCount < 2) {
// Rerun completion if nothing was found // Rerun completion if nothing was found
val newConfiguration = CompletionSessionConfiguration( val newConfiguration = CompletionSessionConfiguration(
completeNonImportedDeclarations = true, completeNonImportedClasses = true,
completeNonAccessibleDeclarations = false, completeNonAccessibleDeclarations = false,
filterOutJavaGettersAndSetters = false, filterOutJavaGettersAndSetters = false,
completeJavaClassesNotToBeUsed = false, completeJavaClassesNotToBeUsed = false,
@@ -1,7 +1,7 @@
package dependency package dependency
fun topLevelFun(){} fun xxx_topLevelFun(){}
val topLevelVal: Int = 1 val xxx_topLevelVal: Int = 1
fun CharSequence.extFun(){} fun CharSequence.xxx_extFun(){}
@@ -1,8 +1,7 @@
fun String.foo() { fun String.foo() {
val v = ::<caret> val v = ::xxx_<caret>
} }
// INVOCATION_COUNT: 2 // EXIST: xxx_topLevelFun
// EXIST: topLevelFun // EXIST: xxx_topLevelVal
// EXIST: topLevelVal // ABSENT: xxx_extFun
// ABSENT: extFun
@@ -8,5 +8,4 @@ fun firstFun() {
a.<caret> a.<caret>
} }
// INVOCATION_COUNT: 2
// EXIST: secondExtension // EXIST: secondExtension
@@ -7,7 +7,6 @@ fun String.foo() {
hid<caret> hid<caret>
} }
// INVOCATION_COUNT: 2
// ABSENT: hiddenFun // ABSENT: hiddenFun
// ABSENT: hiddenProperty // ABSENT: hiddenProperty
// ABSENT: hiddenFunFromSameFile // ABSENT: hiddenFunFromSameFile
@@ -6,7 +6,6 @@ fun f() {
C() <caret> C() <caret>
} }
// INVOCATION_COUNT: 2
// ABSENT: "xxx" // ABSENT: "xxx"
// EXIST: { lookupString: "yyy", attributes: "bold" } // EXIST: { lookupString: "yyy", attributes: "bold" }
// ABSENT: "zzz" // ABSENT: "zzz"
@@ -10,7 +10,6 @@ class C {
} }
} }
// INVOCATION_COUNT: 2
// EXIST: { lookupString: "xxx", itemText: "xxx", tailText: "()", typeText: "Unit" } // EXIST: { lookupString: "xxx", itemText: "xxx", tailText: "()", typeText: "Unit" }
// EXIST: { lookupString: "xxy", itemText: "xxy", tailText: "()", typeText: "Unit" } // EXIST: { lookupString: "xxy", itemText: "xxy", tailText: "()", typeText: "Unit" }
// EXIST: { lookupString: "xxz", itemText: "xxz", tailText: "(p: Int)", typeText: "Unit" } // EXIST: { lookupString: "xxz", itemText: "xxz", tailText: "(p: Int)", typeText: "Unit" }
@@ -1,5 +1,5 @@
fun foo(){ fun foo(){
val l : java.lang.Thread = <caret> val l: java.lang.Thread = <caret>
} }
// ELEMENT: currentThread // ELEMENT_TEXT: Thread.currentThread
@@ -1,5 +1,5 @@
fun foo(){ fun foo(){
val l : java.lang.Thread = Thread.currentThread()<caret> val l: java.lang.Thread = Thread.currentThread()<caret>
} }
// ELEMENT: currentThread // ELEMENT_TEXT: Thread.currentThread
@@ -6,6 +6,5 @@ fun bar(p: () -> Unit) { }
fun bar(p: String.() -> Unit) { } fun bar(p: String.() -> Unit) { }
// INVOCATION_COUNT: 2
// EXIST: topLevelFun // EXIST: topLevelFun
// ABSENT: extFun // ABSENT: extFun