From 84aa4e766415c9163a57ee03e6ffa90c310fc4e6 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 16 Oct 2015 14:09:39 +0300 Subject: [PATCH] Create from Usage: Fix rendering of receiver type reference #KT-9559 Fixed --- .../callableBuilder/CallableBuilder.kt | 12 +++++------- .../extensionFunOnTypeFromAnotherPackage.after.kt | 15 +++++++++++++++ ...tensionFunOnTypeFromAnotherPackage.before.1.kt | 3 +++ ...tensionFunOnTypeFromAnotherPackage.before.2.kt | 3 +++ ...sionFunOnTypeFromAnotherPackage.before.Main.kt | 11 +++++++++++ ...nsionPropertyOnTypeFromAnotherPackage.after.kt | 13 +++++++++++++ ...onPropertyOnTypeFromAnotherPackage.before.1.kt | 3 +++ ...onPropertyOnTypeFromAnotherPackage.before.2.kt | 3 +++ ...ropertyOnTypeFromAnotherPackage.before.Main.kt | 11 +++++++++++ .../quickfix/QuickFixMultiFileTestGenerated.java | 12 ++++++++++++ 10 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.after.kt create mode 100644 idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.1.kt create mode 100644 idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.2.kt create mode 100644 idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.Main.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.after.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.1.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.2.kt create mode 100644 idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.Main.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 5bde60ad2c2..3570f1abb28 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -61,6 +61,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.psi.typeRefHelpers.setReceiverTypeReference import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -640,13 +641,10 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { val typeRefsToShorten = ArrayList() if (config.isExtension) { - val receiverTypeRef = KtPsiFactory(declaration).createType(receiverTypeCandidate!!.theType.renderLong(typeParameterNameMap)) - replaceWithLongerName(receiverTypeRef, receiverTypeCandidate.theType) - - val funcReceiverTypeRef = (declaration as? KtCallableDeclaration)?.getReceiverTypeReference() - if (funcReceiverTypeRef != null) { - typeRefsToShorten.add(funcReceiverTypeRef) - } + val receiverTypeText = receiverTypeCandidate!!.theType.renderLong(typeParameterNameMap) + val replacingTypeRef = KtPsiFactory(declaration).createType(receiverTypeText) + val newTypeRef = (declaration as KtCallableDeclaration).setReceiverTypeReference(replacingTypeRef)!! + typeRefsToShorten.add(newTypeRef) } val returnTypeRef = declaration.getReturnTypeReference() diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.after.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.after.kt new file mode 100644 index 00000000000..d3805eb895b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.after.kt @@ -0,0 +1,15 @@ +// "Create extension function 'foo'" "true" +// ERROR: Unresolved reference: foo + +import package1.A + +class X { + init { + val y = package2.A() + y.foo() + } +} + +fun package2.A.foo() { + throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. +} diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.1.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.1.kt new file mode 100644 index 00000000000..d0bfd973328 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.1.kt @@ -0,0 +1,3 @@ +package package1 + +class A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.2.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.2.kt new file mode 100644 index 00000000000..f784d45c85a --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.2.kt @@ -0,0 +1,3 @@ +package package2 + +class A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.Main.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.Main.kt new file mode 100644 index 00000000000..bd2c0a42296 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.Main.kt @@ -0,0 +1,11 @@ +// "Create extension function 'foo'" "true" +// ERROR: Unresolved reference: foo + +import package1.A + +class X { + init { + val y = package2.A() + y.foo() + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.after.kt b/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.after.kt new file mode 100644 index 00000000000..0468f6b72be --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.after.kt @@ -0,0 +1,13 @@ +// "Create extension property 'foo'" "true" +// ERROR: Unresolved reference: foo + +import package1.A + +val package2.A.foo: Any + +class X { + init { + val y = package2.A() + val foo = y.foo + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.1.kt b/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.1.kt new file mode 100644 index 00000000000..d0bfd973328 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.1.kt @@ -0,0 +1,3 @@ +package package1 + +class A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.2.kt b/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.2.kt new file mode 100644 index 00000000000..f784d45c85a --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.2.kt @@ -0,0 +1,3 @@ +package package2 + +class A \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.Main.kt b/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.Main.kt new file mode 100644 index 00000000000..5cde179a260 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.Main.kt @@ -0,0 +1,11 @@ +// "Create extension property 'foo'" "true" +// ERROR: Unresolved reference: foo + +import package1.A + +class X { + init { + val y = package2.A() + val foo = y.foo + } +} \ 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 74f1e48e31e..e91634c49b6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -715,6 +715,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes doTestWithExtraFile(fileName); } + @TestMetadata("extensionFunOnTypeFromAnotherPackage.before.Main.kt") + public void testExtensionFunOnTypeFromAnotherPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/extensionFunOnTypeFromAnotherPackage.before.Main.kt"); + doTestWithExtraFile(fileName); + } + @TestMetadata("funOnGroovyType.before.Main.kt") public void testFunOnGroovyType() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/funOnGroovyType.before.Main.kt"); @@ -851,6 +857,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/createFromUsage/createVariable/property"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), true); } + @TestMetadata("extensionPropertyOnTypeFromAnotherPackage.before.Main.kt") + public void testExtensionPropertyOnTypeFromAnotherPackage() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/extensionPropertyOnTypeFromAnotherPackage.before.Main.kt"); + doTestWithExtraFile(fileName); + } + @TestMetadata("extensionValOnGroovyType.before.Main.kt") public void testExtensionValOnGroovyType() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/extensionValOnGroovyType.before.Main.kt");