Extract Function: Support multiple output values

This commit is contained in:
Alexey Sedunov
2014-09-04 17:28:25 +04:00
parent 7a15a88288
commit 76433571f8
68 changed files with 1293 additions and 319 deletions
@@ -0,0 +1,19 @@
// WITH_RUNTIME
// PARAM_TYPES: A?, kotlin.Any?
// PARAM_TYPES: B, A
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: var a: A? defined in foo
// PARAM_DESCRIPTOR: value-parameter val b: B defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo<A: Any, B: A>(b: B): Int {
var a: A? = null
var c: Int = 1
<selection>a = b
c += 2
println(a)
println(c)</selection>
return a.hashCode() ?: 0 + c
}
@@ -0,0 +1,28 @@
// WITH_RUNTIME
// PARAM_TYPES: A?, kotlin.Any?
// PARAM_TYPES: B, A
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: var a: A? defined in foo
// PARAM_DESCRIPTOR: value-parameter val b: B defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo<A: Any, B: A>(b: B): Int {
var a: A? = null
var c: Int = 1
val pair = pair(a, b, c)
a = pair.first
c = pair.second
return a.hashCode() ?: 0 + c
}
private fun <A : Any, B : A> pair(a: A?, b: B, c: Int): Pair<A?, Int> {
var a1 = a
var c1 = c
a1 = b
c1 += 2
println(a1)
println(c1)
return Pair(a1, c1)
}
@@ -0,0 +1,11 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: var k: kotlin.Int defined in foo
// SIBLING:
fun foo() {
var k = 0
<selection>val a = 1
k++
val b = 2</selection>
println(a + b - k)
}
@@ -0,0 +1,20 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: var k: kotlin.Int defined in foo
// SIBLING:
fun foo() {
var k = 0
val triple = triple(k)
val a = triple.first
val b = triple.second
k = triple.third
println(a + b - k)
}
private fun triple(k: Int): Triple<Int, Int, Int> {
var k1 = k
val a = 1
k1++
val b = 2
return Triple(a, b, k1)
}
@@ -1,12 +0,0 @@
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
<selection>b += a
c -= a
println(b)
println(c)</selection>
return b
}
@@ -1 +0,0 @@
Selected code fragment has multiple output values: var b: Int var c: Int
@@ -1,16 +0,0 @@
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
<selection>if (a > 0) {
b += a
}
else {
c -= a
}
println(b)
println(c)</selection>
return b
}
@@ -1 +0,0 @@
Selected code fragment has multiple output values: var b: Int var c: Int
@@ -1,18 +0,0 @@
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
<selection>when {
a > 0 -> {
b += a
}
else -> {
c -= a
}
}
println(b)
println(c)</selection>
return b
}
@@ -1 +0,0 @@
Selected code fragment has multiple output values: var b: Int var c: Int
@@ -0,0 +1,18 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
val t = 1 + <selection>if (a > 0) {
b += a
a + 1
}
else a</selection>
return b + c
}
@@ -0,0 +1,24 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
val pair = pair(a, b)
b = pair.second
val t = 1 + pair.first
return b + c
}
private fun pair(a: Int, b: Int): Pair<Int, Int> {
var b1 = b
return Pair(if (a > 0) {
b1 += a
a + 1
} else a, b1)
}
@@ -0,0 +1,20 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
val t = <selection>if (a > 0) {
b += a
b
}
else {
a
}</selection>
println(b)
return t
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
val pair = pair(a, b)
b = pair.second
val t = pair.first
println(b)
return t
}
private fun pair(a: Int, b: Int): Pair<Int, Int> {
var b1 = b
return Pair(if (a > 0) {
b1 += a
b1
} else {
a
}, b1)
}
@@ -0,0 +1,13 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
<selection>b += a
println(b)
return b</selection>
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
return i(a, b)
}
private fun i(a: Int, b: Int): Int {
var b1 = b
b1 += a
println(b1)
return b1
}
@@ -0,0 +1,24 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 2
val t = <selection>if (a > 0) {
b += a
c -= b
b
}
else {
a
}</selection>
println(b + c)
return t
}
@@ -0,0 +1,32 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 2
val triple = triple(a, b, c)
b = triple.second
c = triple.third
val t = triple.first
println(b + c)
return t
}
private fun triple(a: Int, b: Int, c: Int): Triple<Int, Int, Int> {
var b1 = b
var c1 = c
return Triple(if (a > 0) {
b1 += a
c1 -= b1
b1
} else {
a
}, b1, c1)
}
@@ -0,0 +1,19 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
<selection>b += a
c -= a
println(b)
println(c)</selection>
return b + c
}
@@ -0,0 +1,28 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
val pair = pair(a, b, c)
b = pair.first
c = pair.second
return b + c
}
private fun pair(a: Int, b: Int, c: Int): Pair<Int, Int> {
var b1 = b
var c1 = c
b1 += a
c1 -= a
println(b1)
println(c1)
return Pair(b1, c1)
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
// SIBLING:
fun foo() {
<selection>val a = 1
val b = 2</selection>
println(a + b)
}
@@ -0,0 +1,14 @@
// WITH_RUNTIME
// SIBLING:
fun foo() {
val pair = pair()
val a = pair.first
val b = pair.second
println(a + b)
}
private fun pair(): Pair<Int, Int> {
val a = 1
val b = 2
return Pair(a, b)
}
@@ -0,0 +1,23 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
<selection>if (a > 0) {
b += a
}
else {
c -= a
}
println(b)
println(c)</selection>
return b + c
}
@@ -0,0 +1,31 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
val pair = pair(a, b, c)
b = pair.first
c = pair.second
return b + c
}
private fun pair(a: Int, b: Int, c: Int): Pair<Int, Int> {
var b1 = b
var c1 = c
if (a > 0) {
b1 += a
} else {
c1 -= a
}
println(b1)
println(c1)
return Pair(b1, c1)
}
@@ -0,0 +1,20 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
val pair = 2
<selection>b += a
c -= a
println(b)
println(c)</selection>
return b + c
}
@@ -0,0 +1,29 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
val pair = 2
val pair1 = pair(a, b, c)
b = pair1.first
c = pair1.second
return b + c
}
private fun pair(a: Int, b: Int, c: Int): Pair<Int, Int> {
var b1 = b
var c1 = c
b1 += a
c1 -= a
println(b1)
println(c1)
return Pair(b1, c1)
}
@@ -0,0 +1,25 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
<selection>when {
a > 0 -> {
b += a
}
else -> {
c -= a
}
}
println(b)
println(c)</selection>
return b + c
}
@@ -0,0 +1,34 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
val pair = pair(a, b, c)
b = pair.first
c = pair.second
return b + c
}
private fun pair(a: Int, b: Int, c: Int): Pair<Int, Int> {
var b1 = b
var c1 = c
when {
a > 0 -> {
b1 += a
}
else -> {
c1 -= a
}
}
println(b1)
println(c1)
return Pair(b1, c1)
}
@@ -0,0 +1,23 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
var d: Int = 1
var e: Int = 1
<selection>b += a
c -= a
d += c
e -= d
println(b)
println(c)</selection>
return b + c + d + e
}
@@ -0,0 +1 @@
Selected code fragment has more than 3 output values: var b: Int var c: Int var d: Int var e: Int
@@ -0,0 +1,28 @@
// WITH_RUNTIME
// OPTIONS: true, true
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var e: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
var d: Int = 1
var e: Int = 1
<selection>b += a
c -= a
d += c
e -= d
println(b)
println(c)</selection>
return b + c + d + e
}
@@ -0,0 +1,41 @@
// WITH_RUNTIME
// OPTIONS: true, true
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var e: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
var d: Int = 1
var e: Int = 1
val list = list(a, b, c, d, e)
b = list[0]
c = list[1]
d = list[2]
e = list[3]
return b + c + d + e
}
private fun list(a: Int, b: Int, c: Int, d: Int, e: Int): List<Int> {
var b1 = b
var c1 = c
var d1 = d
var e1 = e
b1 += a
c1 -= a
d1 += c1
e1 -= d1
println(b1)
println(c1)
return listOf(b1, c1, d1, e1)
}
@@ -0,0 +1,23 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
var d: Int = 1
<selection>b += a
c -= a
d += c
println(b)
println(c)</selection>
return b + c + d
}
@@ -0,0 +1,34 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
var d: Int = 1
val triple = triple(a, b, c, d)
b = triple.first
c = triple.second
d = triple.third
return b + c + d
}
private fun triple(a: Int, b: Int, c: Int, d: Int): Triple<Int, Int, Int> {
var b1 = b
var c1 = c
var d1 = d
b1 += a
c1 -= a
d1 += c1
println(b1)
println(c1)
return Triple(b1, c1, d1)
}
@@ -0,0 +1,19 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
<selection>b += a
c -= a
println(b)
println(c)</selection>
return b
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter val a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
b = i(a, b, c)
return b
}
private fun i(a: Int, b: Int, c: Int): Int {
var b1 = b
var c1 = c
b1 += a
c1 -= a
println(b1)
println(c1)
return b1
}