From 93d8791df10ec4aa336c9f6d7bb06e13a1b77a34 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 19 Sep 2014 11:39:18 +0200 Subject: [PATCH] No completion auto-popup after dot in float literal (but one test start to fail!) --- .../completion/JetCompletionContributor.kt | 25 +++++++++++++------ .../common/ExtensionToIntInFloatStyle.kt | 1 + .../common/NoAutoPopupAfterNumberLiteral.kt | 4 +++ .../NoAutoCompletionForRangeOperator.kt | 3 ++- .../NoAutoCompletionForRangeOperator.kt.after | 3 ++- .../JSBasicCompletionTestGenerated.java | 6 +++++ .../JvmBasicCompletionTestGenerated.java | 6 +++++ 7 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 idea/testData/completion/basic/common/NoAutoPopupAfterNumberLiteral.kt diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt index 61ec68cab05..621b5117efd 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt @@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.psi.JetTypeReference public class JetCompletionContributor : CompletionContributor() { private val AFTER_NUMBER_LITERAL = psiElement().afterLeafSkipping(psiElement().withText(""), psiElement().withElementType(elementType().oneOf(JetTokens.FLOAT_LITERAL, JetTokens.INTEGER_LITERAL))) + private val AFTER_INTEGER_LITERAL_AND_DOT = psiElement().afterLeafSkipping(psiElement().withText("."), psiElement().withElementType(elementType().oneOf(JetTokens.INTEGER_LITERAL))) private val EXTENSION_RECEIVER_TYPE_DUMMY_IDENTIFIER = "KotlinExtensionDummy.fake() {}" // A way to add reference into file at completion place private val EXTENSION_RECEIVER_TYPE_ACTIVATION_PATTERN = psiElement().afterLeaf(JetTokens.FUN_KEYWORD.toString(), JetTokens.VAL_KEYWORD.toString(), JetTokens.VAR_KEYWORD.toString()) @@ -131,13 +132,7 @@ public class JetCompletionContributor : CompletionContributor() { val position = parameters.getPosition() if (position.getContainingFile() !is JetFile) return - if (AFTER_NUMBER_LITERAL.accepts(parameters.getPosition())) { - // First Kotlin completion contributors - stop here will stop all completion - result.stopHere() - return - } - - if (EXTENSION_RECEIVER_TYPE_ACTIVATION_PATTERN.accepts(position) && parameters.getInvocationCount() == 0) { // no auto-popup on typing after "val", "var" and "fun" + if (shouldSuppressCompletion(parameters, result.getPrefixMatcher())) { result.stopHere() return } @@ -169,6 +164,22 @@ public class JetCompletionContributor : CompletionContributor() { } } + private fun shouldSuppressCompletion(parameters: CompletionParameters, prefixMatcher: PrefixMatcher): Boolean { + val position = parameters.getPosition() + val invocationCount = parameters.getInvocationCount() + + // 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.getPrefix().isEmpty() && AFTER_INTEGER_LITERAL_AND_DOT.accepts(position)) return true + + // no auto-popup on typing after "val", "var" and "fun" + if (EXTENSION_RECEIVER_TYPE_ACTIVATION_PATTERN.accepts(position) && invocationCount == 0) return true + + return false + } + private fun isAtEndOfLine(offset: Int, document: Document): Boolean { var i = offset val chars = document.getCharsSequence() diff --git a/idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt b/idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt index fd5d8aaa4c1..1a6e71869ff 100644 --- a/idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt +++ b/idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt @@ -2,4 +2,5 @@ val Int.f: Float get() = this.toFloat() val test = 1. +// INVOCATION_COUNT: 1 // EXIST: f \ No newline at end of file diff --git a/idea/testData/completion/basic/common/NoAutoPopupAfterNumberLiteral.kt b/idea/testData/completion/basic/common/NoAutoPopupAfterNumberLiteral.kt new file mode 100644 index 00000000000..100cbf960f9 --- /dev/null +++ b/idea/testData/completion/basic/common/NoAutoPopupAfterNumberLiteral.kt @@ -0,0 +1,4 @@ +val v = 1. + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/testData/completion/confidence/NoAutoCompletionForRangeOperator.kt b/idea/testData/completion/confidence/NoAutoCompletionForRangeOperator.kt index 30b134d7d79..74e6b2a8ac3 100644 --- a/idea/testData/completion/confidence/NoAutoCompletionForRangeOperator.kt +++ b/idea/testData/completion/confidence/NoAutoCompletionForRangeOperator.kt @@ -1,5 +1,6 @@ fun test() { - for (i in 12.) { + val v = 1 + for (i in v.) { } } diff --git a/idea/testData/completion/confidence/NoAutoCompletionForRangeOperator.kt.after b/idea/testData/completion/confidence/NoAutoCompletionForRangeOperator.kt.after index dade80aff41..7dc3b5a6bbb 100644 --- a/idea/testData/completion/confidence/NoAutoCompletionForRangeOperator.kt.after +++ b/idea/testData/completion/confidence/NoAutoCompletionForRangeOperator.kt.after @@ -1,5 +1,6 @@ fun test() { - for (i in 12..) { + val v = 1 + for (i in v..) { } } diff --git a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java index 3b281959e8f..acd228da9ca 100644 --- a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java @@ -417,6 +417,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("NoAutoPopupAfterNumberLiteral.kt") + public void testNoAutoPopupAfterNumberLiteral() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutoPopupAfterNumberLiteral.kt"); + doTest(fileName); + } + @TestMetadata("NoClassNameDuplication.kt") public void testNoClassNameDuplication() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoClassNameDuplication.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java index 72cf13d2f90..ede4a5ef0b0 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java @@ -417,6 +417,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("NoAutoPopupAfterNumberLiteral.kt") + public void testNoAutoPopupAfterNumberLiteral() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutoPopupAfterNumberLiteral.kt"); + doTest(fileName); + } + @TestMetadata("NoClassNameDuplication.kt") public void testNoClassNameDuplication() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoClassNameDuplication.kt");