Completion: more correct detection of keyword items on sorting

This commit is contained in:
Valentin Kipyatkov
2014-07-29 22:46:32 +04:00
parent 448c3008f5
commit 7f0075abbd
3 changed files with 20 additions and 24 deletions
@@ -39,7 +39,6 @@ import org.jetbrains.jet.plugin.caches.JetShortNamesCache;
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.plugin.codeInsight.TipsManager; import org.jetbrains.jet.plugin.codeInsight.TipsManager;
import org.jetbrains.jet.plugin.completion.smart.SmartCompletion; import org.jetbrains.jet.plugin.completion.smart.SmartCompletion;
import org.jetbrains.jet.plugin.completion.weigher.WeigherPackage;
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies; import org.jetbrains.jet.plugin.project.ResolveSessionForBodies;
import org.jetbrains.jet.plugin.references.JetSimpleNameReference; import org.jetbrains.jet.plugin.references.JetSimpleNameReference;
@@ -78,7 +77,7 @@ class CompletionSession {
// which sometimes works incorrectly for Kotlin // which sometimes works incorrectly for Kotlin
result = result.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters)); result = result.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters));
result = WeigherPackage.addJetSorting(result, parameters); result = CompletionPackage.addKotlinSorting(result, parameters);
this.jetResult = new JetCompletionResultSet(result, resolveSession, expressionBindingContext, descriptorFilter); this.jetResult = new JetCompletionResultSet(result, resolveSession, expressionBindingContext, descriptorFilter);
} }
@@ -60,8 +60,8 @@ private object KindWeigher : LookupElementWeigher("kotlin.kind") {
localOrParameter localOrParameter
property property
probableKeyword keyword
normal default
packages packages
} }
@@ -72,12 +72,12 @@ private object KindWeigher : LookupElementWeigher("kotlin.kind") {
is LocalVariableDescriptor, is ValueParameterDescriptor -> Weight.localOrParameter is LocalVariableDescriptor, is ValueParameterDescriptor -> Weight.localOrParameter
is PropertyDescriptor -> Weight.property is PropertyDescriptor -> Weight.property
is PackageViewDescriptor -> Weight.packages is PackageViewDescriptor -> Weight.packages
else -> Weight.normal else -> Weight.default
} }
is String -> Weight.probableKeyword is KeywordLookupObject -> Weight.keyword
else -> Weight.normal else -> Weight.default
} }
} }
} }
@@ -23,8 +23,6 @@ import com.intellij.psi.filters.position.LeftNeighbour
import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lexer.JetToken import org.jetbrains.jet.lexer.JetToken
import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lexer.JetTokens
import com.intellij.codeInsight.completion.CompletionContributor
import com.intellij.codeInsight.completion.CompletionType
import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.psi.filters.position.SuperParentFilter import com.intellij.psi.filters.position.SuperParentFilter
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
@@ -42,6 +40,8 @@ import com.intellij.psi.filters.position.FilterPattern
import com.intellij.patterns.PlatformPatterns import com.intellij.patterns.PlatformPatterns
import com.intellij.psi.filters.position.PatternFilter import com.intellij.psi.filters.position.PatternFilter
class KeywordLookupObject(val keyword: String)
public open class JetKeywordCompletionContributor() : CompletionContributor() { public open class JetKeywordCompletionContributor() : CompletionContributor() {
{ {
val inTopLevel = notIdentifier(InTopFilter()) val inTopLevel = notIdentifier(InTopFilter())
@@ -116,7 +116,7 @@ public open class JetKeywordCompletionContributor() : CompletionContributor() {
} }
private fun registerScopeKeywordsCompletion(placeFilter : ElementFilter, keywords : Collection<JetToken>) { private fun registerScopeKeywordsCompletion(placeFilter : ElementFilter, keywords : Collection<JetToken>) {
extend(CompletionType.BASIC, getPlacePattern(placeFilter), KeywordsCompletionProvider(keywords.map { it.toString()!! })) extend(CompletionType.BASIC, getPlacePattern(placeFilter), KeywordsCompletionProvider(keywords.map { it.toString() }))
} }
private inner class BunchKeywordRegister() { private inner class BunchKeywordRegister() {
@@ -128,11 +128,11 @@ public open class JetKeywordCompletionContributor() : CompletionContributor() {
} }
fun registerAll() { fun registerAll() {
for (entry in orFiltersToKeywords.entrySet()!!) { for ((filters, token) in orFiltersToKeywords.entrySet()) {
val orFilter = OrFilter() val orFilter = OrFilter()
entry.key.forEach { filter -> orFilter.addFilter(filter) } filters.forEach { filter -> orFilter.addFilter(filter) }
registerScopeKeywordsCompletion(orFilter, entry.value) registerScopeKeywordsCompletion(orFilter, token)
} }
} }
} }
@@ -232,8 +232,7 @@ public open class JetKeywordCompletionContributor() : CompletionContributor() {
private open class InPropertyBodyFilter() : PositionElementFilter() { private open class InPropertyBodyFilter() : PositionElementFilter() {
override fun isAcceptable(element: Any?, context: PsiElement?): Boolean { override fun isAcceptable(element: Any?, context: PsiElement?): Boolean {
if (!(element is PsiElement)) if (element !is PsiElement) return false
return false
val property = PsiTreeUtil.getParentOfType(context, javaClass<JetProperty>(), false) val property = PsiTreeUtil.getParentOfType(context, javaClass<JetProperty>(), false)
return property != null && isAfterName(property, (element as PsiElement)) return property != null && isAfterName(property, (element as PsiElement))
@@ -269,17 +268,15 @@ public open class JetKeywordCompletionContributor() : CompletionContributor() {
private val debugName : String private val debugName : String
{ {
debugName = keywords.sort().makeString(separator = ", ") debugName = keywords.sort().joinToString(separator = ", ")
elements = keywords.map { keyword -> elements = keywords.map { keyword ->
val lookupElementBuilder = LookupElementBuilder.create(keyword).bold() LookupElementBuilder.create(KeywordLookupObject(keyword), keyword)
.bold()
if (!JetKeywordCompletionContributor.FUNCTION_KEYWORDS.contains(keyword)) { .withInsertHandler(if (keyword !in FUNCTION_KEYWORDS)
lookupElementBuilder.withInsertHandler(JetKeywordCompletionContributor.KEYWORDS_INSERT_HANDLER) KEYWORDS_INSERT_HANDLER
} else
else { JetFunctionInsertHandler.NO_PARAMETERS_HANDLER)
lookupElementBuilder.withInsertHandler(JetFunctionInsertHandler.NO_PARAMETERS_HANDLER)
}
} }
} }