From e6c6982c615c39f023896fd2ffe867d399b1088d Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 13 Sep 2013 19:00:51 +0400 Subject: [PATCH] Always place keywords after local variables and parameters --- .../codeInsight/completion/annotations.xml | 8 +++++ .../plugin/completion/CompletionSession.java | 5 +-- .../JetKeywordCompletionContributor.java | 7 ++-- .../weigher/JetCompletionSorting.java | 36 ------------------- .../weigher/JetCompletionSorting.kt | 35 ++++++++++++++++++ .../weigher/JetLocalPreferableWeigher.java | 12 +++++-- .../weighers/LocalsBeforeKeywords.kt | 4 +++ .../weighers/LocalsPropertiesKeywords.kt | 4 +++ .../weighers/ParametersBeforeKeywords.kt | 3 ++ ...dsFirst.kt => TemplatesAndKeywordsLast.kt} | 0 .../weighers/CompletionWeigherTest.java | 16 +++++++-- 11 files changed, 85 insertions(+), 45 deletions(-) delete mode 100644 idea/src/org/jetbrains/jet/plugin/completion/weigher/JetCompletionSorting.java create mode 100644 idea/src/org/jetbrains/jet/plugin/completion/weigher/JetCompletionSorting.kt create mode 100644 idea/testData/completion/weighers/LocalsBeforeKeywords.kt create mode 100644 idea/testData/completion/weighers/LocalsPropertiesKeywords.kt create mode 100644 idea/testData/completion/weighers/ParametersBeforeKeywords.kt rename idea/testData/completion/weighers/{TemplatesAndKeywordsFirst.kt => TemplatesAndKeywordsLast.kt} (100%) diff --git a/annotations/com/intellij/codeInsight/completion/annotations.xml b/annotations/com/intellij/codeInsight/completion/annotations.xml index 7a6997823c8..cce2e9ddb41 100644 --- a/annotations/com/intellij/codeInsight/completion/annotations.xml +++ b/annotations/com/intellij/codeInsight/completion/annotations.xml @@ -1,4 +1,12 @@ + + + + + + diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.java b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.java index ab0c6b7b6c6..b45186fbd18 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.java @@ -36,7 +36,7 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.caches.JetShortNamesCache; import org.jetbrains.jet.plugin.codeInsight.TipsManager; -import org.jetbrains.jet.plugin.completion.weigher.JetCompletionSorting; +import org.jetbrains.jet.plugin.completion.weigher.WeigherPackage; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.project.CancelableResolveSession; import org.jetbrains.jet.plugin.references.JetSimpleNameReference; @@ -66,8 +66,9 @@ public class CompletionSession { inDescriptor = scope != null ? scope.getContainingDeclaration() : null; + //noinspection StaticMethodReferencedViaSubclass this.jetResult = new JetCompletionResultSet( - JetCompletionSorting.addJetSorting(parameters, result), + WeigherPackage.addJetSorting(result, parameters), resolveSession, expressionBindingContext, new Condition() { @Override diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java index 1ccb17b3c78..6b4da292cf7 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java @@ -42,6 +42,7 @@ import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.completion.handlers.JetKeywordInsertHandler; import org.jetbrains.jet.plugin.completion.handlers.JetTemplateInsertHandler; +import org.jetbrains.jet.plugin.completion.weigher.WeigherPackage; import java.util.ArrayList; import java.util.Collection; @@ -54,7 +55,6 @@ import static org.jetbrains.jet.plugin.completion.handlers.JetFunctionInsertHand * A keyword contributor for Kotlin */ public class JetKeywordCompletionContributor extends CompletionContributor { - private final static InsertHandler KEYWORDS_INSERT_HANDLER = new JetKeywordInsertHandler(); private final static ElementFilter GENERAL_FILTER = new NotFilter(new OrFilter( @@ -256,7 +256,10 @@ public class JetKeywordCompletionContributor extends CompletionContributor { @Override protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet result) { - result.withPrefixMatcher(new SimplePrefixMatcher(result.getPrefixMatcher().getPrefix())).addAllElements(elements); + //noinspection StaticMethodReferencedViaSubclass + WeigherPackage.addJetSorting(result, parameters) + .withPrefixMatcher(new SimplePrefixMatcher(result.getPrefixMatcher().getPrefix())) + .addAllElements(elements); } @Override diff --git a/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetCompletionSorting.java b/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetCompletionSorting.java deleted file mode 100644 index 670f82173a9..00000000000 --- a/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetCompletionSorting.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2010-2013 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.plugin.completion.weigher; - -import com.intellij.codeInsight.completion.CompletionParameters; -import com.intellij.codeInsight.completion.CompletionResultSet; -import com.intellij.codeInsight.completion.CompletionSorter; -import org.jetbrains.jet.lang.psi.JetFile; - -public final class JetCompletionSorting { - private JetCompletionSorting() { - } - - public static CompletionResultSet addJetSorting(CompletionParameters parameters, CompletionResultSet result) { - CompletionSorter sorter = CompletionSorter.defaultSorter(parameters, result.getPrefixMatcher()); - sorter = sorter.weighAfter("stats", - new JetLocalPreferableWeigher(), - new JetExplicitlyImportedWeigher((JetFile)parameters.getOriginalFile()), - new JetAccessibleWeigher()); - return result.withRelevanceSorter(sorter); - } -} diff --git a/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetCompletionSorting.kt b/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetCompletionSorting.kt new file mode 100644 index 00000000000..129c57f7c44 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetCompletionSorting.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2013 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.plugin.completion.weigher + +import com.intellij.codeInsight.completion.CompletionResultSet +import com.intellij.codeInsight.completion.CompletionParameters +import com.intellij.codeInsight.completion.CompletionSorter +import org.jetbrains.jet.lang.psi.JetFile + +public fun CompletionResultSet.addJetSorting(parameters : CompletionParameters) : CompletionResultSet { + var sorter = CompletionSorter.defaultSorter(parameters, getPrefixMatcher())!! + + sorter = sorter.weighBefore("stats", JetLocalPreferableWeigher()) + + sorter = sorter.weighAfter( + "stats", + JetExplicitlyImportedWeigher(parameters.getOriginalFile() as JetFile), + JetAccessibleWeigher()) + + return withRelevanceSorter(sorter) +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetLocalPreferableWeigher.java b/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetLocalPreferableWeigher.java index b961afa3493..bbe7ab2b570 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetLocalPreferableWeigher.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/weigher/JetLocalPreferableWeigher.java @@ -20,9 +20,9 @@ import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementWeigher; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.impl.LocalVariableDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; +import org.jetbrains.jet.lang.descriptors.impl.LocalVariableDescriptor; import org.jetbrains.jet.plugin.completion.JetLookupObject; class JetLocalPreferableWeigher extends LookupElementWeigher { @@ -31,8 +31,8 @@ class JetLocalPreferableWeigher extends LookupElementWeigher { } private enum MyResult { - probableKeyword, localOrParameter, + probableKeyword, normal, packages } @@ -52,10 +52,16 @@ class JetLocalPreferableWeigher extends LookupElementWeigher { return MyResult.packages; } } - } else if (object instanceof String) { + } + else if (object instanceof String) { return MyResult.probableKeyword; } return MyResult.normal; } + + @Override + public boolean isPrefixDependent() { + return false; + } } diff --git a/idea/testData/completion/weighers/LocalsBeforeKeywords.kt b/idea/testData/completion/weighers/LocalsBeforeKeywords.kt new file mode 100644 index 00000000000..e6ff31110c6 --- /dev/null +++ b/idea/testData/completion/weighers/LocalsBeforeKeywords.kt @@ -0,0 +1,4 @@ +fun test() { + val a = 12 + +} \ No newline at end of file diff --git a/idea/testData/completion/weighers/LocalsPropertiesKeywords.kt b/idea/testData/completion/weighers/LocalsPropertiesKeywords.kt new file mode 100644 index 00000000000..80f1f572d25 --- /dev/null +++ b/idea/testData/completion/weighers/LocalsPropertiesKeywords.kt @@ -0,0 +1,4 @@ +fun test(fals: Int) { + val falt = 111 + f +} \ No newline at end of file diff --git a/idea/testData/completion/weighers/ParametersBeforeKeywords.kt b/idea/testData/completion/weighers/ParametersBeforeKeywords.kt new file mode 100644 index 00000000000..4d0df5ffac9 --- /dev/null +++ b/idea/testData/completion/weighers/ParametersBeforeKeywords.kt @@ -0,0 +1,3 @@ +fun bar(fo: Int) { + +} \ No newline at end of file diff --git a/idea/testData/completion/weighers/TemplatesAndKeywordsFirst.kt b/idea/testData/completion/weighers/TemplatesAndKeywordsLast.kt similarity index 100% rename from idea/testData/completion/weighers/TemplatesAndKeywordsFirst.kt rename to idea/testData/completion/weighers/TemplatesAndKeywordsLast.kt diff --git a/idea/tests/org/jetbrains/jet/completion/weighers/CompletionWeigherTest.java b/idea/tests/org/jetbrains/jet/completion/weighers/CompletionWeigherTest.java index 13bf2929986..e79aadc9966 100644 --- a/idea/tests/org/jetbrains/jet/completion/weighers/CompletionWeigherTest.java +++ b/idea/tests/org/jetbrains/jet/completion/weighers/CompletionWeigherTest.java @@ -27,14 +27,26 @@ public class CompletionWeigherTest extends CompletionAutoPopupTestCase { doTest("init", "initLocal", "initParam", "initGlobal"); } - public void testTemplatesAndKeywordsFirst() { - doTest("va", "val ... = ...", "var ... = ...", "vararg", "values", "variables"); + public void testTemplatesAndKeywordsLast() { + doTest("va", "values", "variables", "val ... = ...", "var ... = ...", "vararg"); } public void testDeprecatedFun() { doTest("foo", "foo1", "foo3", "foo2"); } + public void testLocalsBeforeKeywords() { + doTest("a", "a", "as"); + } + + public void testParametersBeforeKeywords() { + doTest("fo", "fo", "for (... in ...) {...}"); + } + + public void testLocalsPropertiesKeywords() { + doTest("a", "fals", "falt", "false"); + } + public void doTest(String type, @NonNls String... expected) { new WriteCommandAction(myFixture.getProject(), myFixture.getFile()) { @Override