Filtering out nested elements for reference shortening

This commit is contained in:
Valentin Kipyatkov
2015-01-28 18:14:09 +03:00
parent 033b626a08
commit 0967ccb1cd
@@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.idea.util.ImportInsertHelper;
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import com.intellij.psi.util.PsiTreeUtil
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.psi.psiUtil.getStrictParentOfType
import java.util.ArrayList
import org.jetbrains.kotlin.psi.psiUtil.parents
public object ShortenReferences {
public fun process(element: JetElement) {
@@ -106,6 +106,8 @@ public object ShortenReferences {
elements: List<JetElement>,
elementFilter: (PsiElement) -> FilterResult
) {
val elementsToUse = dropNestedElements(elements)
val importInserter = ImportInserter(file)
val failedToImportDescriptors = LinkedHashSet<DeclarationDescriptor>()
@@ -114,8 +116,8 @@ public object ShortenReferences {
val visitor1 = ShortenTypesVisitor(file, elementFilter, failedToImportDescriptors)
val visitor2 = ShortenQualifiedExpressionsVisitor(file, elementFilter, failedToImportDescriptors)
val descriptorsToImport1 = analyzeReferences(elements, visitor1)
val descriptorsToImport2 = analyzeReferences(elements, visitor2)
val descriptorsToImport1 = analyzeReferences(elementsToUse, visitor1)
val descriptorsToImport2 = analyzeReferences(elementsToUse, visitor2)
visitor1.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> {
for (element in elements) {
element.accept(visitor)