From 5da192ddd4a9a3fdfc34de68318a9df1fce823db Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 19 May 2015 15:02:46 +0300 Subject: [PATCH] DeprecatedSymbolUsageFix - fixed bug with usage in derived class --- .../idea/quickfix/DeprecatedSymbolUsageFix.kt | 8 +++++++- .../deprecatedSymbolUsage/usageInDerivedClass.kt | 14 ++++++++++++++ .../usageInDerivedClass.kt.after | 14 ++++++++++++++ .../usageInDerivedClassGeneric.kt | 14 ++++++++++++++ .../usageInDerivedClassGeneric.kt.after | 14 ++++++++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 12 ++++++++++++ 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt.after create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageFix.kt index 0f7eef1a723..d6e4c4b9c7c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageFix.kt @@ -24,6 +24,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.PsiRecursiveElementVisitor import org.jetbrains.kotlin.analyzer.analyzeInContext +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor @@ -102,8 +103,13 @@ public class DeprecatedSymbolUsageFix( explicitReceiver?.putCopyableUserData(FROM_THIS_KEY, Unit) //TODO: infix and operator calls + val originalDescriptor = (if (descriptor is CallableMemberDescriptor) + DescriptorUtils.unwrapFakeOverride(descriptor) + else + descriptor).getOriginal() + var (expression, imports, parameterUsages) = ReplaceWithAnnotationAnalyzer.analyze( - replaceWith, descriptor.getOriginal(), element.getResolutionFacade(), file, project) + replaceWith, originalDescriptor, element.getResolutionFacade(), file, project) //TODO: implicit receiver is not always "this" //TODO: this@ diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt b/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt new file mode 100644 index 00000000000..adef10e4f2b --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt @@ -0,0 +1,14 @@ +// "Replace with 'newFun(s)'" "true" + +open class Base { + @deprecated("", ReplaceWith("newFun(s)")) + fun oldFun(s: String){} + + fun newFun(s: String){} +} + +class Derived : Base() { + fun foo() { + oldFun("a") + } +} diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt.after b/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt.after new file mode 100644 index 00000000000..8e27b7b0d83 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt.after @@ -0,0 +1,14 @@ +// "Replace with 'newFun(s)'" "true" + +open class Base { + @deprecated("", ReplaceWith("newFun(s)")) + fun oldFun(s: String){} + + fun newFun(s: String){} +} + +class Derived : Base() { + fun foo() { + newFun("a") + } +} diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt b/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt new file mode 100644 index 00000000000..0682132fb72 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt @@ -0,0 +1,14 @@ +// "Replace with 'newFun(t, k)'" "true" + +open class Base { + @deprecated("", ReplaceWith("newFun(t, k)")) + fun oldFun(t: T, k: K) = k + + fun newFun(t: T, k: K) = k +} + +class Derived : Base() { + fun foo() { + oldFun("a", 1) + } +} diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt.after b/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt.after new file mode 100644 index 00000000000..c359d6a3644 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt.after @@ -0,0 +1,14 @@ +// "Replace with 'newFun(t, k)'" "true" + +open class Base { + @deprecated("", ReplaceWith("newFun(t, k)")) + fun oldFun(t: T, k: K) = k + + fun newFun(t: T, k: K) = k +} + +class Derived : Base() { + fun foo() { + newFun("a", 1) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 81bc0ecf159..cf0493f59d3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3093,6 +3093,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/twoValuesCombined.kt"); doTest(fileName); } + + @TestMetadata("usageInDerivedClass.kt") + public void testUsageInDerivedClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClass.kt"); + doTest(fileName); + } + + @TestMetadata("usageInDerivedClassGeneric.kt") + public void testUsageInDerivedClassGeneric() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/usageInDerivedClassGeneric.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/expressions")