Fixed important bug in reference shortening

This commit is contained in:
Valentin Kipyatkov
2015-02-11 23:55:46 +03:00
parent 6acba00599
commit 49e6b97752
@@ -154,6 +154,7 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options.
elements: List<JetElement>, elements: List<JetElement>,
elementFilter: (PsiElement) -> FilterResult elementFilter: (PsiElement) -> FilterResult
) { ) {
//TODO: that's not correct since we have options!
val elementsToUse = dropNestedElements(elements) val elementsToUse = dropNestedElements(elements)
val importInserter = ImportInserter(file) val importInserter = ImportInserter(file)
@@ -169,7 +170,7 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options.
ShortenQualifiedExpressionsVisitor(file, elementFilter, failedToImportDescriptors) ShortenQualifiedExpressionsVisitor(file, elementFilter, failedToImportDescriptors)
) )
val descriptorsToImport = visitors.flatMap { analyzeReferences(elementsToUse, it) }.toSet() val descriptorsToImport = visitors.flatMap { analyzeReferences(elementsToUse, it) }.toSet()
visitors.forEach { elementsToUse.removeAll(it.shortenElements()) } visitors.forEach { it.shortenElements(elementsToUse) }
var anyChange = false var anyChange = false
for (descriptor in descriptorsToImport) { for (descriptor in descriptorsToImport) {
@@ -232,7 +233,7 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options.
protected abstract fun qualifier(element: T): JetElement protected abstract fun qualifier(element: T): JetElement
protected abstract fun shortenElement(element: T) protected abstract fun shortenElement(element: T): JetElement
override fun visitElement(element: PsiElement) { override fun visitElement(element: PsiElement) {
if (elementFilter(element) != FilterResult.SKIP) { if (elementFilter(element) != FilterResult.SKIP) {
@@ -240,12 +241,15 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options.
} }
} }
public fun shortenElements(): Collection<T> { public fun shortenElements(elementSetToUpdate: MutableSet<JetElement>) {
for (element in elementsToShorten) { for (element in elementsToShorten) {
if (!element.isValid()) continue if (!element.isValid()) continue
shortenElement(element) val newElement = shortenElement(element)
if (element in elementSetToUpdate && newElement != element) {
elementSetToUpdate.remove(element)
elementSetToUpdate.add(newElement)
}
} }
return elementsToShorten
} }
public fun getDescriptorsToImport(): Set<DeclarationDescriptor> = descriptorsToImport public fun getDescriptorsToImport(): Set<DeclarationDescriptor> = descriptorsToImport
@@ -288,8 +292,9 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options.
override fun qualifier(element: JetUserType) = element.getQualifier()!! override fun qualifier(element: JetUserType) = element.getQualifier()!!
override fun shortenElement(element: JetUserType) { override fun shortenElement(element: JetUserType): JetElement {
element.deleteQualifier() element.deleteQualifier()
return element
} }
} }
@@ -365,8 +370,8 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options.
override fun qualifier(element: JetQualifiedExpression) = element.getReceiverExpression() override fun qualifier(element: JetQualifiedExpression) = element.getReceiverExpression()
override fun shortenElement(element: JetQualifiedExpression) { override fun shortenElement(element: JetQualifiedExpression): JetElement {
element.replace(element.getSelectorExpression()!!) return element.replace(element.getSelectorExpression()!!) as JetElement
} }
} }
@@ -400,8 +405,8 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options.
override fun qualifier(element: JetThisExpression): JetElement = override fun qualifier(element: JetThisExpression): JetElement =
throw AssertionError("Qualifier requested: ${JetPsiUtil.getElementTextWithContext(element)}") throw AssertionError("Qualifier requested: ${JetPsiUtil.getElementTextWithContext(element)}")
override fun shortenElement(element: JetThisExpression) { override fun shortenElement(element: JetThisExpression): JetElement {
element.replace(simpleThis) return element.replace(simpleThis) as JetElement
} }
} }