From a59021a25e5f0d511112fa88897777c84f0125f6 Mon Sep 17 00:00:00 2001 From: Dimach Date: Fri, 14 Jul 2017 03:01:39 +0300 Subject: [PATCH] KT-18786: J2K should move all properties to top of class #KT-18786 fixed --- .../org/jetbrains/kotlin/j2k/ast/ClassBody.kt | 15 +++++-- ...fiersToAnnotationsFromPropertyAccessors.kt | 4 +- .../callChainExpression/libraryMethodCall.kt | 3 +- .../libraryMethodCallFromInstance-settings.kt | 3 +- .../libraryMethodCallFromInstance.kt | 3 +- .../fileOrElement/class/utilityClass1.kt | 4 +- .../fileOrElement/class/utilityClass2.kt | 6 +-- .../fileOrElement/class/utilityClass3.kt | 6 +-- .../fileOrElement/comments/comments2.kt | 4 +- .../detectProperties/InInterface.kt | 8 ++-- .../detectProperties/Overrides.kt | 18 ++++----- .../detectProperties/PropertyType.kt | 5 +-- .../fileOrElement/field/specifyType.kt | 28 ++++++------- .../formatting/nonStaticMembers.kt | 2 +- .../nonStaticMembersWithComments.kt | 2 +- .../formatting/staticMembersWithComments.kt | 2 +- .../fileOrElement/function/nativeMethods.kt | 3 +- j2k/testData/fileOrElement/issues/comments.kt | 40 +++++++++---------- j2k/testData/fileOrElement/issues/kt-963.kt | 5 +-- .../nullability/nullableInitializer1.kt | 6 +-- .../nullability/nullableInitializer2.kt | 6 +-- .../nullability/nullableInitializer3.kt | 6 +-- .../protected/inheritorsSamePackage.kt | 5 ++- .../protected/protectedInSamePackage.kt | 4 +- .../protected/superInSamePackage.kt | 4 +- .../fileOrElement/protected/usages.kt | 5 ++- .../returnStatement/currentMethodBug.kt | 4 +- .../multiFile/GetterAndSetterUsages/2.kt | 9 +++-- .../InheritorOtherPackage1.kt | 4 +- j2k/testData/multiFile/ToObject/Utils.kt | 6 +-- 30 files changed, 117 insertions(+), 103 deletions(-) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt index 70d2dd453cc..6dfc5c6fbeb 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.j2k.append abstract class Member(var annotations: Annotations, val modifiers: Modifiers) : Element() -class ClassBody ( +class ClassBody( val primaryConstructor: PrimaryConstructor?, val primaryConstructorSignature: PrimaryConstructorSignature?, val baseClassParams: List>?, @@ -39,7 +39,7 @@ class ClassBody ( builder append " " append lBrace append "\n" if (!classKind.isEnum()) { - builder.append(membersFiltered, "\n") + builder.append(membersFiltered.sortedWith(PropertyComparator), "\n") } else { val (constants, otherMembers) = membersFiltered.partition { it is EnumConstant } @@ -50,7 +50,7 @@ class ClassBody ( builder.append(";\n") } - builder.append(otherMembers, "\n") + builder.append(otherMembers.sortedWith(PropertyComparator), "\n") } appendCompanionObject(builder, membersFiltered.isNotEmpty()) @@ -64,3 +64,12 @@ class ClassBody ( builder.append(companionObjectMembers, "\n", "companion object {\n", "\n}") } } + +private object PropertyComparator : Comparator { + override fun compare(o1: Member?, o2: Member?): Int = when { + o1 is Property && o2 is Property -> 0 + o1 is Property -> -1 + o2 is Property -> 1 + else -> 0 + } +} diff --git a/j2k/testData/fileOrElement/annotations/modifiersToAnnotationsFromPropertyAccessors.kt b/j2k/testData/fileOrElement/annotations/modifiersToAnnotationsFromPropertyAccessors.kt index cb9bc4e0e00..5899d518056 100644 --- a/j2k/testData/fileOrElement/annotations/modifiersToAnnotationsFromPropertyAccessors.kt +++ b/j2k/testData/fileOrElement/annotations/modifiersToAnnotationsFromPropertyAccessors.kt @@ -1,8 +1,8 @@ class WithModifiersOnAccessors { - @Synchronized private fun methSync() {} - @Strictfp protected fun methStrict() {} @get:Synchronized @set:Synchronized var sync = 0 @get:Strictfp var strict = 0.0 + @Synchronized private fun methSync() {} + @Strictfp protected fun methStrict() {} } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCall.kt b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCall.kt index bc198af6336..09b7037632c 100644 --- a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCall.kt +++ b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCall.kt @@ -1,8 +1,9 @@ internal object Library { - fun call() {} val string: String get() = "" + + fun call() {} } internal class User { diff --git a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance-settings.kt b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance-settings.kt index 07951c3e50b..e09f3b4c7af 100644 --- a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance-settings.kt +++ b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance-settings.kt @@ -1,10 +1,11 @@ // !forceNotNullTypes: false // !specifyLocalVariableTypeByDefault: true internal class Library { - fun call() {} val string: String get() = "" + + fun call() {} } internal class User { diff --git a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance.kt b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance.kt index f46ac268a63..0ac91034515 100644 --- a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance.kt +++ b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance.kt @@ -1,8 +1,9 @@ internal class Library { - fun call() {} val string: String get() = "" + + fun call() {} } internal class User { diff --git a/j2k/testData/fileOrElement/class/utilityClass1.kt b/j2k/testData/fileOrElement/class/utilityClass1.kt index 801cb720711..1e6ac2c68ea 100644 --- a/j2k/testData/fileOrElement/class/utilityClass1.kt +++ b/j2k/testData/fileOrElement/class/utilityClass1.kt @@ -1,6 +1,6 @@ internal object Util { - fun util1() {} - fun util2() {} val CONSTANT = 10 + fun util1() {} + fun util2() {} } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/class/utilityClass2.kt b/j2k/testData/fileOrElement/class/utilityClass2.kt index dd7ae502d60..0c5a96ade2b 100644 --- a/j2k/testData/fileOrElement/class/utilityClass2.kt +++ b/j2k/testData/fileOrElement/class/utilityClass2.kt @@ -1,7 +1,7 @@ internal object Util { + val CONSTANT = 10 + fun util1() {} fun util2() {} - - val CONSTANT = 10 -} +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/class/utilityClass3.kt b/j2k/testData/fileOrElement/class/utilityClass3.kt index 5d2da046d4b..1e6ac2c68ea 100644 --- a/j2k/testData/fileOrElement/class/utilityClass3.kt +++ b/j2k/testData/fileOrElement/class/utilityClass3.kt @@ -1,6 +1,6 @@ internal object Util { - fun util1() {} - fun util2() {} val CONSTANT = 10 -} + fun util1() {} + fun util2() {} +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/comments/comments2.kt b/j2k/testData/fileOrElement/comments/comments2.kt index 06270f6f244..cb6d3df1b00 100644 --- a/j2k/testData/fileOrElement/comments/comments2.kt +++ b/j2k/testData/fileOrElement/comments/comments2.kt @@ -3,6 +3,8 @@ package foo internal class A { + + private /*it's private*/ val field = 0 fun /* nothing to return */ foo(/* no parameters at all */) { // let declare a variable // with 2 comments before @@ -12,8 +14,6 @@ internal class A { fun /* we return int*/ foo(/*int*/ p: Int/* parameter p */): Int { /* body is empty */ } - private/*it's private*/ val field = 0 - /*it's public*/ fun foo(s: String): Char {} protected/*it's protected*/ fun foo(c: Char) {} diff --git a/j2k/testData/fileOrElement/detectProperties/InInterface.kt b/j2k/testData/fileOrElement/detectProperties/InInterface.kt index 69ae5cab59f..6aa17fa436d 100644 --- a/j2k/testData/fileOrElement/detectProperties/InInterface.kt +++ b/j2k/testData/fileOrElement/detectProperties/InInterface.kt @@ -3,11 +3,11 @@ internal interface I { var something2: Int - fun setSomething3(value: Int) - val something4: Int - fun setSomething4(value: String) val something5: Int + + fun setSomething3(value: Int) + fun setSomething4(value: String) fun setSomething5(value: Int): Int -} +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/detectProperties/Overrides.kt b/j2k/testData/fileOrElement/detectProperties/Overrides.kt index 455b8f02bfc..e7a942b2e66 100644 --- a/j2k/testData/fileOrElement/detectProperties/Overrides.kt +++ b/j2k/testData/fileOrElement/detectProperties/Overrides.kt @@ -15,9 +15,9 @@ internal interface I { } internal interface I1 : I { - fun setSomething1(value: Int) val something6: Int + fun setSomething1(value: Int) } internal open class B { @@ -59,14 +59,6 @@ internal abstract class C(override val something1: Int) : B(), I { } - fun getSomething6(): Int { - return mySomething6 - } - - override fun setSomething6(value: Int) { - mySomething6 = value - } - override val fromB1: String get() = super.fromB1 @@ -91,6 +83,14 @@ internal abstract class C(override val something1: Int) : B(), I { val fromB5: String get() = "" + fun getSomething6(): Int { + return mySomething6 + } + + override fun setSomething6(value: Int) { + mySomething6 = value + } + override fun setFromB5(value: String) { super.setFromB5(value) } diff --git a/j2k/testData/fileOrElement/detectProperties/PropertyType.kt b/j2k/testData/fileOrElement/detectProperties/PropertyType.kt index ec85d7c4561..be45f50d954 100644 --- a/j2k/testData/fileOrElement/detectProperties/PropertyType.kt +++ b/j2k/testData/fileOrElement/detectProperties/PropertyType.kt @@ -4,6 +4,8 @@ internal class A { private val list1 = ArrayList() private val list2 = ArrayList() private val myList3 = ArrayList() + val list3: List + get() = myList3 fun getList1(): List { return list1 @@ -13,9 +15,6 @@ internal class A { return list2 } - val list3: List - get() = myList3 - fun foo() { list1.add("a") list2.add("a") diff --git a/j2k/testData/fileOrElement/field/specifyType.kt b/j2k/testData/fileOrElement/field/specifyType.kt index 4457aa031c3..8862508d549 100644 --- a/j2k/testData/fileOrElement/field/specifyType.kt +++ b/j2k/testData/fileOrElement/field/specifyType.kt @@ -15,20 +15,6 @@ internal class A { private var field9: String? = "a" private var field10: String? = foo() - fun foo(): String { - return "x" - } - - fun bar() { - field5 = ArrayList() - field7++ - field8++ - field9 = null - field10 = null - } - - internal interface I - private val anonymous: I = object : I { } @@ -43,6 +29,20 @@ internal class A { private var iimpl = anonymous + fun foo(): String { + return "x" + } + + fun bar() { + field5 = ArrayList() + field7++ + field8++ + field9 = null + field10 = null + } + + internal interface I + fun testAnonymousObject(i: Any) { if (true) { iimpl = i as I diff --git a/j2k/testData/fileOrElement/formatting/nonStaticMembers.kt b/j2k/testData/fileOrElement/formatting/nonStaticMembers.kt index 868770e4d10..4cd9e032359 100644 --- a/j2k/testData/fileOrElement/formatting/nonStaticMembers.kt +++ b/j2k/testData/fileOrElement/formatting/nonStaticMembers.kt @@ -1,10 +1,10 @@ internal class F { + var i: Int? = 0 fun f1() {} fun f2() {} - var i: Int? = 0 fun f3() {} } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/formatting/nonStaticMembersWithComments.kt b/j2k/testData/fileOrElement/formatting/nonStaticMembersWithComments.kt index 00580889f76..54e9de36a19 100644 --- a/j2k/testData/fileOrElement/formatting/nonStaticMembersWithComments.kt +++ b/j2k/testData/fileOrElement/formatting/nonStaticMembersWithComments.kt @@ -1,4 +1,5 @@ internal class F { + var i: Int? = 0 //c1 @@ -13,7 +14,6 @@ internal class F { //c4 fun f2() {} - var i: Int? = 0 fun f3() {} diff --git a/j2k/testData/fileOrElement/formatting/staticMembersWithComments.kt b/j2k/testData/fileOrElement/formatting/staticMembersWithComments.kt index 6b61e431ad6..24ade07ebd7 100644 --- a/j2k/testData/fileOrElement/formatting/staticMembersWithComments.kt +++ b/j2k/testData/fileOrElement/formatting/staticMembersWithComments.kt @@ -1,4 +1,5 @@ internal object F { + var i: Int? = 0 //c1 @@ -13,7 +14,6 @@ internal object F { //c4 fun f2() {} - var i: Int? = 0 fun f3() {} diff --git a/j2k/testData/fileOrElement/function/nativeMethods.kt b/j2k/testData/fileOrElement/function/nativeMethods.kt index e56c38fc905..7358a1f4fe7 100644 --- a/j2k/testData/fileOrElement/function/nativeMethods.kt +++ b/j2k/testData/fileOrElement/function/nativeMethods.kt @@ -1,7 +1,8 @@ class Foo { - private external fun nativeMethod() var bar: Int external get external set + + private external fun nativeMethod() } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/issues/comments.kt b/j2k/testData/fileOrElement/issues/comments.kt index c6d62dd6f7a..1dc8ee0ae2c 100644 --- a/j2k/testData/fileOrElement/issues/comments.kt +++ b/j2k/testData/fileOrElement/issues/comments.kt @@ -17,23 +17,9 @@ internal class C { */ private val i: Int = 0 - /** - * This is a function doc comment. - */ - fun foo() { - /* This is a function comment */ - } - - //simple one line comment for function - fun f1() {} - //simple one line comment for field var j: Int = 0 - //double c style - //comment before function - fun f2() {} - //double c style //comment before field var k: Int = 0 @@ -46,7 +32,24 @@ internal class C { * different */ //comments - fun f3() {} + var l: Int = 0 + + /*two*/ /*comments*//*line*/ + var z: Int = 0 + + /** + * This is a function doc comment. + */ + fun foo() { + /* This is a function comment */ + } + + //simple one line comment for function + fun f1() {} + + //double c style + //comment before function + fun f2() {} //combination /** of @@ -56,8 +59,5 @@ internal class C { * different */ //comments - var l: Int = 0 - - /*two*/ /*comments*//*line*/ - var z: Int = 0 -} \ No newline at end of file + fun f3() {} +} diff --git a/j2k/testData/fileOrElement/issues/kt-963.kt b/j2k/testData/fileOrElement/issues/kt-963.kt index 03bae071c98..03aa6922f4c 100644 --- a/j2k/testData/fileOrElement/issues/kt-963.kt +++ b/j2k/testData/fileOrElement/issues/kt-963.kt @@ -1,10 +1,9 @@ -// ERROR: Variable cannot be initialized before declaration package demo internal class C(a: Int) { + var abc = 0 + init { abc = a * 2 } - - var abc = 0 } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/nullability/nullableInitializer1.kt b/j2k/testData/fileOrElement/nullability/nullableInitializer1.kt index bcdfb3f7b2f..9d0073eb480 100644 --- a/j2k/testData/fileOrElement/nullability/nullableInitializer1.kt +++ b/j2k/testData/fileOrElement/nullability/nullableInitializer1.kt @@ -1,11 +1,11 @@ class Test { - fun nullableString(p: Int): String? { - return if (p > 0) "response" else null - } private var nullableInitializerField = nullableString(3) private val nullableInitializerFieldFinal = nullableString(3) var nullableInitializerPublicField = nullableString(3) + fun nullableString(p: Int): String? { + return if (p > 0) "response" else null + } fun testProperty() { nullableInitializerField = "aaa" diff --git a/j2k/testData/fileOrElement/nullability/nullableInitializer2.kt b/j2k/testData/fileOrElement/nullability/nullableInitializer2.kt index c3e663487dd..41e10e59f19 100644 --- a/j2k/testData/fileOrElement/nullability/nullableInitializer2.kt +++ b/j2k/testData/fileOrElement/nullability/nullableInitializer2.kt @@ -1,11 +1,11 @@ // ERROR: Type mismatch: inferred type is String? but String was expected class TestJava { - fun nullableObj(p: Int): Any? { - return if (p > 0) "response" else null - } var nullableInitializerFieldCast: String = nullableObj(3) as String? private val nullableInitializerPrivateFieldCast = nullableObj(3) as String? + fun nullableObj(p: Int): Any? { + return if (p > 0) "response" else null + } fun testProperty() { nullableInitializerFieldCast[0] diff --git a/j2k/testData/fileOrElement/nullability/nullableInitializer3.kt b/j2k/testData/fileOrElement/nullability/nullableInitializer3.kt index 55039f75fb0..d275f9eecf3 100644 --- a/j2k/testData/fileOrElement/nullability/nullableInitializer3.kt +++ b/j2k/testData/fileOrElement/nullability/nullableInitializer3.kt @@ -1,10 +1,10 @@ class Test { - fun notNullString(p: Int): String { - return "response" - } private val notNullInitializerField = notNullString(3) var notNullInitializerPublicField = notNullString(3) + fun notNullString(p: Int): String { + return "response" + } fun testProperty() { notNullInitializerField[0] diff --git a/j2k/testData/fileOrElement/protected/inheritorsSamePackage.kt b/j2k/testData/fileOrElement/protected/inheritorsSamePackage.kt index a7109b907ab..1605ba663ef 100644 --- a/j2k/testData/fileOrElement/protected/inheritorsSamePackage.kt +++ b/j2k/testData/fileOrElement/protected/inheritorsSamePackage.kt @@ -1,6 +1,9 @@ package test open class BaseInheritorSamePackage { + + var i = 1 + constructor() { } @@ -12,8 +15,6 @@ open class BaseInheritorSamePackage { fun foo() { BaseInheritorSamePackage(1) } - - var i = 1 } internal class DerivedInheritorSamePackage : BaseInheritorSamePackage() { diff --git a/j2k/testData/fileOrElement/protected/protectedInSamePackage.kt b/j2k/testData/fileOrElement/protected/protectedInSamePackage.kt index 3d3cfe0b922..77fe252f6a8 100644 --- a/j2k/testData/fileOrElement/protected/protectedInSamePackage.kt +++ b/j2k/testData/fileOrElement/protected/protectedInSamePackage.kt @@ -2,11 +2,11 @@ package test class BaseSamePackage { + var i = 1 + fun foo() { } - - var i = 1 } internal class DerivedSamePackage { diff --git a/j2k/testData/fileOrElement/protected/superInSamePackage.kt b/j2k/testData/fileOrElement/protected/superInSamePackage.kt index 1180f965bcf..cbc4d05ef29 100644 --- a/j2k/testData/fileOrElement/protected/superInSamePackage.kt +++ b/j2k/testData/fileOrElement/protected/superInSamePackage.kt @@ -10,9 +10,9 @@ internal open class BaseSuperSamePackage { internal class DerivedSuperSamePackage : BaseSuperSamePackage() { + var i = 1 + fun foo() { } - - var i = 1 } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/protected/usages.kt b/j2k/testData/fileOrElement/protected/usages.kt index 5718c13b067..9448e42ffba 100644 --- a/j2k/testData/fileOrElement/protected/usages.kt +++ b/j2k/testData/fileOrElement/protected/usages.kt @@ -19,12 +19,13 @@ class BaseProtectedConstructor { } internal class DerivedSamePackage { + + private val i = BaseProtectedConstructor().usageInPropertyInitializer() + init { BaseProtectedConstructor().usageInConstructor() } - private val i = BaseProtectedConstructor().usageInPropertyInitializer() - fun usage() { BaseProtectedConstructor().usageInMethod() } diff --git a/j2k/testData/fileOrElement/returnStatement/currentMethodBug.kt b/j2k/testData/fileOrElement/returnStatement/currentMethodBug.kt index 0c85e810f98..f02c2bcde26 100644 --- a/j2k/testData/fileOrElement/returnStatement/currentMethodBug.kt +++ b/j2k/testData/fileOrElement/returnStatement/currentMethodBug.kt @@ -12,7 +12,7 @@ internal class C { return string } - fun foo(i: I) {} - var string: String? = null + + fun foo(i: I) {} } \ No newline at end of file diff --git a/j2k/testData/multiFile/GetterAndSetterUsages/2.kt b/j2k/testData/multiFile/GetterAndSetterUsages/2.kt index 734eae686e5..eb1bab0e1f7 100644 --- a/j2k/testData/multiFile/GetterAndSetterUsages/2.kt +++ b/j2k/testData/multiFile/GetterAndSetterUsages/2.kt @@ -1,9 +1,10 @@ class B { + + var yy = "" + private set + internal fun foo(a: AAA) { a.x = a.x + 1 yy += "a" } - - var yy = "" - private set -} \ No newline at end of file +} diff --git a/j2k/testData/multiFile/ProtectedVisibility/InheritorOtherPackage1.kt b/j2k/testData/multiFile/ProtectedVisibility/InheritorOtherPackage1.kt index 428ec445c04..dc17510bda1 100644 --- a/j2k/testData/multiFile/ProtectedVisibility/InheritorOtherPackage1.kt +++ b/j2k/testData/multiFile/ProtectedVisibility/InheritorOtherPackage1.kt @@ -2,9 +2,9 @@ package test open class BaseOtherPackage protected constructor() { + protected var i = 1 + protected fun foo() { } - - protected var i = 1 } diff --git a/j2k/testData/multiFile/ToObject/Utils.kt b/j2k/testData/multiFile/ToObject/Utils.kt index fe16e4b2fec..6f38687ff4f 100644 --- a/j2k/testData/multiFile/ToObject/Utils.kt +++ b/j2k/testData/multiFile/ToObject/Utils.kt @@ -1,10 +1,10 @@ package test internal object Utils { + + val staticField = 1 fun foo1(p: Int) {} fun foo2(): Int { return 1 } - - val staticField = 1 -} +} \ No newline at end of file