Do not show autopopup variable name completion if it was closed

#KT-23546 Comment
This commit is contained in:
Alexander Podkhalyuzin
2018-04-05 18:52:18 +03:00
parent 89af94be95
commit 0231a3a9e6
@@ -189,13 +189,17 @@ class BasicCompletionSession(
filter
}
override fun shouldDisableAutoPopup(): Boolean {
return isStartOfExtensionReceiverFor() is KtProperty && wasAutopopupRecentlyCancelled(parameters)
}
override fun doComplete() {
val declaration = isStartOfExtensionReceiverFor()
if (declaration != null) {
completeDeclarationNameFromUnresolvedOrOverride(declaration)
if (declaration is KtProperty) {
completeVariableName(declaration.modifierList?.hasModifier(KtTokens.LATEINIT_KEYWORD) == true)
completeParameterOrVarNameAndType(declaration.modifierList?.hasModifier(KtTokens.LATEINIT_KEYWORD) == true)
}
// no auto-popup on typing after "val", "var" and "fun" because it's likely the name of the declaration which is being typed by user
@@ -491,26 +495,11 @@ class BasicCompletionSession(
else -> null
}
}
private fun completeVariableName(withType: Boolean) {
val variableNameAndTypeCompletion = VariableOrParameterNameWithTypeCompletion(collector, basicLookupElementFactory, prefixMatcher, resolutionFacade, withType)
// if we are typing parameter name, restart completion each time we type an upper case letter because new suggestions will appear (previous words can be used as user prefix)
val prefixPattern = StandardPatterns.string().with(object : PatternCondition<String>("Prefix ends with uppercase letter") {
override fun accepts(prefix: String, context: ProcessingContext?) = prefix.isNotEmpty() && prefix.last().isUpperCase()
})
collector.restartCompletionOnPrefixChange(prefixPattern)
variableNameAndTypeCompletion.addFromParametersInFile(position, resolutionFacade, isVisibleFilterCheckAlways)
flushToResultSet()
variableNameAndTypeCompletion.addFromImportedClasses(position, bindingContext, isVisibleFilterCheckAlways)
flushToResultSet()
variableNameAndTypeCompletion.addFromAllClasses(parameters, indicesHelper(false))
}
}
private fun wasAutopopupRecentlyCancelled(parameters: CompletionParameters) =
LookupCancelWatcher.getInstance(project).wasAutoPopupRecentlyCancelled(parameters.editor, position.startOffset)
private val KEYWORDS_ONLY = object : CompletionKind {
override val descriptorKindFilter: DescriptorKindFilter?
get() = null
@@ -650,9 +639,7 @@ class BasicCompletionSession(
completeDeclarationNameFromUnresolvedOrOverride(declaration)
when (declaration) {
is KtParameter ->
completeParameterNameAndType()
is KtParameter -> completeParameterOrVarNameAndType(withType = true)
is KtClassOrObject -> {
if (declaration.isTopLevel()) {
completeTopLevelClassName()
@@ -663,13 +650,7 @@ class BasicCompletionSession(
override fun shouldDisableAutoPopup(): Boolean {
if (TemplateManager.getInstance(project).getActiveTemplate(parameters.editor) != null) return true
if (declaration() is KtParameter) {
if (LookupCancelWatcher.getInstance(project).wasAutoPopupRecentlyCancelled(parameters.editor, position.startOffset)) {
return true
}
}
if (declaration() is KtParameter && wasAutopopupRecentlyCancelled(parameters)) return true
return false
}
@@ -680,24 +661,6 @@ class BasicCompletionSession(
return sorter
}
private fun completeParameterNameAndType() {
val parameterNameAndTypeCompletion = VariableOrParameterNameWithTypeCompletion(collector, basicLookupElementFactory, prefixMatcher, resolutionFacade, true)
// if we are typing parameter name, restart completion each time we type an upper case letter because new suggestions will appear (previous words can be used as user prefix)
val prefixPattern = StandardPatterns.string().with(object : PatternCondition<String>("Prefix ends with uppercase letter") {
override fun accepts(prefix: String, context: ProcessingContext?) = prefix.isNotEmpty() && prefix.last().isUpperCase()
})
collector.restartCompletionOnPrefixChange(prefixPattern)
parameterNameAndTypeCompletion.addFromParametersInFile(position, resolutionFacade, isVisibleFilterCheckAlways)
flushToResultSet()
parameterNameAndTypeCompletion.addFromImportedClasses(position, bindingContext, isVisibleFilterCheckAlways)
flushToResultSet()
parameterNameAndTypeCompletion.addFromAllClasses(parameters, indicesHelper(false))
}
private fun completeTopLevelClassName() {
val name = parameters.originalFile.virtualFile.nameWithoutExtension
if (!(Name.isValidIdentifier(name) && Name.identifier(name).render() == name && name[0].isUpperCase())) return
@@ -808,6 +771,26 @@ class BasicCompletionSession(
flushToResultSet()
}
}
private fun completeParameterOrVarNameAndType(withType: Boolean) {
val nameWithTypeCompletion =
VariableOrParameterNameWithTypeCompletion(collector, basicLookupElementFactory, prefixMatcher, resolutionFacade, withType)
// if we are typing parameter name, restart completion each time we type an upper case letter
// because new suggestions will appear (previous words can be used as user prefix)
val prefixPattern = StandardPatterns.string().with(object : PatternCondition<String>("Prefix ends with uppercase letter") {
override fun accepts(prefix: String, context: ProcessingContext?) = prefix.isNotEmpty() && prefix.last().isUpperCase()
})
collector.restartCompletionOnPrefixChange(prefixPattern)
nameWithTypeCompletion.addFromParametersInFile(position, resolutionFacade, isVisibleFilterCheckAlways)
flushToResultSet()
nameWithTypeCompletion.addFromImportedClasses(position, bindingContext, isVisibleFilterCheckAlways)
flushToResultSet()
nameWithTypeCompletion.addFromAllClasses(parameters, indicesHelper(false))
}
}
private val USUALLY_START_UPPER_CASE = DescriptorKindFilter(DescriptorKindFilter.CLASSIFIERS_MASK or DescriptorKindFilter.FUNCTIONS_MASK,