Filtering out nested elements for reference shortening
This commit is contained in:
@@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement;
|
|||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||||
import org.jetbrains.kotlin.idea.util.ImportInsertHelper;
|
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
@@ -33,6 +32,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
|
import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.parents
|
||||||
|
|
||||||
public object ShortenReferences {
|
public object ShortenReferences {
|
||||||
public fun process(element: JetElement) {
|
public fun process(element: JetElement) {
|
||||||
@@ -106,6 +106,8 @@ public object ShortenReferences {
|
|||||||
elements: List<JetElement>,
|
elements: List<JetElement>,
|
||||||
elementFilter: (PsiElement) -> FilterResult
|
elementFilter: (PsiElement) -> FilterResult
|
||||||
) {
|
) {
|
||||||
|
val elementsToUse = dropNestedElements(elements)
|
||||||
|
|
||||||
val importInserter = ImportInserter(file)
|
val importInserter = ImportInserter(file)
|
||||||
|
|
||||||
val failedToImportDescriptors = LinkedHashSet<DeclarationDescriptor>()
|
val failedToImportDescriptors = LinkedHashSet<DeclarationDescriptor>()
|
||||||
@@ -114,8 +116,8 @@ public object ShortenReferences {
|
|||||||
val visitor1 = ShortenTypesVisitor(file, elementFilter, failedToImportDescriptors)
|
val visitor1 = ShortenTypesVisitor(file, elementFilter, failedToImportDescriptors)
|
||||||
val visitor2 = ShortenQualifiedExpressionsVisitor(file, elementFilter, failedToImportDescriptors)
|
val visitor2 = ShortenQualifiedExpressionsVisitor(file, elementFilter, failedToImportDescriptors)
|
||||||
|
|
||||||
val descriptorsToImport1 = analyzeReferences(elements, visitor1)
|
val descriptorsToImport1 = analyzeReferences(elementsToUse, visitor1)
|
||||||
val descriptorsToImport2 = analyzeReferences(elements, visitor2)
|
val descriptorsToImport2 = analyzeReferences(elementsToUse, visitor2)
|
||||||
|
|
||||||
visitor1.shortenElements()
|
visitor1.shortenElements()
|
||||||
visitor2.shortenElements()
|
visitor2.shortenElements()
|
||||||
@@ -139,6 +141,18 @@ public object ShortenReferences {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun dropNestedElements(elements: List<JetElement>): Iterable<JetElement> {
|
||||||
|
if (elements.size() <= 1) return elements
|
||||||
|
val elementSet = elements.toSet()
|
||||||
|
val newElements = ArrayList<JetElement>(elementSet.size())
|
||||||
|
for (element in elementSet) {
|
||||||
|
if (!element.parents(withItself = false).any { it in elementSet }) {
|
||||||
|
newElements.add(element)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newElements
|
||||||
|
}
|
||||||
|
|
||||||
private fun analyzeReferences(elements: Iterable<JetElement>, visitor: ShorteningVisitor<*>): Set<DeclarationDescriptor> {
|
private fun analyzeReferences(elements: Iterable<JetElement>, visitor: ShorteningVisitor<*>): Set<DeclarationDescriptor> {
|
||||||
for (element in elements) {
|
for (element in elements) {
|
||||||
element.accept(visitor)
|
element.accept(visitor)
|
||||||
|
|||||||
Reference in New Issue
Block a user