Fix REPL completion after "final" expressions

Final expressions here are literals, "closed" function calls,
expressions in brackets. Completion variants should not appear after
them if they are not followed by by dot (.) or double colon (::).

Note that identifiers are not considered as final expressions.
This commit is contained in:
Ilya Muradyan
2020-04-20 02:47:44 +03:00
committed by Ilya Chernikov
parent befa1e114c
commit af147017b4
2 changed files with 18 additions and 9 deletions
@@ -63,7 +63,7 @@ class ReplCompletionAndErrorsAnalysisTest : TestCase() {
} }
@Test @Test
fun testNoVariantsAfterLiterals() = test { fun testNoVariantsAfterFinalExpressions() = test {
fun testNoVariants(testCode: String, testCursor: Int? = null) = run { fun testNoVariants(testCode: String, testCursor: Int? = null) = run {
doComplete doComplete
code = testCode code = testCode
@@ -77,8 +77,19 @@ class ReplCompletionAndErrorsAnalysisTest : TestCase() {
testNoVariants("val x2 = 42.42") testNoVariants("val x2 = 42.42")
testNoVariants("val x3 = 'v'") testNoVariants("val x3 = 'v'")
testNoVariants("val x4 = \"str42\"") testNoVariants("val x4 = \"str42\"")
}
testNoVariants("val x5 = 40 + 41 * 42")
testNoVariants("val x6 = 40 + 41 * 42", 16) // after 41
testNoVariants("val x7 = 40 + 41 * 42", 11) // after 40
testNoVariants("6 * (2 + 5)")
testNoVariants("\"aBc\".capitalize()")
testNoVariants(
"""
"abc" + "def"
""".trimIndent()
)
}
@Test @Test
fun testPackagesImport() = test { fun testPackagesImport() = test {
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded
import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
import org.jetbrains.kotlin.renderer.ClassifierNamePolicy import org.jetbrains.kotlin.renderer.ClassifierNamePolicy
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
@@ -94,12 +93,11 @@ private class KJvmReplCompleter(
val elementParent = element.parent val elementParent = element.parent
if (prefix.isEmpty() && elementParent is KtBinaryExpression) { if (prefix.isEmpty() && elementParent is KtBinaryExpression) {
when (elementParent.node.firstChildNode.elementType) { val parentChildren = elementParent.children
KtStubElementTypes.INTEGER_CONSTANT, if (parentChildren.size == 3 &&
KtStubElementTypes.FLOAT_CONSTANT, parentChildren[1] is KtOperationReferenceExpression &&
KtStubElementTypes.CHARACTER_CONSTANT, parentChildren[1].text == INSERTED_STRING
KtStubElementTypes.STRING_TEMPLATE -> return@gen ) return@gen
}
} }
isSortNeeded = false isSortNeeded = false