Completion: converted all weighers to Kotlin merging them into one file

This commit is contained in:
Valentin Kipyatkov
2014-07-29 22:14:58 +04:00
parent 3d523ba325
commit 752a6cef0d
4 changed files with 101 additions and 222 deletions
@@ -1,52 +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.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.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.plugin.completion.JetLookupObject;
class JetAccessibleWeigher extends LookupElementWeigher {
JetAccessibleWeigher() {
super("JetAccessibleWeigher");
}
private enum MyResult {
normal,
deprecated
}
@NotNull
@Override
public MyResult weigh(@NotNull LookupElement element) {
Object object = element.getObject();
if (object instanceof JetLookupObject) {
JetLookupObject lookupObject = (JetLookupObject) object;
DeclarationDescriptor descriptor = lookupObject.getDescriptor();
if (descriptor != null) {
if (KotlinBuiltIns.getInstance().isDeprecated(descriptor)) {
return MyResult.deprecated;
}
}
}
return MyResult.normal;
}
}
@@ -24,29 +24,117 @@ import com.intellij.codeInsight.lookup.LookupElementWeigher
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.lookup.WeighingContext
import org.jetbrains.jet.plugin.completion.*
import org.jetbrains.jet.lang.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.resolve.DescriptorUtils
import org.jetbrains.jet.lang.resolve.name.isValidJavaFqName
import org.jetbrains.jet.lang.resolve.ImportPath
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper
public fun CompletionResultSet.addJetSorting(parameters: CompletionParameters): CompletionResultSet {
var sorter = CompletionSorter.defaultSorter(parameters, getPrefixMatcher())!!
object PriorityWeigher : LookupElementWeigher("priority", false, false) {
override fun weigh(element: LookupElement, context: WeighingContext)
= (element.getUserData(ITEM_PRIORITY_KEY) ?: ItemPriority.DEFAULT).ordinal()
}
sorter = sorter.weighBefore("stats", PriorityWeigher, JetKindWeigher())
sorter = sorter.weighBefore("stats", PriorityWeigher, KindWeigher)
sorter = sorter.weighAfter(
"stats",
JetDeclarationRemotenessWeigher(parameters.getOriginalFile() as JetFile),
JetAccessibleWeigher())
DeprecatedWeigher)
object PreferMatchingItemWeigher : LookupElementWeigher("preferMatching", false, true) {
override fun weigh(element: LookupElement, context: WeighingContext): Comparable<Int> {
val prefix = context.itemPattern(element)
return if (element.getLookupString() == prefix) 0 else 1
}
}
sorter = sorter.weighBefore("middleMatching", PreferMatchingItemWeigher)
return withRelevanceSorter(sorter)
}
private object PriorityWeigher : LookupElementWeigher("kotlin.priority") {
override fun weigh(element: LookupElement, context: WeighingContext)
= (element.getUserData(ITEM_PRIORITY_KEY) ?: ItemPriority.DEFAULT).ordinal()
}
private object KindWeigher : LookupElementWeigher("kotlin.kind") {
enum class Weight : Comparable<Weight> {
override fun compareTo(other: Weight) = ordinal().compareTo(other.ordinal())
localOrParameter
property
probableKeyword
normal
packages
}
override fun weigh(element: LookupElement): Weight {
val o = element.getObject()
return when (o) {
is JetLookupObject -> when (o.getDescriptor()) {
is LocalVariableDescriptor, is ValueParameterDescriptor -> Weight.localOrParameter
is PropertyDescriptor -> Weight.property
is PackageViewDescriptor -> Weight.packages
else -> Weight.normal
}
is String -> Weight.probableKeyword
else -> Weight.normal
}
}
}
private object DeprecatedWeigher : LookupElementWeigher("kotlin.deprecated") {
override fun weigh(element: LookupElement): Int {
val o = element.getObject()
if (o is JetLookupObject) {
val descriptor = o.getDescriptor()
if (descriptor != null && KotlinBuiltIns.getInstance().isDeprecated(descriptor)) return 1
}
return 0
}
}
private object PreferMatchingItemWeigher : LookupElementWeigher("kotlin.preferMatching", false, true) {
override fun weigh(element: LookupElement, context: WeighingContext): Comparable<Int> {
val prefix = context.itemPattern(element)
return if (element.getLookupString() == prefix) 0 else 1
}
}
private class JetDeclarationRemotenessWeigher(private val file: JetFile) : LookupElementWeigher("kotlin.declarationRemoteness") {
private enum class Weight : Comparable<Weight> {
override fun compareTo(other: Weight) = ordinal().compareTo(other.ordinal())
kotlinDefaultImport
thisFile
imported
normal
notImported
}
override fun weigh(element: LookupElement): Weight {
val o = element.getObject()
if (o is JetLookupObject) {
val elementFile = o.getPsiElement()?.getContainingFile()
if (elementFile is JetFile && elementFile.getOriginalFile() == file) {
return Weight.thisFile
}
val descriptor = o.getDescriptor()
if (descriptor != null) {
val fqName = DescriptorUtils.getFqName(descriptor).toString()
// Invalid name can be met for class object descriptor: Test.MyTest.A.<no name provided>.testOther
if (isValidJavaFqName(fqName)) {
val importPath = ImportPath(fqName)
return when {
ImportInsertHelper.needImport(importPath, file) -> Weight.notImported
ImportInsertHelper.isImportedWithDefault(importPath, file) -> Weight.kotlinDefaultImport
else -> Weight.imported
}
}
}
}
return Weight.normal
}
}
@@ -1,85 +0,0 @@
/*
* Copyright 2010-2014 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.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementWeigher;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.NamePackage;
import org.jetbrains.jet.plugin.completion.JetLookupObject;
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper;
public class JetDeclarationRemotenessWeigher extends LookupElementWeigher {
private final JetFile file;
protected JetDeclarationRemotenessWeigher(JetFile file) {
super(JetDeclarationRemotenessWeigher.class.getSimpleName());
this.file = file;
}
private enum Weight {
kotlinDefaultImport,
thisFile,
imported,
normal,
notImported,
}
@NotNull
@Override
public Comparable weigh(@NotNull LookupElement element) {
Object object = element.getObject();
if (object instanceof JetLookupObject) {
JetLookupObject lookupObject = (JetLookupObject) object;
PsiElement psiElement = lookupObject.getPsiElement();
if (psiElement != null) {
PsiFile elementFile = psiElement.getContainingFile();
if (elementFile instanceof JetFile && elementFile.getOriginalFile() == file) {
return Weight.thisFile;
}
}
DeclarationDescriptor descriptor = lookupObject.getDescriptor();
if (descriptor != null) {
FqNameUnsafe fqName = DescriptorUtils.getFqName(descriptor);
// Invalid name can be met for class object descriptor: Test.MyTest.A.<no name provided>.testOther
if (NamePackage.isValidJavaFqName(fqName.toString())) {
ImportPath importPath = new ImportPath(fqName.toString());
if (ImportInsertHelper.needImport(importPath, file)) {
return Weight.notImported;
}
else {
if (ImportInsertHelper.isImportedWithDefault(importPath, file)) {
return Weight.kotlinDefaultImport;
}
return Weight.imported;
}
}
}
}
return Weight.normal;
}
}
@@ -1,72 +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.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.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.LocalVariableDescriptor;
import org.jetbrains.jet.plugin.completion.JetLookupObject;
class JetKindWeigher extends LookupElementWeigher {
JetKindWeigher() {
super(JetKindWeigher.class.getSimpleName());
}
private enum Weight {
localOrParameter,
property,
probableKeyword,
normal,
packages
}
@NotNull
@Override
public Weight weigh(@NotNull LookupElement element) {
Object object = element.getObject();
if (object instanceof JetLookupObject) {
JetLookupObject lookupObject = (JetLookupObject) object;
DeclarationDescriptor descriptor = lookupObject.getDescriptor();
if (descriptor != null) {
if (descriptor instanceof LocalVariableDescriptor || descriptor instanceof ValueParameterDescriptor) {
return Weight.localOrParameter;
}
else if (descriptor instanceof PropertyDescriptor) {
return Weight.property;
}
else if (descriptor instanceof PackageViewDescriptor) {
return Weight.packages;
}
}
}
else if (object instanceof String) {
return Weight.probableKeyword;
}
return Weight.normal;
}
@Override
public boolean isPrefixDependent() {
return false;
}
}