Move: Implement Kotlin-specific editor for class name

#KT-13192 Fixed
This commit is contained in:
Alexey Sedunov
2017-03-27 20:37:47 +03:00
parent eaba215bbb
commit b5db50f429
6 changed files with 118 additions and 11 deletions
@@ -142,7 +142,7 @@ abstract class CompletionSession(
// LookupElementsCollector instantiation is deferred because virtual call to createSorter uses data from derived classes
protected val collector: LookupElementsCollector by lazy(LazyThreadSafetyMode.NONE) {
LookupElementsCollector(prefixMatcher, parameters, resultSet, createSorter())
LookupElementsCollector(prefixMatcher, parameters, resultSet, createSorter(), (file as? KtCodeFragment)?.extraCompletionFilter)
}
protected val searchScope: GlobalSearchScope = getResolveScope(parameters.originalFile as KtFile)
@@ -418,4 +418,6 @@ fun OffsetMap.tryGetOffset(key: OffsetKey): Int? {
catch(e: Exception) {
return null
}
}
}
var KtCodeFragment.extraCompletionFilter: ((LookupElement) -> Boolean)? by CopyableUserDataProperty(Key.create("EXTRA_COMPLETION_FILTER"))
@@ -159,6 +159,7 @@ object KeywordCompletion {
CommentFilter(),
ParentFilter(ClassFilter(KtLiteralStringTemplateEntry::class.java)),
ParentFilter(ClassFilter(KtConstantExpression::class.java)),
FileFilter(ClassFilter(KtTypeCodeFragment::class.java)),
LeftNeighbour(TextFilter(".")),
LeftNeighbour(TextFilter("?."))
))
@@ -182,6 +183,17 @@ object KeywordCompletion {
}
}
private class FileFilter(filter : ElementFilter) : PositionElementFilter() {
init {
setFilter(filter)
}
override fun isAcceptable(element : Any?, context : PsiElement?) : Boolean {
val file = (element as? PsiElement)?.containingFile
return file != null && (filter?.isAcceptable(file, context) ?: true)
}
}
private fun buildFilter(position: PsiElement): (KtKeywordToken) -> Boolean {
var parent = position.parent
var prevParent = position
@@ -32,7 +32,8 @@ class LookupElementsCollector(
private val prefixMatcher: PrefixMatcher,
private val completionParameters: CompletionParameters,
resultSet: CompletionResultSet,
sorter: CompletionSorter
sorter: CompletionSorter,
private val filter: ((LookupElement) -> Boolean)?
) {
var bestMatchingDegree = Int.MIN_VALUE
@@ -132,7 +133,9 @@ class LookupElementsCollector(
}
}
elements.add(result)
if (filter?.invoke(result) ?: true) {
elements.add(result)
}
val matchingDegree = RealPrefixMatchingWeigher.getBestMatchingDegree(result, prefixMatcher)
bestMatchingDegree = Math.max(bestMatchingDegree, matchingDegree)