Java to Kotlin conversion: fixed a few bugs related to modifiers

#KT-4424 Fixed
This commit is contained in:
Valentin Kipyatkov
2014-06-03 22:43:43 +04:00
parent ef8504eb39
commit 7c2473a5ef
15 changed files with 88 additions and 67 deletions
+17 -19
View File
@@ -137,6 +137,10 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
}
}
if (settings.openByDefault && !modifiers.contains(Modifier.FINAL)) {
modifiers.add(Modifier.OPEN)
}
return Class(this, name, getComments(psiClass), modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, classBodyElements)
}
}
@@ -231,16 +235,17 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
methodReturnType = method.getReturnType()
val returnType = convertType(method.getReturnType(), method.isAnnotatedAsNotNull())
val modifiers = HashSet(convertModifierList(method.getModifierList()))
val modifiers = convertModifierList(method.getModifierList())
val containingClass = method.getContainingClass()
if (containingClass != null && containingClass.isInterface()) {
modifiers.remove(Modifier.ABSTRACT)
}
if (containingClass != null && (containingClass.hasModifierProperty(PsiModifier.FINAL) || containingClass.isEnum())) {
modifiers.add(Modifier.FINAL)
}
if (isOverride(method)) {
modifiers.add(Modifier.OVERRIDE)
}
if (settings.openByDefault &&
!modifiers.contains(Modifier.ABSTRACT) &&
!modifiers.contains(Modifier.FINAL) &&
@@ -248,11 +253,6 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
modifiers.add(Modifier.OPEN)
}
if (isOverride(method)) {
modifiers.add(Modifier.OVERRIDE)
modifiers.remove(Modifier.OPEN)
}
val comments = getComments(method)
if (method.isConstructor()) {
@@ -268,7 +268,7 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
val params = convertParameterList(method.getParameterList())
val typeParameterList = convertTypeParameterList(method.getTypeParameterList())
val block = convertBlock(method.getBody())
return Function(this, Identifier(method.getName()), comments, modifiers, returnType, typeParameterList, params, block)
return Function(this, Identifier(method.getName()), comments, modifiers, returnType, typeParameterList, params, block, containingClass?.isInterface() ?: false)
}
}
finally {
@@ -494,12 +494,13 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
return Identifier(identifier.getText()!!)
}
public fun convertModifierList(modifierList: PsiModifierList?): Set<Modifier> {
if (modifierList == null) return setOf()
public fun convertModifierList(modifierList: PsiModifierList?): MutableSet<Modifier> {
if (modifierList == null) return HashSet()
val modifiersSet = HashSet<Modifier>()
if (modifierList.hasExplicitModifier(PsiModifier.ABSTRACT))
//TODO: map
if (modifierList.hasModifierProperty(PsiModifier.ABSTRACT))
modifiersSet.add(Modifier.ABSTRACT)
if (modifierList.hasModifierProperty(PsiModifier.FINAL))
@@ -508,16 +509,13 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
if (modifierList.hasModifierProperty(PsiModifier.STATIC))
modifiersSet.add(Modifier.STATIC)
if (modifierList.hasExplicitModifier(PsiModifier.PUBLIC))
if (modifierList.hasModifierProperty(PsiModifier.PUBLIC))
modifiersSet.add(Modifier.PUBLIC)
if (modifierList.hasExplicitModifier(PsiModifier.PROTECTED))
if (modifierList.hasModifierProperty(PsiModifier.PROTECTED))
modifiersSet.add(Modifier.PROTECTED)
if (modifierList.hasExplicitModifier(PsiModifier.PACKAGE_LOCAL))
modifiersSet.add(Modifier.INTERNAL)
if (modifierList.hasExplicitModifier(PsiModifier.PRIVATE))
if (modifierList.hasModifierProperty(PsiModifier.PRIVATE))
modifiersSet.add(Modifier.PRIVATE)
return modifiersSet
+7 -14
View File
@@ -17,7 +17,6 @@
package org.jetbrains.jet.j2k.ast
import org.jetbrains.jet.j2k.Converter
import java.util.HashSet
import java.util.ArrayList
open class Class(
@@ -80,27 +79,21 @@ open class Class(
" : " + allTypes.makeString(", ")
}
protected fun modifiersToKotlin(): String {
protected open fun modifiersToKotlin(): String {
val modifierList = ArrayList<Modifier>()
val modifier = modifiers.accessModifier()
if (modifier != null) {
modifierList.add(modifier)
}
if (isAbstract()) {
modifiers.accessModifier()?.let { modifierList.add(it) }
if (modifiers.contains(Modifier.ABSTRACT)) {
modifierList.add(Modifier.ABSTRACT)
}
else if (needsOpenModifier()) {
else if (modifiers.contains(Modifier.OPEN)) {
modifierList.add(Modifier.OPEN)
}
return modifierList.toKotlin()
}
protected open fun isDefinitelyFinal(): Boolean
= modifiers.contains(Modifier.FINAL)
protected open fun needsOpenModifier(): Boolean
= !isDefinitelyFinal() && converter.settings.openByDefault
fun bodyToKotlin(): String {
val innerBody = classMembers.nonStaticMembers.toKotlin() + primaryConstructorBodyToKotlin() + classObjectToKotlin()
return if (innerBody.trim().isNotEmpty()) " {" + innerBody + "}" else ""
@@ -26,7 +26,7 @@ abstract class Constructor(
modifiers: Set<Modifier>,
parameterList: ParameterList,
block: Block
) : Function(converter, Identifier.Empty, comments, modifiers, Type.Empty, TypeParameterList.Empty, parameterList, block)
) : Function(converter, Identifier.Empty, comments, modifiers, Type.Empty, TypeParameterList.Empty, parameterList, block, false)
class PrimaryConstructor(converter: Converter,
comments: MemberComments,
@@ -61,6 +61,6 @@ class SecondaryConstructor(converter: Converter,
typeParameters.addAll(containingClass.typeParameterList.parameters)
return Function(converter, Identifier("init"), MemberComments.Empty, modifiers,
ClassType(containingClass.name, typeParameters, false, converter),
TypeParameterList(typeParameters), parameterList, block)
TypeParameterList(typeParameters), parameterList, block, false)
}
}
@@ -34,8 +34,6 @@ class Enum(
override fun primaryConstructorSignatureToKotlin(): String
= classMembers.primaryConstructor?.signatureToKotlin() ?: ""
override fun isDefinitelyFinal() = true
override fun toKotlin(): String {
return modifiersToKotlin() +
"enum class " + name.toKotlin() +
+2 -5
View File
@@ -30,14 +30,11 @@ open class Field(
fun modifiersToKotlin(): String {
val modifierList = ArrayList<Modifier>()
if (isAbstract()) {
if (modifiers.contains(Modifier.ABSTRACT)) {
modifierList.add(Modifier.ABSTRACT)
}
val modifier = modifiers.accessModifier()
if (modifier != null) {
modifierList.add(modifier)
}
modifiers.accessModifier()?.let { modifierList.add(it) }
return modifierList.toKotlin() + (if (isVal()) "val " else "var ")
}
@@ -27,7 +27,8 @@ open class Function(
val `type`: Type,
val typeParameterList: TypeParameterList,
val parameterList: ParameterList,
var block: Block?
var block: Block?,
val isInTrait: Boolean
) : Member(comments, modifiers) {
private fun modifiersToKotlin(): String {
@@ -42,11 +43,11 @@ open class Function(
resultingModifiers.add(accessModifier)
}
if (isAbstract()) {
if (modifiers.contains(Modifier.ABSTRACT) && !isInTrait) {
resultingModifiers.add(Modifier.ABSTRACT)
}
if (modifiers.contains(Modifier.OPEN)) {
if (modifiers.contains(Modifier.OPEN) && !isOverride) {
resultingModifiers.add(Modifier.OPEN)
}
@@ -25,7 +25,6 @@ class MemberComments(elements: List<Element>) : WhiteSpaceSeparatedElementList(e
}
abstract class Member(val comments: MemberComments, val modifiers: Set<Modifier>) : Element {
fun isAbstract(): Boolean = modifiers.contains(Modifier.ABSTRACT)
fun isStatic(): Boolean = modifiers.contains(Modifier.STATIC)
fun commentsToKotlin(): String = comments.toKotlin()
}
+3 -14
View File
@@ -16,37 +16,26 @@
package org.jetbrains.jet.j2k.ast
import org.jetbrains.jet.j2k.ast.Modifier.PUBLIC
import org.jetbrains.jet.j2k.ast.Modifier.PROTECTED
import org.jetbrains.jet.j2k.ast.Modifier.PRIVATE
import org.jetbrains.jet.j2k.ast.Modifier.INTERNAL
enum class Modifier(val name: String) {
PUBLIC: Modifier("public")
PROTECTED: Modifier("protected")
PRIVATE: Modifier("private")
INTERNAL: Modifier("internal")
STATIC: Modifier("static")
ABSTRACT: Modifier("abstract")
FINAL: Modifier("final")
OPEN: Modifier("open")
OVERRIDE: Modifier("override")
public fun toKotlin(): String? {
return when(this) {
INTERNAL -> null
else -> name
}
}
public fun toKotlin(): String = name
}
val ACCESS_MODIFIERS = setOf(PUBLIC, PROTECTED, PRIVATE, INTERNAL)
val ACCESS_MODIFIERS = setOf(Modifier.PUBLIC, Modifier.PROTECTED, Modifier.PRIVATE)
fun Collection<Modifier>.accessModifier(): Modifier? {
return firstOrNull { ACCESS_MODIFIERS.contains(it) }
}
fun Collection<Modifier>.toKotlin(): String
= if (isNotEmpty()) map { it.toKotlin() }.filterNotNull().makeString(" ") + " " else ""
= if (isNotEmpty()) map { it.toKotlin() }.makeString(" ") + " " else ""
+8 -1
View File
@@ -17,6 +17,7 @@
package org.jetbrains.jet.j2k.ast
import org.jetbrains.jet.j2k.Converter
import java.util.ArrayList
class Trait(
converter: Converter,
@@ -35,5 +36,11 @@ class Trait(
get() = "trait"
override fun primaryConstructorSignatureToKotlin() = ""
override fun needsOpenModifier() = false
override fun modifiersToKotlin(): String {
val modifierList = ArrayList<Modifier>()
modifiers.accessModifier()?.let { modifierList.add(it) }
return modifierList.toKotlin()
}
}
@@ -1982,6 +1982,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("j2k/tests/testData/ast/settings"), Pattern.compile("^(.+)\\.java$"), true);
}
@TestMetadata("openByDefault.java")
public void testOpenByDefault() throws Exception {
doTest("j2k/tests/testData/ast/settings/openByDefault.java");
}
@TestMetadata("specifyLocalVariableTypeByDefault.java")
public void testSpecifyLocalVariableTypeByDefault() throws Exception {
doTest("j2k/tests/testData/ast/settings/specifyLocalVariableTypeByDefault.java");
@@ -0,0 +1,34 @@
// !openByDefault: true
open class A() {
open fun foo1() {
}
private fun foo2() {
}
fun foo3() {
}
}
class B() {
fun foo() {
}
}
abstract class C() {
abstract fun foo()
}
trait I {
public fun foo()
}
open class D() : I {
override fun foo() {
}
}
enum class E {
fun foo(): Int {
return 0
}
}
@@ -1 +1 @@
abstract trait I
trait I
@@ -1,7 +1,7 @@
trait INode {
class object {
val IN: String = "in"
val AT: String = "@"
val COMMA_WITH_SPACE: String = COMMA + SPACE
public val IN: String = "in"
public val AT: String = "@"
public val COMMA_WITH_SPACE: String = COMMA + SPACE
}
}
@@ -1,4 +1,4 @@
trait INode {
fun getTag(): Tag
fun toKotlin(): String
public fun getTag(): Tag
public fun toKotlin(): String
}