Push Down: Support moving members from Java to Kotlin class

#KT-9485 Fixed
This commit is contained in:
Alexey Sedunov
2016-09-22 20:19:36 +03:00
parent 924bb44862
commit 956c6eeec7
67 changed files with 604 additions and 161 deletions
@@ -0,0 +1,24 @@
abstract class <caret>A {
// INFO: {"checked": "true"}
abstract val y: Boolean
// INFO: {"checked": "true", "toAbstract": "true"}
val z: Int = 1
// INFO: {"checked": "true"}
abstract fun foo(n: Int, m: Int)
// INFO: {"checked": "true", "toAbstract": "true"}
fun foo(b: Boolean) = !b
}
class B : A {
val x: Int = 2
val y: Boolean get() = x > 0
val z: Int = 3
fun foo(n: Int) = n + 2
fun foo(n: Int, m: Int) = n + m
fun foo(b: Boolean) = true
}
@@ -0,0 +1,4 @@
Function 'fun foo(Boolean): Boolean' in class B will override corresponding member of class A after refactoring
Function 'fun foo(Int, Int): Int' in class B will override corresponding member of class A after refactoring
Property 'val y: Boolean' in class B will override corresponding member of class A after refactoring
Property 'val z: Int' in class B will override corresponding member of class A after refactoring
@@ -0,0 +1,32 @@
abstract class <caret>A {
// INFO: {"checked": "true"}
open val x: Int = 1
// INFO: {"checked": "true"}
abstract val y: Boolean
// INFO: {"checked": "true", "toAbstract": "true"}
open val z: Int = 1
// INFO: {"checked": "true"}
open fun foo(n: Int) = n + 1
// INFO: {"checked": "true"}
abstract fun foo(n: Int, m: Int)
// INFO: {"checked": "true", "toAbstract": "true"}
open fun foo(b: Boolean) = !b
// INFO: {"checked": "true"}
class X
}
class B : A {
override val x: Int = 2
override val y: Boolean get() = x > 0
override val z: Int = 3
override fun foo(n: Int) = n + 2
override fun foo(n: Int, m: Int) = n + m
override fun foo(b: Boolean) = true
class X
}
@@ -0,0 +1,3 @@
Class B already contains function 'fun foo(Int): Int'
Class B already contains nested class named X
Class B already contains property 'val x: Int'
@@ -0,0 +1,6 @@
open class <caret>A {
// INFO: {"checked": "true"}
val x: Int
}
interface I : A
@@ -0,0 +1,2 @@
Interface I inherits from class A.
It won't be affected by the refactoring
@@ -0,0 +1,30 @@
open class A {
open fun foo(n: Int) {
}
open fun bar(n: Int) {
}
}
open class <caret>B : A() {
// INFO: {"checked": "true"}
fun foo() {
super.foo(1)
super.bar(1)
}
// INFO: {"checked": "true"}
override fun foo(n: Int) {
}
override fun bar(n: Int) {
}
}
class C : B() {
}
@@ -0,0 +1 @@
Pushed member won't be available in 'super.bar(1)'
@@ -0,0 +1,10 @@
open class A {
// INFO: {"checked": "true", "toAbstract": "true"}
protected open fun foo() {
}
}
class B : A() {
}
@@ -0,0 +1,12 @@
open class A {
// INFO: {"checked": "true", "toAbstract": "true"}
protected abstract fun foo()
}
class B : A() {
// INFO: {"checked": "true", "toAbstract": "true"}
override fun foo() {
}
}
+8
View File
@@ -0,0 +1,8 @@
class <caret>A {
// INFO: {"checked": "true"}
val x = 1
// INFO: {"checked": "true"}
fun foo() {
}
}
@@ -0,0 +1,2 @@
Cannot perform refactoring.
Class <b><code>A</code></b> is final
@@ -0,0 +1,12 @@
class X {
open class <caret>A {
// INFO: {"checked": "true"}
fun foo(): Int = bar() + A.bar() + X.A.bar()
companion object {
fun bar() = 1
}
}
}
class B : X.A
@@ -0,0 +1,13 @@
class X {
open class A {
companion object {
fun bar() = 1
}
}
}
class B : X.A {
// INFO: {"checked": "true"}
fun foo(): Int = bar() + bar() + bar()
}
+12
View File
@@ -0,0 +1,12 @@
open class <caret>A {
// INFO: {"checked": "true", "toAbstract": "true"}
private open fun foo() {
}
inner class B : A() {
override fun foo() {
}
}
}
@@ -0,0 +1,10 @@
open class A {
// INFO: {"checked": "true", "toAbstract": "true"}
protected abstract fun foo()
inner class B : A() {
override fun foo() {
}
}
}
+4
View File
@@ -0,0 +1,4 @@
class A {
val x: Int = 1
}
@@ -0,0 +1,2 @@
Cannot perform refactoring.
Caret should be positioned inside a class to push members from
@@ -0,0 +1,8 @@
object <caret>O {
// INFO: {"checked": "true"}
val x = 1
// INFO: {"checked": "true"}
fun foo() {
}
}
@@ -0,0 +1,2 @@
Cannot perform refactoring.
Object <b><code>O</code></b> is final
@@ -0,0 +1,3 @@
fun <caret>test() {
}
@@ -0,0 +1,2 @@
Cannot perform refactoring.
Caret should be positioned inside a class to push members from
@@ -0,0 +1,34 @@
abstract class <caret>A {
// INFO: {"checked": "true"}
val x = 1
// INFO: {"checked": "true"}
val y: Int get() = 2
// INFO: {"checked": "true"}
val z: Int by lazy { 3 }
// INFO: {"checked": "true"}
abstract val t: Int
// INFO: {"checked": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true"}
abstract fun bar(s: String)
// INFO: {"checked": "true"}
inner class X {
}
// INFO: {"checked": "true"}
class Y {
}
}
abstract class B : A() {
}
class C : A() {
override val t = 1
override fun bar(s: String) = s.length()
}
@@ -0,0 +1,55 @@
abstract class A {
}
abstract class B : A() {
// INFO: {"checked": "true"}
val x = 1
// INFO: {"checked": "true"}
val y: Int get() = 2
// INFO: {"checked": "true"}
val z: Int by lazy { 3 }
// INFO: {"checked": "true"}
abstract val t: Int
// INFO: {"checked": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true"}
abstract fun bar(s: String)
// INFO: {"checked": "true"}
inner class X {
}
// INFO: {"checked": "true"}
class Y {
}
}
class C : A() {
val t = 1
// INFO: {"checked": "true"}
val x = 1
// INFO: {"checked": "true"}
val y: Int get() = 2
// INFO: {"checked": "true"}
val z: Int by lazy { 3 }
fun bar(s: String) = s.length()
// INFO: {"checked": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true"}
inner class X {
}
// INFO: {"checked": "true"}
class Y {
}
}
@@ -0,0 +1,34 @@
abstract class <caret>A {
// INFO: {"checked": "true", "toAbstract": "true"}
val x = 1
// INFO: {"checked": "true", "toAbstract": "true"}
val y: Int get() = 2
// INFO: {"checked": "true", "toAbstract": "true"}
val z: Int by lazy { 3 }
// INFO: {"checked": "true", "toAbstract": "true"}
abstract val t: Int
// INFO: {"checked": "true", "toAbstract": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true", "toAbstract": "true"}
abstract fun bar(s: String)
// INFO: {"checked": "true", "toAbstract": "true"}
inner class X {
}
// INFO: {"checked": "true", "toAbstract": "true"}
class Y {
}
}
abstract class B : A() {
}
class C : A() {
override val t = 1
override fun bar(s: String) = s.length()
}
@@ -0,0 +1,64 @@
abstract class A {
// INFO: {"checked": "true", "toAbstract": "true"}
abstract val x: Int
// INFO: {"checked": "true", "toAbstract": "true"}
abstract val y: Int
// INFO: {"checked": "true", "toAbstract": "true"}
abstract val z: Int
// INFO: {"checked": "true", "toAbstract": "true"}
abstract fun foo(n: Int): Boolean
}
abstract class B : A() {
// INFO: {"checked": "true", "toAbstract": "true"}
override val x = 1
// INFO: {"checked": "true", "toAbstract": "true"}
override val y: Int get() = 2
// INFO: {"checked": "true", "toAbstract": "true"}
override val z: Int by lazy { 3 }
// INFO: {"checked": "true", "toAbstract": "true"}
abstract val t: Int
// INFO: {"checked": "true", "toAbstract": "true"}
override fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true", "toAbstract": "true"}
abstract fun bar(s: String)
// INFO: {"checked": "true", "toAbstract": "true"}
inner class X {
}
// INFO: {"checked": "true", "toAbstract": "true"}
class Y {
}
}
class C : A() {
val t = 1
// INFO: {"checked": "true", "toAbstract": "true"}
override val x = 1
// INFO: {"checked": "true", "toAbstract": "true"}
override val y: Int get() = 2
// INFO: {"checked": "true", "toAbstract": "true"}
override val z: Int by lazy { 3 }
fun bar(s: String) = s.length()
// INFO: {"checked": "true", "toAbstract": "true"}
override fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true", "toAbstract": "true"}
inner class X {
}
// INFO: {"checked": "true", "toAbstract": "true"}
class Y {
}
}
@@ -0,0 +1,29 @@
interface Z<T>
open class <caret>A<T> {
// INFO: {"checked": "true"}
val t1: T
// INFO: {"checked": "true"}
val t2: Z<T>
// INFO: {"checked": "true"}
fun <S> foo(t1: T, t2: Z<T>, s1: S, s2: Z<S>): Boolean = true
// INFO: {"checked": "true"}
inner class X : Z<T> {
}
// INFO: {"checked": "true"}
class Y<U> : Z<U> {
}
}
class B<S> : A<Z<S>>() {
}
class C<K> : A<B<K>>() {
}
@@ -0,0 +1,47 @@
interface Z<T>
open class A<T> {
}
class B<S> : A<Z<S>>() {
// INFO: {"checked": "true"}
val t1: Z<S>
// INFO: {"checked": "true"}
val t2: Z<Z<S>>
// INFO: {"checked": "true"}
fun <S> foo(t1: Z<S>, t2: Z<Z<S>>, s1: S, s2: Z<S>): Boolean = true
// INFO: {"checked": "true"}
inner class X : Z<Z<S>> {
}
// INFO: {"checked": "true"}
class Y<U> : Z<U> {
}
}
class C<K> : A<B<K>>() {
// INFO: {"checked": "true"}
val t1: B<K>
// INFO: {"checked": "true"}
val t2: Z<B<K>>
// INFO: {"checked": "true"}
fun <S> foo(t1: B<K>, t2: Z<B<K>>, s1: S, s2: Z<S>): Boolean = true
// INFO: {"checked": "true"}
inner class X : Z<B<K>> {
}
// INFO: {"checked": "true"}
class Y<U> : Z<U> {
}
}
@@ -0,0 +1,31 @@
interface <caret>I {
// INFO: {"checked": "true"}
val x: Int get() = 2
// INFO: {"checked": "true"}
val y: Int
// INFO: {"checked": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true"}
fun bar(s: String)
// INFO: {"checked": "true"}
class Y {
}
}
abstract class A : I
class B : I {
override val y = 1
override fun bar(s: String) = s.length()
}
interface J : I
interface K : I {
override val y: Int get() = 1
override fun bar(s: String) = s.length()
}
@@ -0,0 +1,69 @@
interface I {
}
abstract class A : I {
// INFO: {"checked": "true"}
val x: Int get() = 2
// INFO: {"checked": "true"}
abstract val y: Int
// INFO: {"checked": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true"}
abstract fun bar(s: String)
// INFO: {"checked": "true"}
class Y {
}
}
class B : I {
val y = 1
// INFO: {"checked": "true"}
val x: Int get() = 2
fun bar(s: String) = s.length()
// INFO: {"checked": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true"}
class Y {
}
}
interface J : I {
// INFO: {"checked": "true"}
val x: Int get() = 2
// INFO: {"checked": "true"}
val y: Int
// INFO: {"checked": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true"}
fun bar(s: String)
// INFO: {"checked": "true"}
class Y {
}
}
interface K : I {
val y: Int get() = 1
// INFO: {"checked": "true"}
val x: Int get() = 2
fun bar(s: String) = s.length()
// INFO: {"checked": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true"}
class Y {
}
}
@@ -0,0 +1,31 @@
interface <caret>I {
// INFO: {"checked": "true", "toAbstract": "true"}
val x: Int get() = 2
// INFO: {"checked": "true", "toAbstract": "true"}
val y: Int
// INFO: {"checked": "true", "toAbstract": "true"}
fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true", "toAbstract": "true"}
fun bar(s: String)
// INFO: {"checked": "true", "toAbstract": "true"}
class Y {
}
}
abstract class A : I
class B : I {
override val y = 1
override fun bar(s: String) = s.length()
}
interface J : I
interface K : I {
override val y: Int get() = 1
override fun bar(s: String) = s.length()
}
@@ -0,0 +1,74 @@
interface I {
// INFO: {"checked": "true", "toAbstract": "true"}
val x: Int
// INFO: {"checked": "true", "toAbstract": "true"}
fun foo(n: Int): Boolean
}
abstract class A : I {
// INFO: {"checked": "true", "toAbstract": "true"}
override val x: Int get() = 2
// INFO: {"checked": "true", "toAbstract": "true"}
abstract val y: Int
// INFO: {"checked": "true", "toAbstract": "true"}
override fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true", "toAbstract": "true"}
abstract fun bar(s: String)
// INFO: {"checked": "true", "toAbstract": "true"}
class Y {
}
}
class B : I {
val y = 1
// INFO: {"checked": "true", "toAbstract": "true"}
override val x: Int get() = 2
fun bar(s: String) = s.length()
// INFO: {"checked": "true", "toAbstract": "true"}
override fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true", "toAbstract": "true"}
class Y {
}
}
interface J : I {
// INFO: {"checked": "true", "toAbstract": "true"}
override val x: Int get() = 2
// INFO: {"checked": "true", "toAbstract": "true"}
val y: Int
// INFO: {"checked": "true", "toAbstract": "true"}
override fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true", "toAbstract": "true"}
fun bar(s: String)
// INFO: {"checked": "true", "toAbstract": "true"}
class Y {
}
}
interface K : I {
val y: Int get() = 1
// INFO: {"checked": "true", "toAbstract": "true"}
override val x: Int get() = 2
fun bar(s: String) = s.length()
// INFO: {"checked": "true", "toAbstract": "true"}
override fun foo(n: Int): Boolean = n > 0
// INFO: {"checked": "true", "toAbstract": "true"}
class Y {
}
}
@@ -0,0 +1,14 @@
open class <caret>A {
private fun foo() {
}
// INFO: {"checked": "true"}
fun bar() {
foo()
}
}
class B : A() {
}
@@ -0,0 +1 @@
Function 'fun bar()' uses function 'fun foo()', which is not accessible from the class B
@@ -0,0 +1,37 @@
open class <caret>A {
fun foo() {
}
// INFO: {"checked": "true"}
fun foo(n: Int) {
}
fun test() {
foo()
foo(1)
}
}
open class B : A() {
}
class C : B() {
}
fun A.test() {
foo()
foo(2)
}
fun test() {
A().foo()
A().foo(3)
B().foo()
B().foo(4)
C().foo()
C().foo(5)
}
@@ -0,0 +1,3 @@
Pushed member won't be available in 'foo(1)'
Pushed member won't be available in 'foo(2)'
Pushed member won't be available in 'foo(3)'
@@ -0,0 +1,12 @@
// INFO: {"checked": "true"}
interface X
// INFO: {"checked": "true"}
interface Y
// INFO: {"checked": "true"}
interface Z
open class <caret>A : X, Y, Z
class B : A(), Z
@@ -0,0 +1,12 @@
// INFO: {"checked": "true"}
interface X
// INFO: {"checked": "true"}
interface Y
// INFO: {"checked": "true"}
interface Z
open class A
class B : A(), Z, X, Y
@@ -0,0 +1,14 @@
interface I
// INFO: {"checked": "true"}
interface X<T>
// INFO: {"checked": "true"}
interface Y<T>
// INFO: {"checked": "true"}
interface Z<T>
open class <caret>A<T, U> : X<T>, Y<X<I>>, Z<Y<U>>
class B<S> : A<X<S>, Y<S>>(), Z<I>
@@ -0,0 +1,14 @@
interface I
// INFO: {"checked": "true"}
interface X<T>
// INFO: {"checked": "true"}
interface Y<T>
// INFO: {"checked": "true"}
interface Z<T>
open class A<T, U>
class B<S> : A<X<S>, Y<S>>(), Z<I>, X<X<S>>, Y<X<I>>