From ee860fdde5decdd78c76e45a624beeb16084e68e Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Mon, 7 Sep 2015 16:41:35 +0300 Subject: [PATCH] J2K: Insert class body for anonymous classes #KT-8952 Fixed --- j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt | 8 +++++--- j2k/src/org/jetbrains/kotlin/j2k/Converter.kt | 4 ++-- j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt | 5 +++-- j2k/testData/fileOrElement/objectLiteral/MyFrame.java | 8 ++++++++ j2k/testData/fileOrElement/objectLiteral/MyFrame.kt | 10 ++++++++++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt index 3e5d2727f8c..b072bca22cd 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ClassBodyConverter.kt @@ -42,7 +42,8 @@ enum class AccessorKind { class ClassBodyConverter(private val psiClass: PsiClass, private val converter: Converter, private val isOpenClass: Boolean, - private val isObject: Boolean) { + private val isObject: Boolean, + private val isAnonymousObject: Boolean = false) { private val membersToRemove = HashSet() private val fieldCorrections = HashMap() @@ -93,7 +94,7 @@ class ClassBodyConverter(private val psiClass: PsiClass, } } - return ClassBody(null, null, convertedMembers.values().toList(), emptyList(), lBrace, rBrace, false) + return ClassBody(null, null, convertedMembers.values().toList(), emptyList(), lBrace, rBrace, false, false) } val useCompanionObject = shouldGenerateCompanionObject(convertedMembers) @@ -120,6 +121,7 @@ class ClassBodyConverter(private val psiClass: PsiClass, } if (primaryConstructorSignature != null + && !isAnonymousObject && primaryConstructorSignature.annotations.isEmpty && primaryConstructorSignature.accessModifier == null && primaryConstructorSignature.parameterList.parameters.isEmpty() @@ -128,7 +130,7 @@ class ClassBodyConverter(private val psiClass: PsiClass, primaryConstructorSignature = null // no "()" after class name is needed in this case } - return ClassBody(primaryConstructorSignature, constructorConverter?.baseClassParams, members, companionObjectMembers, lBrace, rBrace, psiClass.isEnum()) + return ClassBody(primaryConstructorSignature, constructorConverter?.baseClassParams, members, companionObjectMembers, lBrace, rBrace, psiClass.isEnum(), isAnonymousObject) } private fun Converter.convertMember(member: PsiMember, diff --git a/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt b/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt index bca31ffc626..2838d38cc81 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt @@ -278,7 +278,7 @@ class Converter private constructor( // to convert fields and nested types - they are not allowed in Kotlin but we convert them and let user refactor code var classBody = ClassBodyConverter(psiClass, this, isOpenClass = false, isObject = false).convertBody() classBody = ClassBody(constructorSignature, classBody.baseClassParams, classBody.members, - classBody.companionObjectMembers, classBody.lBrace, classBody.rBrace, classBody.isEnumBody) + classBody.companionObjectMembers, classBody.lBrace, classBody.rBrace, classBody.isEnumBody, classBody.isAnonymousClassBody) val annotationAnnotation = Annotation(Identifier("annotation").assignNoPrototype(), listOf(), withAt = false, newLineAfter = false).assignNoPrototype() return Class(psiClass.declarationIdentifier(), @@ -564,7 +564,7 @@ class Converter private constructor( } public fun convertAnonymousClassBody(anonymousClass: PsiAnonymousClass): AnonymousClassBody { - return AnonymousClassBody(ClassBodyConverter(anonymousClass, this, isOpenClass = false, isObject = false).convertBody(), + return AnonymousClassBody(ClassBodyConverter(anonymousClass, this, isOpenClass = false, isObject = false, isAnonymousObject = true).convertBody(), anonymousClass.getBaseClassType().resolve()?.isInterface() ?: false).assignPrototype(anonymousClass) } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt b/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt index 3e5212860b6..97ee5abba27 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ast/ClassBody.kt @@ -31,11 +31,12 @@ class ClassBody ( val companionObjectMembers: List, val lBrace: LBrace, val rBrace: RBrace, - val isEnumBody: Boolean) { + val isEnumBody: Boolean, + val isAnonymousClassBody: Boolean) { fun appendTo(builder: CodeBuilder) { val membersFiltered = members.filter { !it.isEmpty } - if (membersFiltered.isEmpty() && companionObjectMembers.isEmpty()) return + if (!isAnonymousClassBody && membersFiltered.isEmpty() && companionObjectMembers.isEmpty()) return builder append " " append lBrace append "\n" diff --git a/j2k/testData/fileOrElement/objectLiteral/MyFrame.java b/j2k/testData/fileOrElement/objectLiteral/MyFrame.java index 4ee7aad79fe..7751fe98baf 100644 --- a/j2k/testData/fileOrElement/objectLiteral/MyFrame.java +++ b/j2k/testData/fileOrElement/objectLiteral/MyFrame.java @@ -5,6 +5,11 @@ interface WindowListener { void windowClosing (); } +interface EmptyWindowListener { +} + +open class EmptyWindowAdapter : EmptyWindowListener {} + class WindowAdapter implements WindowListener { public void windowClosing () { } @@ -29,5 +34,8 @@ public final class Client extends Frame { public void windowClosing () { } }); + + EmptyWindowListener b = new EmptyWindowListener() {}; + EmptyWindowAdapter c = new EmptyWindowAdapter() {}; } } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/objectLiteral/MyFrame.kt b/j2k/testData/fileOrElement/objectLiteral/MyFrame.kt index fb445d06fa6..1624d93124d 100644 --- a/j2k/testData/fileOrElement/objectLiteral/MyFrame.kt +++ b/j2k/testData/fileOrElement/objectLiteral/MyFrame.kt @@ -4,6 +4,9 @@ interface WindowListener { public fun windowClosing() } +interface EmptyWindowListener +open class EmptyWindowAdapter + open class WindowAdapter : WindowListener { override fun windowClosing() { } @@ -27,5 +30,12 @@ public class Client : Frame() { override fun windowClosing() { } }) + + val b = object : EmptyWindowListener { + + } + val c = object : EmptyWindowAdapter() { + + } } } \ No newline at end of file