Code completion: more precise detection of "just typing"
This commit is contained in:
@@ -62,7 +62,7 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess
|
|||||||
|
|
||||||
protected val prefixMatcher: PrefixMatcher = this.resultSet.getPrefixMatcher()
|
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()
|
protected val project: Project = position.getProject()
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public class KotlinCompletionCharFilter() : CharFilter() {
|
|||||||
class object {
|
class object {
|
||||||
public val ACCEPT_OPENING_BRACE: Key<Boolean> = Key("KotlinCompletionCharFilter.ACCEPT_OPENNING_BRACE")
|
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? {
|
override fun acceptChar(c : Char, prefixLength : Int, lookup : Lookup) : Result? {
|
||||||
@@ -39,7 +39,9 @@ public class KotlinCompletionCharFilter() : CharFilter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val currentItem = lookup.getCurrentItem()
|
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) {
|
return when (c) {
|
||||||
'.' -> {
|
'.' -> {
|
||||||
|
|||||||
@@ -29,8 +29,13 @@ import java.util.ArrayList
|
|||||||
import com.intellij.codeInsight.completion.CompletionResultSet
|
import com.intellij.codeInsight.completion.CompletionResultSet
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
||||||
import com.intellij.openapi.util.TextRange
|
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>()
|
private val elements = ArrayList<LookupElement>()
|
||||||
|
|
||||||
public fun flushToResultSet(resultSet: CompletionResultSet) {
|
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
|
// used to avoid insertion of spaces before/after ',', '=' on just typing
|
||||||
private fun isJustTyping(context: InsertionContext, element: LookupElement): Boolean {
|
private fun isJustTyping(context: InsertionContext, element: LookupElement): Boolean {
|
||||||
|
if (!completionParameters.isAutoPopup()) return false
|
||||||
val insertedText = context.getDocument().getText(TextRange(context.getStartOffset(), context.getTailOffset()))
|
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) {
|
public fun addElementWithAutoInsertionSuppressed(element: LookupElement) {
|
||||||
|
|||||||
@@ -4,5 +4,6 @@ fun bar(nullable: Int?) {
|
|||||||
foo(null<caret>)
|
foo(null<caret>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// INVOCATION_COUNT: 0
|
||||||
// ELEMENT: *
|
// ELEMENT: *
|
||||||
// CHAR: ','
|
// CHAR: ','
|
||||||
|
|||||||
@@ -4,5 +4,6 @@ fun bar(nullable: Int?) {
|
|||||||
foo(null,<caret>)
|
foo(null,<caret>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// INVOCATION_COUNT: 0
|
||||||
// ELEMENT: *
|
// ELEMENT: *
|
||||||
// CHAR: ','
|
// CHAR: ','
|
||||||
|
|||||||
Reference in New Issue
Block a user