Fixed incorrect handling of this and super expressions in copy/paste processing and optimize imports

This commit is contained in:
Valentin Kipyatkov
2015-10-19 14:39:54 +03:00
parent 33d206ab22
commit 66ea544a48
6 changed files with 49 additions and 3 deletions
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.idea.references.JetMultiReference
import org.jetbrains.kotlin.idea.references.JetReference
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
@@ -53,7 +54,6 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
@@ -156,8 +156,8 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Kotlin
if (!descriptor.isExtension) {
if (element !is JetNameReferenceExpression) continue
if (element.getIdentifier() == null) continue // skip 'this' etc
if (element.getReceiverExpression() != null) continue
if (CallTypeAndReceiver.detect(element).receiver != null) continue
if (element.parent is JetThisExpression || element.parent is JetSuperExpression) continue // TODO: it's a bad design of PSI tree, we should change it
}
val fqName = descriptor.importableFqName ?: continue
@@ -106,6 +106,7 @@ public class KotlinImportOptimizer() : ImportOptimizer {
if (!target.isExtension) { // for non-extension targets, count only non-qualified simple name usages
if (element !is JetNameReferenceExpression) continue
if (CallTypeAndReceiver.detect(element).receiver != null) continue
if (element.parent is JetThisExpression || element.parent is JetSuperExpression) continue // TODO: it's a bad design of PSI tree, we should change it
}
val importableDescriptor = target.getImportableDescriptor()
@@ -0,0 +1,3 @@
package b
open class `super`
+19
View File
@@ -0,0 +1,19 @@
package a
import java.util.ArrayList
class A : b.`super`() {
fun f() {
this.f()
}
override fun getUsableSpace(): Long {
return super.getUsableSpace()
}
companion object {
fun g() {
this.g()
}
}
}
@@ -0,0 +1,17 @@
package a
class A : b.`super`() {
fun f() {
this.f()
}
override fun getUsableSpace(): Long {
return super.getUsableSpace()
}
companion object {
fun g() {
this.g()
}
}
}
@@ -209,6 +209,12 @@ public class OptimizeImportsTestGenerated extends AbstractOptimizeImportsTest {
doTest(fileName);
}
@TestMetadata("ThisAndSuper.kt")
public void testThisAndSuper() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/editor/optimizeImports/ThisAndSuper.kt");
doTest(fileName);
}
@TestMetadata("UnusedImports.kt")
public void testUnusedImports() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/editor/optimizeImports/UnusedImports.kt");