From 937f243046cb495810c7921d5b4ad4056b40e748 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 28 Aug 2015 22:10:03 +0300 Subject: [PATCH] DeprecatedSymbolUsageInWholeProjectFix removes imports too --- .../DeprecatedSymbolUsageInWholeProjectFix.kt | 17 +++++++++++++++++ .../wholeProject/function.after.1.kt | 1 - .../wholeProject/function.after.kt | 1 - .../wholeProject/property.after.Declarations.kt | 2 ++ .../wholeProject/property.after.kt | 4 +++- .../property.before.Declarations.kt | 2 ++ .../wholeProject/property.before.Main.kt | 3 ++- 7 files changed, 26 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageInWholeProjectFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageInWholeProjectFix.kt index 520642729b5..8f59e837c57 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageInWholeProjectFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageInWholeProjectFix.kt @@ -31,15 +31,18 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.core.targetDescriptors import org.jetbrains.kotlin.idea.references.JetSimpleNameReference import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.stubindex.JetSourceFilterScope import org.jetbrains.kotlin.idea.util.application.executeCommand import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runWriteAction +import org.jetbrains.kotlin.psi.JetImportDirective import org.jetbrains.kotlin.psi.JetNamedFunction import org.jetbrains.kotlin.psi.JetProperty import org.jetbrains.kotlin.psi.JetSimpleNameExpression +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.NameShortness import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy @@ -95,9 +98,21 @@ public class DeprecatedSymbolUsageInWholeProjectFix( UIUtil.invokeLaterIfNeeded { project.executeCommand(getText()) { runWriteAction { + // we should delete imports later to not affect other usages + val importsToDelete = arrayListOf() + for (usage in usages) { try { if (!usage.isValid()) continue // TODO: nested calls + + val importDirective = usage.getStrictParentOfType() + if (importDirective != null) { + if (!importDirective.isAllUnder && importDirective.targetDescriptors().size() == 1) { + importsToDelete.add(importDirective) + } + continue + } + val bindingContext = usage.analyze(BodyResolveMode.PARTIAL) val resolvedCall = usage.getResolvedCall(bindingContext) ?: continue if (!resolvedCall.getStatus().isSuccess()) continue @@ -108,6 +123,8 @@ public class DeprecatedSymbolUsageInWholeProjectFix( LOG.error(e) } } + + importsToDelete.forEach { it.delete() } } } } diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/function.after.1.kt b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/function.after.1.kt index dac7a22446f..1f9ae831f06 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/function.after.1.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/function.after.1.kt @@ -1,5 +1,4 @@ import newPack.newFun -import pack.oldFun fun x() { newFun(1 + 1) diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/function.after.kt b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/function.after.kt index a6af62825fc..888f40018b5 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/function.after.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/function.after.kt @@ -1,7 +1,6 @@ // "Replace usages of 'oldFun(Int): Unit' in whole project" "true" import newPack.newFun -import pack.oldFun fun foo() { newFun(0 + 1) diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.after.Declarations.kt b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.after.Declarations.kt index e8143bfff49..233a2638763 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.after.Declarations.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.after.Declarations.kt @@ -3,6 +3,8 @@ package pack @deprecated("", ReplaceWith("newProp")) val oldProp: String = "" +val String.oldProp: String get() = "" + val newProp: String = "" fun foo(s: String){} diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.after.kt b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.after.kt index 0b4550b47e6..6b9a81ab160 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.after.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.after.kt @@ -1,6 +1,8 @@ // "Replace usages of 'oldProp: String' in whole project" "true" -import pack.* +import pack.oldProp +import pack.foo +import pack.newProp fun foo() { foo(newProp) diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.before.Declarations.kt b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.before.Declarations.kt index e8143bfff49..233a2638763 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.before.Declarations.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.before.Declarations.kt @@ -3,6 +3,8 @@ package pack @deprecated("", ReplaceWith("newProp")) val oldProp: String = "" +val String.oldProp: String get() = "" + val newProp: String = "" fun foo(s: String){} diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.before.Main.kt b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.before.Main.kt index 129f7ecd2af..e50891d51f2 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.before.Main.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/wholeProject/property.before.Main.kt @@ -1,6 +1,7 @@ // "Replace usages of 'oldProp: String' in whole project" "true" -import pack.* +import pack.oldProp +import pack.foo fun foo() { foo(oldProp)