From 49e6b977528441c36eeefe27591295e77e0d8eed Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 11 Feb 2015 23:55:46 +0300 Subject: [PATCH] Fixed important bug in reference shortening --- .../kotlin/idea/util/ShortenReferences.kt | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ShortenReferences.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ShortenReferences.kt index f25dbbfefc2..e53cf1231a9 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ShortenReferences.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/ShortenReferences.kt @@ -154,6 +154,7 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options. elements: List, elementFilter: (PsiElement) -> FilterResult ) { + //TODO: that's not correct since we have options! val elementsToUse = dropNestedElements(elements) val importInserter = ImportInserter(file) @@ -169,7 +170,7 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options. ShortenQualifiedExpressionsVisitor(file, elementFilter, failedToImportDescriptors) ) val descriptorsToImport = visitors.flatMap { analyzeReferences(elementsToUse, it) }.toSet() - visitors.forEach { elementsToUse.removeAll(it.shortenElements()) } + visitors.forEach { it.shortenElements(elementsToUse) } var anyChange = false 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 shortenElement(element: T) + protected abstract fun shortenElement(element: T): JetElement override fun visitElement(element: PsiElement) { if (elementFilter(element) != FilterResult.SKIP) { @@ -240,12 +241,15 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options. } } - public fun shortenElements(): Collection { + public fun shortenElements(elementSetToUpdate: MutableSet) { for (element in elementsToShorten) { 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 = descriptorsToImport @@ -288,8 +292,9 @@ public class ShortenReferences(val options: (JetElement) -> Options = { Options. override fun qualifier(element: JetUserType) = element.getQualifier()!! - override fun shortenElement(element: JetUserType) { + override fun shortenElement(element: JetUserType): JetElement { 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 shortenElement(element: JetQualifiedExpression) { - element.replace(element.getSelectorExpression()!!) + override fun shortenElement(element: JetQualifiedExpression): JetElement { + 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 = throw AssertionError("Qualifier requested: ${JetPsiUtil.getElementTextWithContext(element)}") - override fun shortenElement(element: JetThisExpression) { - element.replace(simpleThis) + override fun shortenElement(element: JetThisExpression): JetElement { + return element.replace(simpleThis) as JetElement } }