Always place keywords after local variables and parameters

This commit is contained in:
Nikolay Krasko
2013-09-13 19:00:51 +04:00
parent d681f306ae
commit e6c6982c61
11 changed files with 85 additions and 45 deletions
@@ -1,4 +1,12 @@
<root>
<item
name='com.intellij.codeInsight.completion.CompletionSorter com.intellij.codeInsight.completion.CompletionSorter weighAfter(java.lang.String, com.intellij.codeInsight.lookup.LookupElementWeigher...)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.codeInsight.completion.CompletionSorter com.intellij.codeInsight.completion.CompletionSorter weighBefore(java.lang.String, com.intellij.codeInsight.lookup.LookupElementWeigher...)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='com.intellij.codeInsight.completion.InsertionContext com.intellij.openapi.project.Project getProject()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
@@ -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<DeclarationDescriptor>() {
@Override
@@ -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<LookupElement> 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
@@ -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);
}
}
@@ -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)
}
@@ -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;
}
}
@@ -0,0 +1,4 @@
fun test() {
val a = 12
<caret>
}
@@ -0,0 +1,4 @@
fun test(fals: Int) {
val falt = 111
f<caret>
}
@@ -0,0 +1,3 @@
fun bar(fo: Int) {
<caret>
}
@@ -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