From 4a3d0133f63e88151821cc98cb679b22c03f17ea Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 22 Mar 2012 18:56:51 +0400 Subject: [PATCH] #KT-1598 fixed Wrong completion after "as" in imports --- .../completion/JetCompletionContributor.java | 15 +++-- .../confidence/ImportAsConfidence.kt | 1 + .../confidence/ImportAsConfidence.kt.after | 1 + .../completion/confidence/InModifierList.kt | 5 ++ .../confidence/InModifierList.kt.after | 5 ++ .../confidence/JetConfidenceTest.java | 63 +++++++++++++++++++ .../handlers/CompletionHandlerTest.java | 17 +++-- 7 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 idea/testData/completion/confidence/ImportAsConfidence.kt create mode 100644 idea/testData/completion/confidence/ImportAsConfidence.kt.after create mode 100644 idea/testData/completion/confidence/InModifierList.kt create mode 100644 idea/testData/completion/confidence/InModifierList.kt.after create mode 100644 idea/tests/org/jetbrains/jet/completion/confidence/JetConfidenceTest.java diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java index 9281153044b..5f57ecc2ecc 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.java @@ -66,9 +66,15 @@ public class JetCompletionContributor extends CompletionContributor { JetSimpleNameReference jetReference = getJetReference(parameters); if (jetReference != null) { + // Prevent from adding reference variants from standard reference contributor + result.stopHere(); + + if (isOnlyKeywordCompletion(position)) { + return; + } + if (shouldRunTypeCompletionOnly(position, jetReference)) { addClasses(parameters, result); - result.stopHere(); return; } @@ -76,9 +82,6 @@ public class JetCompletionContributor extends CompletionContributor { addReferenceVariant(result, variant, positions); } - // Prevent from adding reference variants from standard reference contributor - result.stopHere(); - String prefix = result.getPrefixMatcher().getPrefix(); // Try to avoid computing not-imported descriptors for empty prefix @@ -105,6 +108,10 @@ public class JetCompletionContributor extends CompletionContributor { }); } + private static boolean isOnlyKeywordCompletion(PsiElement position) { + return PsiTreeUtil.getParentOfType(position, JetModifierList.class) != null; + } + private static void addJetExtensions(JetSimpleNameExpression expression, CompletionResultSet result, PsiElement position) { final PrefixMatcher prefixMatcher = result.getPrefixMatcher(); JetShortNamesCache namesCache = JetCacheManager.getInstance(position.getProject()).getNamesCache(); diff --git a/idea/testData/completion/confidence/ImportAsConfidence.kt b/idea/testData/completion/confidence/ImportAsConfidence.kt new file mode 100644 index 00000000000..23a13a5a418 --- /dev/null +++ b/idea/testData/completion/confidence/ImportAsConfidence.kt @@ -0,0 +1 @@ +import kotlin.util // Comment to prevent for removing trailing spaces \ No newline at end of file diff --git a/idea/testData/completion/confidence/ImportAsConfidence.kt.after b/idea/testData/completion/confidence/ImportAsConfidence.kt.after new file mode 100644 index 00000000000..710bdc9420a --- /dev/null +++ b/idea/testData/completion/confidence/ImportAsConfidence.kt.after @@ -0,0 +1 @@ +import kotlin.util as // Comment to prevent for removing trailing spaces \ No newline at end of file diff --git a/idea/testData/completion/confidence/InModifierList.kt b/idea/testData/completion/confidence/InModifierList.kt new file mode 100644 index 00000000000..472ffcb0869 --- /dev/null +++ b/idea/testData/completion/confidence/InModifierList.kt @@ -0,0 +1,5 @@ +package test + +import java.util.AbstractSet as Hello + +// Comment to prevent for removing trailing spaces \ No newline at end of file diff --git a/idea/testData/completion/confidence/InModifierList.kt.after b/idea/testData/completion/confidence/InModifierList.kt.after new file mode 100644 index 00000000000..9ee02ecc7e0 --- /dev/null +++ b/idea/testData/completion/confidence/InModifierList.kt.after @@ -0,0 +1,5 @@ +package test + +import java.util.AbstractSet as Hello + +public // Comment to prevent for removing trailing spaces \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/confidence/JetConfidenceTest.java b/idea/tests/org/jetbrains/jet/completion/confidence/JetConfidenceTest.java new file mode 100644 index 00000000000..ec19983e491 --- /dev/null +++ b/idea/tests/org/jetbrains/jet/completion/confidence/JetConfidenceTest.java @@ -0,0 +1,63 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.completion.confidence; + +import com.intellij.codeInsight.completion.LightCompletionTestCase; +import com.intellij.openapi.projectRoots.JavaSdk; +import com.intellij.openapi.projectRoots.Sdk; +import org.apache.commons.lang.SystemUtils; +import org.jetbrains.jet.plugin.PluginTestCaseBase; + +import java.io.File; + +/** + * @author Nikolay Krasko + */ +public class JetConfidenceTest extends LightCompletionTestCase { + + public void testImportAsConfidence() { + doTest("as"); + } + + public void testInModifierList() { + doTest("pub"); + } + + protected void doTest(String completionActivateType) { + configureByFile(getBeforeFileName()); + type(completionActivateType + " "); + checkResultByFile(getAfterFileName()); + } + + protected String getBeforeFileName() { + return getTestName(false) + ".kt"; + } + + protected String getAfterFileName() { + return getTestName(false) + ".kt.after"; + } + + @Override + protected String getTestDataPath() { + return new File(PluginTestCaseBase.getTestDataPathBase(), "/completion/confidence/").getPath() + File.separator; + } + + @Override + protected Sdk getProjectJDK() { + return JavaSdk.getInstance().createJdk("JDK", SystemUtils.getJavaHome().getAbsolutePath()); + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java b/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java index 52efa9f6c64..314a211b276 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java +++ b/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java @@ -51,9 +51,9 @@ public class CompletionHandlerTest extends LightCompletionTestCase { } public void testSingleBrackets() { - configureByFile("SingleBrackets.kt"); + configureByFile(getBeforeFileName()); type('('); - checkResultByFile("SingleBrackets.kt.after"); + checkResultByFile(getAfterFileName()); } public void testExistingSingleBrackets() { @@ -69,9 +69,8 @@ public class CompletionHandlerTest extends LightCompletionTestCase { } public void doTest(CompletionType type, int time, @Nullable String completeItem) { - String fileName = getTestName(false); try { - configureByFileNoComplete(fileName + ".kt"); + configureByFileNoComplete(getBeforeFileName()); setType(type); complete(time); @@ -80,12 +79,20 @@ public class CompletionHandlerTest extends LightCompletionTestCase { selectItem(LookupElementBuilder.create(completeItem), '\t'); } - checkResultByFile(fileName + ".kt.after"); + checkResultByFile(getAfterFileName()); } catch (Exception e) { throw new AssertionError(e); } } + protected String getBeforeFileName() { + return getTestName(false) + ".kt"; + } + + protected String getAfterFileName() { + return getTestName(false) + ".kt.after"; + } + @Override protected String getTestDataPath() { return new File(PluginTestCaseBase.getTestDataPathBase(), "/completion/handlers/").getPath() + File.separator;