FIR Completion: Prevent immediate completion in number literals
- This is copied from the original KotlinCompletionContributor
This commit is contained in:
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
fun test() {
|
||||||
|
3<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTHING_ELSE
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
3.<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// INVOCATION_COUNT: 0
|
||||||
|
// NOTHING_ELSE
|
||||||
+10
@@ -2307,6 +2307,16 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
|
|||||||
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/localVariablesAndFunctionsFromNestedScope.kt");
|
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")
|
@TestMetadata("nullableCompletion.kt")
|
||||||
public void testNullableCompletion() throws Exception {
|
public void testNullableCompletion() throws Exception {
|
||||||
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/nullableCompletion.kt");
|
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/nullableCompletion.kt");
|
||||||
|
|||||||
+10
@@ -2307,6 +2307,16 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
|||||||
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/localVariablesAndFunctionsFromNestedScope.kt");
|
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")
|
@TestMetadata("nullableCompletion.kt")
|
||||||
public void testNullableCompletion() throws Exception {
|
public void testNullableCompletion() throws Exception {
|
||||||
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/nullableCompletion.kt");
|
runTest("idea/idea-completion/testData/basic/common/primitiveCompletion/nullableCompletion.kt");
|
||||||
|
|||||||
+27
@@ -8,11 +8,13 @@ package org.jetbrains.kotlin.idea.completion
|
|||||||
import com.intellij.codeInsight.completion.*
|
import com.intellij.codeInsight.completion.*
|
||||||
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||||
import com.intellij.patterns.PlatformPatterns
|
import com.intellij.patterns.PlatformPatterns
|
||||||
|
import com.intellij.patterns.PsiJavaPatterns
|
||||||
import com.intellij.util.ProcessingContext
|
import com.intellij.util.ProcessingContext
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.getAnalysisSessionFor
|
import org.jetbrains.kotlin.idea.frontend.api.getAnalysisSessionFor
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
import org.jetbrains.kotlin.idea.references.mainReference
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtLabelReferenceExpression
|
import org.jetbrains.kotlin.psi.KtLabelReferenceExpression
|
||||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||||
@@ -26,6 +28,8 @@ class KotlinFirCompletionContributor : CompletionContributor() {
|
|||||||
|
|
||||||
private object KotlinHighLevelApiContributor : CompletionProvider<CompletionParameters>() {
|
private object KotlinHighLevelApiContributor : CompletionProvider<CompletionParameters>() {
|
||||||
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) {
|
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) {
|
||||||
|
if (shouldSuppressCompletion(parameters, result.prefixMatcher)) return
|
||||||
|
|
||||||
val originalFile = parameters.originalFile as? KtFile ?: return
|
val originalFile = parameters.originalFile as? KtFile ?: return
|
||||||
|
|
||||||
val reference = (parameters.position.parent as? KtSimpleNameExpression)?.mainReference ?: return
|
val reference = (parameters.position.parent as? KtSimpleNameExpression)?.mainReference ?: return
|
||||||
@@ -69,6 +73,29 @@ private object KotlinHighLevelApiContributor : CompletionProvider<CompletionPara
|
|||||||
availableClasses.forEach(::addToCompletion)
|
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 {
|
private fun KtCallableSymbol.canBeCalledWith(implicitReceivers: List<KtType>): Boolean {
|
||||||
|
|||||||
Reference in New Issue
Block a user