FIR Completion: Prevent immediate completion in number literals

- This is copied from the original KotlinCompletionContributor
This commit is contained in:
Roman Golyshev
2020-07-28 19:10:39 +03:00
parent d86c14243e
commit 64187b40c9
5 changed files with 58 additions and 0 deletions
@@ -0,0 +1,5 @@
fun test() {
3<caret>
}
// NOTHING_ELSE
@@ -0,0 +1,6 @@
fun test() {
3.<caret>
}
// INVOCATION_COUNT: 0
// NOTHING_ELSE
@@ -2307,6 +2307,16 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/localVariablesAndFunctionsFromNestedScope.kt");
}
@TestMetadata("noCompletionAfterNumberLiteral1.kt")
public void testNoCompletionAfterNumberLiteral1() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/noCompletionAfterNumberLiteral1.kt");
}
@TestMetadata("noCompletionAfterNumberLiteral2.kt")
public void testNoCompletionAfterNumberLiteral2() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/noCompletionAfterNumberLiteral2.kt");
}
@TestMetadata("nullableCompletion.kt")
public void testNullableCompletion() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/nullableCompletion.kt");
@@ -2307,6 +2307,16 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/localVariablesAndFunctionsFromNestedScope.kt");
}
@TestMetadata("noCompletionAfterNumberLiteral1.kt")
public void testNoCompletionAfterNumberLiteral1() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/noCompletionAfterNumberLiteral1.kt");
}
@TestMetadata("noCompletionAfterNumberLiteral2.kt")
public void testNoCompletionAfterNumberLiteral2() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/noCompletionAfterNumberLiteral2.kt");
}
@TestMetadata("nullableCompletion.kt")
public void testNullableCompletion() throws Exception {
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/nullableCompletion.kt");
@@ -8,11 +8,13 @@ package org.jetbrains.kotlin.idea.completion
import com.intellij.codeInsight.completion.*
import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.patterns.PlatformPatterns
import com.intellij.patterns.PsiJavaPatterns
import com.intellij.util.ProcessingContext
import org.jetbrains.kotlin.idea.frontend.api.getAnalysisSessionFor
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtLabelReferenceExpression
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
@@ -26,6 +28,8 @@ class KotlinFirCompletionContributor : CompletionContributor() {
private object KotlinHighLevelApiContributor : CompletionProvider<CompletionParameters>() {
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) {
if (shouldSuppressCompletion(parameters, result.prefixMatcher)) return
val originalFile = parameters.originalFile as? KtFile ?: return
val reference = (parameters.position.parent as? KtSimpleNameExpression)?.mainReference ?: return
@@ -69,6 +73,29 @@ private object KotlinHighLevelApiContributor : CompletionProvider<CompletionPara
availableClasses.forEach(::addToCompletion)
}
}
private val AFTER_NUMBER_LITERAL = PsiJavaPatterns.psiElement().afterLeafSkipping(
PsiJavaPatterns.psiElement().withText(""),
PsiJavaPatterns.psiElement().withElementType(PsiJavaPatterns.elementType().oneOf(KtTokens.FLOAT_LITERAL, KtTokens.INTEGER_LITERAL))
)
private val AFTER_INTEGER_LITERAL_AND_DOT = PsiJavaPatterns.psiElement().afterLeafSkipping(
PsiJavaPatterns.psiElement().withText("."),
PsiJavaPatterns.psiElement().withElementType(PsiJavaPatterns.elementType().oneOf(KtTokens.INTEGER_LITERAL))
)
private fun shouldSuppressCompletion(parameters: CompletionParameters, prefixMatcher: PrefixMatcher): Boolean {
val position = parameters.position
val invocationCount = parameters.invocationCount
// no completion inside number literals
if (AFTER_NUMBER_LITERAL.accepts(position)) return true
// no completion auto-popup after integer and dot
if (invocationCount == 0 && prefixMatcher.prefix.isEmpty() && AFTER_INTEGER_LITERAL_AND_DOT.accepts(position)) return true
return false
}
}
private fun KtCallableSymbol.canBeCalledWith(implicitReceivers: List<KtType>): Boolean {