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.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<KtElement>()
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()
@@ -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);
}
@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");