Extract Function: Add support for member extension functions

This commit is contained in:
Alexey Sedunov
2015-11-27 15:37:08 +03:00
parent 6abf13be41
commit 39b46bb3ef
3 changed files with 25 additions and 13 deletions
@@ -307,7 +307,7 @@ private fun suggestParameterType(
private fun isMemberExtensionFunction(resolvedCall: ResolvedCall<*>, ref: KtSimpleNameExpression): Boolean { private fun isMemberExtensionFunction(resolvedCall: ResolvedCall<*>, ref: KtSimpleNameExpression): Boolean {
// TODO temporary hack because we couldn't correctly extract member extension function with two explicit receivers // TODO temporary hack because we couldn't correctly extract member extension function with two explicit receivers
if (ref.parent !is KtCallExpression || ref.parent.parent !is KtQualifiedExpression) return false if (ref.parent !is KtCallExpression) return false
val resultingDescriptor = resolvedCall.resultingDescriptor val resultingDescriptor = resolvedCall.resultingDescriptor
return resultingDescriptor is FunctionDescriptor && resolvedCall.extensionReceiver != ReceiverValue.NO_RECEIVER && resolvedCall.dispatchReceiver != ReceiverValue.NO_RECEIVER return resultingDescriptor is FunctionDescriptor && resolvedCall.extensionReceiver != ReceiverValue.NO_RECEIVER && resolvedCall.dispatchReceiver != ReceiverValue.NO_RECEIVER
@@ -19,23 +19,35 @@ Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socke
extensionMemberFunction.kt:13 extensionMemberFunction.kt:13
Compile bytecode for extClass.testPublic() Compile bytecode for extClass.testPublic()
extensionMemberFunction.kt:19 extensionMemberFunction.kt:19
Compile bytecode for testPublic()
extensionMemberFunction.kt:25 extensionMemberFunction.kt:25
Compile bytecode for extClass.testPrivate() Compile bytecode for extClass.testPrivate()
extensionMemberFunction.kt:31 extensionMemberFunction.kt:31
Compile bytecode for testPrivate()
extensionMemberFunction.kt:41 extensionMemberFunction.kt:41
Compile bytecode for testPublic()
extensionMemberFunction.kt:46 extensionMemberFunction.kt:46
Compile bytecode for this.testPublic()
extensionMemberFunction.kt:51 extensionMemberFunction.kt:51
Compile bytecode for testPrivate()
extensionMemberFunction.kt:56 extensionMemberFunction.kt:56
Compile bytecode for this.testPrivate()
extensionMemberFunction.kt:70 extensionMemberFunction.kt:70
Compile bytecode for extClass.testCompPublic() Compile bytecode for extClass.testCompPublic()
extensionMemberFunction.kt:76 extensionMemberFunction.kt:76
Compile bytecode for testCompPublic()
extensionMemberFunction.kt:82 extensionMemberFunction.kt:82
Compile bytecode for extClass.testCompPrivate() Compile bytecode for extClass.testCompPrivate()
extensionMemberFunction.kt:88 extensionMemberFunction.kt:88
Compile bytecode for testCompPrivate()
extensionMemberFunction.kt:98 extensionMemberFunction.kt:98
Compile bytecode for testCompPublic()
extensionMemberFunction.kt:103 extensionMemberFunction.kt:103
Compile bytecode for this.testCompPublic()
extensionMemberFunction.kt:108 extensionMemberFunction.kt:108
Compile bytecode for testCompPrivate()
extensionMemberFunction.kt:113 extensionMemberFunction.kt:113
Compile bytecode for this.testCompPrivate()
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket' Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0 Process finished with exit code 0
@@ -14,7 +14,7 @@ class MemberClass {
with(extClass) { with(extClass) {
// EXPRESSION: testPublic() // EXPRESSION: testPublic()
// RESULT: Following declarations are unavailable in debug scope: testPublic // RESULT: 1: I
//Breakpoint! //Breakpoint!
testPublic() testPublic()
} }
@@ -26,7 +26,7 @@ class MemberClass {
with(extClass) { with(extClass) {
// EXPRESSION: testPrivate() // EXPRESSION: testPrivate()
// RESULT: Following declarations are unavailable in debug scope: testPrivate // RESULT: 1: I
//Breakpoint! //Breakpoint!
testPrivate() testPrivate()
} }
@@ -36,22 +36,22 @@ class MemberClass {
fun ExtClass.testExtMember() { fun ExtClass.testExtMember() {
// EXPRESSION: testPublic() // EXPRESSION: testPublic()
// RESULT: Following declarations are unavailable in debug scope: testPublic // RESULT: 1: I
//Breakpoint! //Breakpoint!
testPublic() testPublic()
// EXPRESSION: this.testPublic() // EXPRESSION: this.testPublic()
// RESULT: A receiver of type extensionMemberFunction.ExtClass is required // RESULT: 1: I
//Breakpoint! //Breakpoint!
this.testPublic() this.testPublic()
// EXPRESSION: testPrivate() // EXPRESSION: testPrivate()
// RESULT: Following declarations are unavailable in debug scope: testPrivate // RESULT: 1: I
//Breakpoint! //Breakpoint!
testPrivate() testPrivate()
// EXPRESSION: this.testPrivate() // EXPRESSION: this.testPrivate()
// RESULT: A receiver of type extensionMemberFunction.ExtClass is required // RESULT: 1: I
//Breakpoint! //Breakpoint!
this.testPrivate() this.testPrivate()
} }
@@ -71,7 +71,7 @@ class MemberClass {
with(extClass) { with(extClass) {
// EXPRESSION: testCompPublic() // EXPRESSION: testCompPublic()
// RESULT: Following declarations are unavailable in debug scope: testCompPublic // RESULT: 1: I
//Breakpoint! //Breakpoint!
testCompPublic() testCompPublic()
} }
@@ -83,7 +83,7 @@ class MemberClass {
with(extClass) { with(extClass) {
// EXPRESSION: testCompPrivate() // EXPRESSION: testCompPrivate()
// RESULT: Following declarations are unavailable in debug scope: testCompPrivate // RESULT: 1: I
//Breakpoint! //Breakpoint!
testCompPrivate() testCompPrivate()
} }
@@ -93,22 +93,22 @@ class MemberClass {
fun ExtClass.testExtCompanion() { fun ExtClass.testExtCompanion() {
// EXPRESSION: testCompPublic() // EXPRESSION: testCompPublic()
// RESULT: Following declarations are unavailable in debug scope: testCompPublic // RESULT: 1: I
//Breakpoint! //Breakpoint!
testCompPublic() testCompPublic()
// EXPRESSION: this.testCompPublic() // EXPRESSION: this.testCompPublic()
// RESULT: A receiver of type extensionMemberFunction.ExtClass is required // RESULT: 1: I
//Breakpoint! //Breakpoint!
this.testCompPublic() this.testCompPublic()
// EXPRESSION: testCompPrivate() // EXPRESSION: testCompPrivate()
// RESULT: Following declarations are unavailable in debug scope: testCompPrivate // RESULT: 1: I
//Breakpoint! //Breakpoint!
testCompPrivate() testCompPrivate()
// EXPRESSION: this.testCompPrivate() // EXPRESSION: this.testCompPrivate()
// RESULT: A receiver of type extensionMemberFunction.ExtClass is required // RESULT: 1: I
//Breakpoint! //Breakpoint!
this.testCompPrivate() this.testCompPrivate()
} }