Create from Usage: Fix rendering of receiver type reference

#KT-9559 Fixed
This commit is contained in:
Alexey Sedunov
2015-10-16 14:09:39 +03:00
parent c2c8eccc77
commit 84aa4e7664
10 changed files with 79 additions and 7 deletions
@@ -61,6 +61,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.psi.typeRefHelpers.setReceiverTypeReference
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -640,13 +641,10 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
val typeRefsToShorten = ArrayList<KtElement>() val typeRefsToShorten = ArrayList<KtElement>()
if (config.isExtension) { if (config.isExtension) {
val receiverTypeRef = KtPsiFactory(declaration).createType(receiverTypeCandidate!!.theType.renderLong(typeParameterNameMap)) val receiverTypeText = receiverTypeCandidate!!.theType.renderLong(typeParameterNameMap)
replaceWithLongerName(receiverTypeRef, receiverTypeCandidate.theType) val replacingTypeRef = KtPsiFactory(declaration).createType(receiverTypeText)
val newTypeRef = (declaration as KtCallableDeclaration).setReceiverTypeReference(replacingTypeRef)!!
val funcReceiverTypeRef = (declaration as? KtCallableDeclaration)?.getReceiverTypeReference() typeRefsToShorten.add(newTypeRef)
if (funcReceiverTypeRef != null) {
typeRefsToShorten.add(funcReceiverTypeRef)
}
} }
val returnTypeRef = declaration.getReturnTypeReference() val returnTypeRef = declaration.getReturnTypeReference()
@@ -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.
}
@@ -0,0 +1,3 @@
package package1
class A
@@ -0,0 +1,3 @@
package package2
class A
@@ -0,0 +1,11 @@
// "Create extension function 'foo'" "true"
// ERROR: Unresolved reference: foo
import package1.A
class X {
init {
val y = package2.A()
y.<caret>foo()
}
}
@@ -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
}
}
@@ -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.<caret>foo
}
}
@@ -715,6 +715,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
doTestWithExtraFile(fileName); 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") @TestMetadata("funOnGroovyType.before.Main.kt")
public void testFunOnGroovyType() throws Exception { public void testFunOnGroovyType() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/funOnGroovyType.before.Main.kt"); 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); 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") @TestMetadata("extensionValOnGroovyType.before.Main.kt")
public void testExtensionValOnGroovyType() throws Exception { public void testExtensionValOnGroovyType() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/extensionValOnGroovyType.before.Main.kt"); String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/extensionValOnGroovyType.before.Main.kt");