From 48968c0fe28501c95cd97bd2e914211a05713a52 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 15 Oct 2019 13:59:33 +0900 Subject: [PATCH] Replace deprecated symbol usage: do not include 'Companion' in import directives when importing companion object #KT-34078 Fixed --- .../kotlin/idea/codeInliner/CodeToInlineBuilder.kt | 10 +++++++++- .../imports/addImportForCompanionObject.after.kt | 13 +++++++++++++ ...addImportForCompanionObject.before.Dependency.kt | 7 +++++++ .../addImportForCompanionObject.before.Main.kt | 11 +++++++++++ .../imports/addImportForCompanionObject2.after.kt | 13 +++++++++++++ ...ddImportForCompanionObject2.before.Dependency.kt | 7 +++++++ .../addImportForCompanionObject2.before.Main.kt | 11 +++++++++++ .../quickfix/QuickFixMultiFileTestGenerated.java | 10 ++++++++++ 8 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.after.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Dependency.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Main.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.after.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Dependency.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Main.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeToInlineBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeToInlineBuilder.kt index e10df49bc54..74b8a0db2e5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeToInlineBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeToInlineBuilder.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess +import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver @@ -160,7 +161,14 @@ class CodeToInlineBuilder( //TODO: other types of references ('[]' etc) if (expression.canBeResolvedViaImport(target, bindingContext)) { - codeToInline.fqNamesToImport.add(target.importableFqName!!) + val importableFqName = if (target.isCompanionObject()) { + target.containingDeclaration?.importableFqName + } else { + target.importableFqName + } + if (importableFqName != null) { + codeToInline.fqNamesToImport.add(importableFqName) + } } if (expression.getReceiverExpression() == null) { diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.after.kt b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.after.kt new file mode 100644 index 00000000000..2141dedddce --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.after.kt @@ -0,0 +1,13 @@ +// "Replace with 'A.bar(x)'" "true" + +package test + +import a.A + +@Deprecated("bla", ReplaceWith("A.bar(x)", "a.A")) +fun foo(x: Any) { +} + +fun test() { + A.bar(1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Dependency.kt b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Dependency.kt new file mode 100644 index 00000000000..7fc11b34402 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Dependency.kt @@ -0,0 +1,7 @@ +package a + +class A { + companion object { + fun bar(x: Any) {} + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Main.kt b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Main.kt new file mode 100644 index 00000000000..3e285843d39 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Main.kt @@ -0,0 +1,11 @@ +// "Replace with 'A.bar(x)'" "true" + +package test + +@Deprecated("bla", ReplaceWith("A.bar(x)", "a.A")) +fun foo(x: Any) { +} + +fun test() { + foo(1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.after.kt b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.after.kt new file mode 100644 index 00000000000..2141dedddce --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.after.kt @@ -0,0 +1,13 @@ +// "Replace with 'A.bar(x)'" "true" + +package test + +import a.A + +@Deprecated("bla", ReplaceWith("A.bar(x)", "a.A")) +fun foo(x: Any) { +} + +fun test() { + A.bar(1) +} \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Dependency.kt b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Dependency.kt new file mode 100644 index 00000000000..26f55a6ef14 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Dependency.kt @@ -0,0 +1,7 @@ +package a + +class A { + companion object F { + fun bar(x: Any) {} + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Main.kt b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Main.kt new file mode 100644 index 00000000000..3e285843d39 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Main.kt @@ -0,0 +1,11 @@ +// "Replace with 'A.bar(x)'" "true" + +package test + +@Deprecated("bla", ReplaceWith("A.bar(x)", "a.A")) +fun foo(x: Any) { +} + +fun test() { + foo(1) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 54c31e7483e..96033d4016e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -2555,6 +2555,16 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes KotlinTestUtils.runTest(this::doTestWithExtraFile, TargetBackend.ANY, testDataFilePath); } + @TestMetadata("addImportForCompanionObject.before.Main.kt") + public void testAddImportForCompanionObject() throws Exception { + runTest("idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject.before.Main.kt"); + } + + @TestMetadata("addImportForCompanionObject2.before.Main.kt") + public void testAddImportForCompanionObject2() throws Exception { + runTest("idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForCompanionObject2.before.Main.kt"); + } + @TestMetadata("addImportForOperator.before.Main.kt") public void testAddImportForOperator() throws Exception { runTest("idea/testData/quickfix/deprecatedSymbolUsage/imports/addImportForOperator.before.Main.kt");