Completion: should prefer ShortenReferences by elements instead of text range

This commit is contained in:
Dmitry Gridin
2019-10-01 16:40:39 +07:00
parent 2d43d71727
commit bf7c325f43
3 changed files with 22 additions and 5 deletions
@@ -27,7 +27,9 @@ import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.idea.util.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.renderer.render
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -36,6 +38,7 @@ import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.isError import org.jetbrains.kotlin.types.isError
import org.jetbrains.kotlin.types.typeUtil.TypeNullability import org.jetbrains.kotlin.types.typeUtil.TypeNullability
import org.jetbrains.kotlin.types.typeUtil.nullability import org.jetbrains.kotlin.types.typeUtil.nullability
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.util.* import java.util.*
tailrec fun <T : Any> LookupElement.putUserDataDeep(key: Key<T>, value: T?) { tailrec fun <T : Any> LookupElement.putUserDataDeep(key: Key<T>, value: T?) {
@@ -333,9 +336,22 @@ private open class BaseTypeLookupElement(type: KotlinType, baseLookupElement: Lo
} }
} }
fun shortenReferences(context: InsertionContext, startOffset: Int, endOffset: Int) { fun shortenReferences(
context: InsertionContext,
startOffset: Int,
endOffset: Int,
shortenReferences: ShortenReferences = ShortenReferences.DEFAULT
) {
PsiDocumentManager.getInstance(context.project).commitAllDocuments() PsiDocumentManager.getInstance(context.project).commitAllDocuments()
ShortenReferences.DEFAULT.process(context.file as KtFile, startOffset, endOffset) val file = context.file as KtFile
val element = file.findElementAt(startOffset)?.parentsWithSelf?.find {
it.startOffset == startOffset && it.endOffset == endOffset
}?.safeAs<KtElement>()
if (element != null)
shortenReferences.process(element)
else
shortenReferences.process(file, startOffset, endOffset)
} }
infix fun <T> ElementPattern<T>.and(rhs: ElementPattern<T>) = StandardPatterns.and(this, rhs) infix fun <T> ElementPattern<T>.and(rhs: ElementPattern<T>) = StandardPatterns.and(this, rhs)
@@ -10,6 +10,7 @@ import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiDocumentManager
import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.idea.completion.isArtificialImportAliasedDescriptor import org.jetbrains.kotlin.idea.completion.isArtificialImportAliasedDescriptor
import org.jetbrains.kotlin.idea.completion.shortenReferences
import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject
import org.jetbrains.kotlin.idea.core.withRootPrefixIfNeeded import org.jetbrains.kotlin.idea.core.withRootPrefixIfNeeded
@@ -54,7 +55,7 @@ abstract class KotlinCallableInsertHandler(val callType: CallType<*>) : BaseDecl
psiDocumentManager.commitAllDocuments() psiDocumentManager.commitAllDocuments()
SHORTEN_REFERENCES.process(file, context.startOffset, context.tailOffset - 1) shortenReferences(context, context.startOffset, context.tailOffset - 1, SHORTEN_REFERENCES)
psiDocumentManager.doPostponedOperationsAndUnblockDocument(context.document) psiDocumentManager.doPostponedOperationsAndUnblockDocument(context.document)
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.allowResolveInDispatchThread
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.completion.isAfterDot import org.jetbrains.kotlin.idea.completion.isAfterDot
import org.jetbrains.kotlin.idea.completion.isArtificialImportAliasedDescriptor import org.jetbrains.kotlin.idea.completion.isArtificialImportAliasedDescriptor
import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.completion.shortenReferences
import org.jetbrains.kotlin.idea.core.canAddRootPrefix import org.jetbrains.kotlin.idea.core.canAddRootPrefix
import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject
import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver
@@ -83,7 +83,7 @@ object KotlinClassifierInsertHandler : BaseDeclarationInsertHandler() {
val rangeMarker = document.createRangeMarker(classNameStart, classNameEnd) val rangeMarker = document.createRangeMarker(classNameStart, classNameEnd)
val wholeRangeMarker = document.createRangeMarker(startOffset, classNameEnd + tempSuffix.length) val wholeRangeMarker = document.createRangeMarker(startOffset, classNameEnd + tempSuffix.length)
ShortenReferences.DEFAULT.process(file, classNameStart, classNameEnd) shortenReferences(context, classNameStart, classNameEnd)
psiDocumentManager.doPostponedOperationsAndUnblockDocument(document) psiDocumentManager.doPostponedOperationsAndUnblockDocument(document)
if (rangeMarker.isValid && wholeRangeMarker.isValid) { if (rangeMarker.isValid && wholeRangeMarker.isValid) {