Code completion: more precise detection of "just typing"

This commit is contained in:
Valentin Kipyatkov
2014-11-14 14:15:38 +03:00
parent 7b7e992515
commit 656ed01b94
5 changed files with 15 additions and 5 deletions
@@ -62,7 +62,7 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess
protected val prefixMatcher: PrefixMatcher = this.resultSet.getPrefixMatcher()
protected val collector: LookupElementsCollector = LookupElementsCollector(prefixMatcher, resolveSession)
protected val collector: LookupElementsCollector = LookupElementsCollector(prefixMatcher, parameters, resolveSession)
protected val project: Project = position.getProject()
@@ -27,7 +27,7 @@ public class KotlinCompletionCharFilter() : CharFilter() {
class object {
public val ACCEPT_OPENING_BRACE: Key<Boolean> = Key("KotlinCompletionCharFilter.ACCEPT_OPENNING_BRACE")
public val SELECTED_ITEM_PREFIX: Key<String> = Key("KotlinCompletionCharFilter.SELECTED_ITEM_PREFIX")
public val JUST_TYPING_PREFIX: Key<String> = Key("KotlinCompletionCharFilter.JUST_TYPING_PREFIX")
}
override fun acceptChar(c : Char, prefixLength : Int, lookup : Lookup) : Result? {
@@ -39,7 +39,9 @@ public class KotlinCompletionCharFilter() : CharFilter() {
}
val currentItem = lookup.getCurrentItem()
currentItem?.putUserData(SELECTED_ITEM_PREFIX, lookup.itemPattern(currentItem))
if (!lookup.isSelectionTouched()) {
currentItem?.putUserData(JUST_TYPING_PREFIX, lookup.itemPattern(currentItem))
}
return when (c) {
'.' -> {
@@ -29,8 +29,13 @@ import java.util.ArrayList
import com.intellij.codeInsight.completion.CompletionResultSet
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import com.intellij.openapi.util.TextRange
import com.intellij.codeInsight.completion.CompletionParameters
class LookupElementsCollector(private val prefixMatcher: PrefixMatcher, private val resolveSession: ResolveSessionForBodies) {
class LookupElementsCollector(
private val prefixMatcher: PrefixMatcher,
private val completionParameters: CompletionParameters,
private val resolveSession: ResolveSessionForBodies
) {
private val elements = ArrayList<LookupElement>()
public fun flushToResultSet(resultSet: CompletionResultSet) {
@@ -109,8 +114,9 @@ class LookupElementsCollector(private val prefixMatcher: PrefixMatcher, private
// used to avoid insertion of spaces before/after ',', '=' on just typing
private fun isJustTyping(context: InsertionContext, element: LookupElement): Boolean {
if (!completionParameters.isAutoPopup()) return false
val insertedText = context.getDocument().getText(TextRange(context.getStartOffset(), context.getTailOffset()))
return insertedText == element.getUserData(KotlinCompletionCharFilter.SELECTED_ITEM_PREFIX)
return insertedText == element.getUserData(KotlinCompletionCharFilter.JUST_TYPING_PREFIX)
}
public fun addElementWithAutoInsertionSuppressed(element: LookupElement) {
@@ -4,5 +4,6 @@ fun bar(nullable: Int?) {
foo(null<caret>)
}
// INVOCATION_COUNT: 0
// ELEMENT: *
// CHAR: ','
@@ -4,5 +4,6 @@ fun bar(nullable: Int?) {
foo(null,<caret>)
}
// INVOCATION_COUNT: 0
// ELEMENT: *
// CHAR: ','