From 9c8b7ed6f50f2c9e2f9baba65eb532daaa9e45d7 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Sun, 7 Dec 2014 17:38:57 -0700 Subject: [PATCH] Fixed KT-6408 Completion auto-popup prevents smooth typing of "!in" #KT-6408 Fixed --- .../jet/plugin/completion/KeywordCompletion.kt | 14 ++++++++++++-- idea/testData/completion/keywords/NotInNotIs.kt | 6 ++++++ .../completion/KeywordCompletionTestGenerated.java | 7 ++++++- 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 idea/testData/completion/keywords/NotInNotIs.kt diff --git a/idea/src/org/jetbrains/jet/plugin/completion/KeywordCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/KeywordCompletion.kt index efeefb1fb00..ad5f4d75f2a 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/KeywordCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/KeywordCompletion.kt @@ -33,6 +33,7 @@ import org.jetbrains.jet.lang.psi.psiUtil.siblings import org.jetbrains.jet.lexer.JetTokens.* import org.jetbrains.jet.lang.psi.psiUtil.prevLeafSkipWhitespacesAndComments import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType +import com.intellij.psi.tree.IElementType class KeywordLookupObject(val keyword: String) @@ -158,9 +159,9 @@ object KeywordCompletion { val postfix = KEYWORD_TO_DUMMY_POSTFIX[keywordTokenType] ?: "" val file = psiFactory.createFile(prefixText + keywordTokenType.getValue() + postfix) val elementAt = file.findElementAt(prefixText.length)!! - val nodeType = elementAt.getNode()!!.getElementType() + when { - nodeType != keywordTokenType -> false + !elementAt.getNode()!!.getElementType().matchesKeyword(keywordTokenType) -> false elementAt.getNonStrictParentOfType() != null -> false @@ -171,6 +172,15 @@ object KeywordCompletion { } } + private fun IElementType.matchesKeyword(keywordType: JetKeywordToken): Boolean { + return when(this) { + keywordType -> true + NOT_IN -> keywordType == IN_KEYWORD + NOT_IS -> keywordType == IS_KEYWORD + else -> false + } + } + // builds text within scope (or from the start of the file) before position element excluding almost all declarations private fun buildReducedContextBefore(builder: StringBuilder, position: PsiElement, scope: PsiElement?) { if (position == scope) return diff --git a/idea/testData/completion/keywords/NotInNotIs.kt b/idea/testData/completion/keywords/NotInNotIs.kt new file mode 100644 index 00000000000..528967b2018 --- /dev/null +++ b/idea/testData/completion/keywords/NotInNotIs.kt @@ -0,0 +1,6 @@ +fun foo(v: String) { + if (v !) +} + +// EXIST: in +// EXIST: is diff --git a/idea/tests/org/jetbrains/jet/completion/KeywordCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/KeywordCompletionTestGenerated.java index f4fb887b938..ba3314363c0 100644 --- a/idea/tests/org/jetbrains/jet/completion/KeywordCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/KeywordCompletionTestGenerated.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.completion; import com.intellij.testFramework.TestDataPath; import org.jetbrains.jet.JUnit3RunnerWithInners; import org.jetbrains.jet.JetTestUtils; -import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; import org.junit.runner.RunWith; @@ -246,6 +245,12 @@ public class KeywordCompletionTestGenerated extends AbstractKeywordCompletionTes doTest(fileName); } + @TestMetadata("NotInNotIs.kt") + public void testNotInNotIs() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/keywords/NotInNotIs.kt"); + doTest(fileName); + } + @TestMetadata("PrefixMatcher.kt") public void testPrefixMatcher() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/keywords/PrefixMatcher.kt");