From 3edefcf598f398a159a0c344669eeb30da1526d2 Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Tue, 5 Nov 2013 15:57:43 +0400 Subject: [PATCH] Converter: Refactor handling of primitive types Inject converter in places of use Make Element and Node traits --- j2k/src/org/jetbrains/jet/j2k/Converter.kt | 2 +- .../jet/j2k/ast/ArrayInitializerExpression.kt | 14 ++++++++------ .../jet/j2k/ast/CallChainExpression.kt | 2 +- j2k/src/org/jetbrains/jet/j2k/ast/Class.kt | 5 +++-- j2k/src/org/jetbrains/jet/j2k/ast/Element.kt | 8 ++++---- j2k/src/org/jetbrains/jet/j2k/ast/File.kt | 2 +- j2k/src/org/jetbrains/jet/j2k/ast/Import.kt | 2 +- .../org/jetbrains/jet/j2k/ast/LocalVariable.kt | 4 +++- j2k/src/org/jetbrains/jet/j2k/ast/Member.kt | 2 +- j2k/src/org/jetbrains/jet/j2k/ast/Node.kt | 9 +++------ .../jetbrains/jet/j2k/ast/ReferenceElement.kt | 2 +- .../org/jetbrains/jet/j2k/ast/Statements.kt | 2 +- .../org/jetbrains/jet/j2k/ast/TypeElement.kt | 2 +- .../org/jetbrains/jet/j2k/ast/TypeParameter.kt | 6 +++--- .../jetbrains/jet/j2k/ast/types/ArrayType.kt | 7 +++++-- .../jetbrains/jet/j2k/ast/types/ClassType.kt | 7 +++++-- .../jetbrains/jet/j2k/ast/types/EmptyType.kt | 2 +- .../jet/j2k/ast/types/InProjectionType.kt | 2 +- .../jet/j2k/ast/types/OutProjectionType.kt | 2 +- .../jet/j2k/ast/types/PrimitiveType.kt | 2 +- .../jet/j2k/ast/types/StarProjectionType.kt | 2 +- .../org/jetbrains/jet/j2k/ast/types/Type.kt | 18 ++++++++++++++++-- .../org/jetbrains/jet/j2k/ast/types/VarArg.kt | 2 +- .../jet/j2k/visitors/ElementVisitor.kt | 3 ++- .../jet/j2k/visitors/ExpressionVisitor.kt | 5 ++++- .../jetbrains/jet/j2k/visitors/TypeVisitor.kt | 17 ++++++++++------- 26 files changed, 80 insertions(+), 51 deletions(-) diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index 315a6eba0a3..a9f40580c14 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -218,7 +218,7 @@ public open class Converter(val project: Project) { } } members.add(Constructor(Identifier.EMPTY_IDENTIFIER, arrayListOf(), Collections.emptySet(), - ClassType(name, Collections.emptyList(), false), + ClassType(name, Collections.emptyList(), false, this), Collections.emptyList(), ParameterList(createParametersFromFields(finalOrWithEmptyInitializer)), Block(createInitStatementsFromFields(finalOrWithEmptyInitializer)), diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.kt b/j2k/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.kt index 94b9cc48d3f..09f078e1c8e 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.kt @@ -19,8 +19,10 @@ package org.jetbrains.jet.j2k.ast import org.jetbrains.jet.j2k.ast.types.Type import org.jetbrains.jet.lang.types.expressions.OperatorConventions import com.intellij.openapi.util.text.StringUtil +import org.jetbrains.jet.j2k.ast.types.ArrayType +import org.jetbrains.jet.j2k.ast.types.isPrimitive -public open class ArrayInitializerExpression(val `type`: Type, val initializers: List) : Expression() { +public open class ArrayInitializerExpression(val arrayType: ArrayType, val initializers: List) : Expression() { public override fun toKotlin(): String { return createArrayFunction() + "(" + createInitializers() + ")" } @@ -30,16 +32,16 @@ public open class ArrayInitializerExpression(val `type`: Type, val initializers: } private fun createArrayFunction(): String { - var sType: String? = innerTypeStr() - if (Node.PRIMITIVE_TYPES.contains(sType)) { - return sType + "Array" + val elementType = arrayType.elementType + if (elementType.isPrimitive()) { + return (elementType.convertedToNotNull().toKotlin() + "Array").decapitalize() } - return StringUtil.decapitalize(`type`.convertedToNotNull().toKotlin())!! + return arrayType.convertedToNotNull().toKotlin().decapitalize() } private fun innerTypeStr(): String { - return `type`.convertedToNotNull().toKotlin().replace("Array", "").toLowerCase() + return arrayType.convertedToNotNull().toKotlin().replace("Array", "").toLowerCase() } private fun explicitConvertIfNeeded(i: Expression): String { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.kt b/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.kt index 726e7101999..c588b91ec50 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/CallChainExpression.kt @@ -16,7 +16,7 @@ package org.jetbrains.jet.j2k.ast -public open class CallChainExpression(val expression: Expression, val identifier: Expression) : Expression() { +public class CallChainExpression(val expression: Expression, val identifier: Expression) : Expression() { public override fun isNullable(): Boolean { if (!expression.isEmpty() && expression.isNullable()) return true return identifier.isNullable() diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt index d51f4b16849..17dffc08705 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt @@ -23,7 +23,7 @@ import org.jetbrains.jet.j2k.ast.types.Type import java.util.HashSet import java.util.ArrayList -public open class Class(converter: Converter, +public open class Class(val converter: Converter, val name: Identifier, val docComments: List, modifiers: Set, @@ -80,7 +80,8 @@ public open class Class(converter: Converter, val constructorTypeParameters = ArrayList() constructorTypeParameters.addAll(typeParameters) constructorTypeParameters.addAll(f.typeParameters) - return Function(Identifier("init"), arrayList(), modifiers, ClassType(name, constructorTypeParameters, false), + return Function(Identifier("init"), arrayList(), modifiers, + ClassType(name, constructorTypeParameters, false, converter), constructorTypeParameters, f.params, block) } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Element.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Element.kt index add6874b546..30b8aafe5c3 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Element.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Element.kt @@ -17,17 +17,17 @@ package org.jetbrains.jet.j2k.ast -public abstract class Element() : Node() { - public open fun isEmpty(): Boolean = false +public trait Element : Node { + public fun isEmpty(): Boolean = false class object { - public val EMPTY_ELEMENT: Element = object : Element() { + public val EMPTY_ELEMENT: Element = object : Element { override fun toKotlin() = "" override fun isEmpty() = true } } } -public class Comment(val text: String) : Element() { +public class Comment(val text: String) : Element { override fun toKotlin() = text } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/File.kt b/j2k/src/org/jetbrains/jet/j2k/ast/File.kt index 1fc9c34baa3..b4b69c3d5aa 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/File.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/File.kt @@ -19,7 +19,7 @@ package org.jetbrains.jet.j2k.ast public open class File(val packageName: String, val imports: MutableList, val body: MutableList, - val mainFunction: String) : Node() { + val mainFunction: String) : Node { public override fun toKotlin(): String { val common: String = imports.toKotlin("\n") + "\n\n" + body.toKotlin("\n") + "\n" + mainFunction diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Import.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Import.kt index 3dfcdfaaeb3..4b59c3a5fe0 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Import.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Import.kt @@ -17,6 +17,6 @@ package org.jetbrains.jet.j2k.ast -public open class Import(val name: String) : Node() { +public class Import(val name: String) : Node { public override fun toKotlin() = "import " + name } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/LocalVariable.kt b/j2k/src/org/jetbrains/jet/j2k/ast/LocalVariable.kt index a89178a992b..6799f371834 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/LocalVariable.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/LocalVariable.kt @@ -17,11 +17,13 @@ package org.jetbrains.jet.j2k.ast import org.jetbrains.jet.j2k.ast.types.Type +import org.jetbrains.jet.j2k.Converter public class LocalVariable(val identifier: Identifier, val modifiersSet: Set, val javaType: Type, - val initializer: Expression) : Expression() { + val initializer: Expression, + val converter: Converter) : Expression() { public fun isImmutable(): Boolean = forceImmutable || modifiersSet.contains(Modifier.FINAL) diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Member.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Member.kt index 60242ddcf6d..1eff869a9e5 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Member.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Member.kt @@ -16,7 +16,7 @@ package org.jetbrains.jet.j2k.ast -public abstract class Member(val modifiers: Set) : Node() { +public abstract class Member(val modifiers: Set) : Node { open fun accessModifier(): Modifier? { return modifiers.find { m -> m == Modifier.PUBLIC || m == Modifier.PROTECTED || m == Modifier.PRIVATE } } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Node.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Node.kt index 874b5464b00..80932effd5a 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Node.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Node.kt @@ -16,12 +16,9 @@ package org.jetbrains.jet.j2k.ast +import org.jetbrains.jet.j2k.Converter -public abstract class Node() { - public abstract fun toKotlin(): String - class object { - public val PRIMITIVE_TYPES: Set = hashSet( - "double", "float", "long", "int", "short", "byte", "boolean", "char") - } +public trait Node { + public fun toKotlin(): String } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/ReferenceElement.kt b/j2k/src/org/jetbrains/jet/j2k/ast/ReferenceElement.kt index 5c07717d0d2..f1307f2f0d8 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/ReferenceElement.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/ReferenceElement.kt @@ -18,6 +18,6 @@ package org.jetbrains.jet.j2k.ast import org.jetbrains.jet.j2k.ast.types.Type -public open class ReferenceElement(val reference: Identifier, val types: List) : Element() { +public class ReferenceElement(val reference: Identifier, val types: List) : Element { public override fun toKotlin() = reference.toKotlin() + types.toKotlin(", ", "<", ">") } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt index 32a310552e3..0d26850721a 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Statements.kt @@ -17,7 +17,7 @@ package org.jetbrains.jet.j2k.ast -public abstract class Statement() : Element() { +public abstract class Statement() : Element { class object { public val EMPTY_STATEMENT: Statement = object : Statement() { public override fun toKotlin() = "" diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/TypeElement.kt b/j2k/src/org/jetbrains/jet/j2k/ast/TypeElement.kt index f6bba43d17a..f77805f26af 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/TypeElement.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/TypeElement.kt @@ -18,7 +18,7 @@ package org.jetbrains.jet.j2k.ast import org.jetbrains.jet.j2k.ast.types.Type -public open class TypeElement(val `type`: Type) : Element() { +public open class TypeElement(val `type`: Type) : Element { override fun toKotlin() = `type`.toKotlin() public fun toKotlinNotNull(): String = `type`.convertedToNotNull().toKotlin() diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameter.kt b/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameter.kt index 3c930282312..e0dd54b50f2 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameter.kt @@ -18,9 +18,9 @@ package org.jetbrains.jet.j2k.ast import org.jetbrains.jet.j2k.ast.types.Type -public open class TypeParameter(val name: Identifier, val extendsTypes: List) : Element() { - public open fun hasWhere(): Boolean = extendsTypes.size() > 1 - public open fun getWhereToKotlin(): String { +public class TypeParameter(val name: Identifier, val extendsTypes: List) : Element { + public fun hasWhere(): Boolean = extendsTypes.size() > 1 + public fun getWhereToKotlin(): String { if (hasWhere()) { return name.toKotlin() + " : " + extendsTypes.get(1).toKotlin() } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/types/ArrayType.kt b/j2k/src/org/jetbrains/jet/j2k/ast/types/ArrayType.kt index d219702d9da..45f65b0ba9d 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/types/ArrayType.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/types/ArrayType.kt @@ -16,7 +16,10 @@ package org.jetbrains.jet.j2k.ast.types -public open class ArrayType(val elementType: Type, nullable: Boolean) : Type(nullable) { +import org.jetbrains.jet.j2k.Converter + +public class ArrayType(val elementType: Type, nullable: Boolean, + converter: Converter) : MayBeNullableType(nullable, converter) { public override fun toKotlin(): String { if (elementType is PrimitiveType) { return elementType.toKotlin() + "Array" + isNullableStr() @@ -25,5 +28,5 @@ public open class ArrayType(val elementType: Type, nullable: Boolean) : Type(nul return "Array<" + elementType.toKotlin() + ">" + isNullableStr() } - public override fun convertedToNotNull(): Type = ArrayType(elementType, false) + public override fun convertedToNotNull(): Type = ArrayType(elementType, false, converter) } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/types/ClassType.kt b/j2k/src/org/jetbrains/jet/j2k/ast/types/ClassType.kt index a9581acb754..b7fb26a431a 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/types/ClassType.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/types/ClassType.kt @@ -19,8 +19,11 @@ package org.jetbrains.jet.j2k.ast.types import org.jetbrains.jet.j2k.ast.Element import org.jetbrains.jet.j2k.ast.Identifier import java.util.ArrayList +import org.jetbrains.jet.j2k.Converter + +public open class ClassType(val `type`: Identifier, val parameters: List, nullable: Boolean, + converter: Converter) : MayBeNullableType(nullable, converter) { -public open class ClassType(val `type`: Identifier, val parameters: List, nullable: Boolean) : Type(nullable) { public override fun toKotlin(): String { // TODO change to map() when KT-2051 is fixed val parametersToKotlin = ArrayList() @@ -35,5 +38,5 @@ public open class ClassType(val `type`: Identifier, val parameters: List() { private var myResult: Type = EmptyType() @@ -37,7 +40,7 @@ public open class TypeVisitor(private val myConverter: Converter) : PsiTypeVisit if (name == "void") { myResult = PrimitiveType(Identifier("Unit")) } - else if (Node.PRIMITIVE_TYPES.contains(name)) { + else if (PRIMITIVE_TYPES_NAMES.contains(name)) { myResult = PrimitiveType(Identifier(StringUtil.capitalize(name))) } else { @@ -48,7 +51,7 @@ public open class TypeVisitor(private val myConverter: Converter) : PsiTypeVisit public override fun visitArrayType(arrayType: PsiArrayType?): Type { if (myResult is EmptyType) { - myResult = ArrayType(myConverter.typeToType(arrayType?.getComponentType()), true) + myResult = ArrayType(myConverter.typeToType(arrayType?.getComponentType()), true, myConverter) } return myResult @@ -63,18 +66,18 @@ public open class TypeVisitor(private val myConverter: Converter) : PsiTypeVisit if (resolvedClassTypeParams.size() == 1) { if ((resolvedClassTypeParams.get(0) as ClassType).`type`.name == "Any") { starParamList.add(StarProjectionType()) - myResult = ClassType(identifier, starParamList, true) + myResult = ClassType(identifier, starParamList, true, myConverter) } else { - myResult = ClassType(identifier, resolvedClassTypeParams, true) + myResult = ClassType(identifier, resolvedClassTypeParams, true, myConverter) } } else { - myResult = ClassType(identifier, resolvedClassTypeParams, true) + myResult = ClassType(identifier, resolvedClassTypeParams, true, myConverter) } } else { - myResult = ClassType(identifier, myConverter.typesToTypeList(classType.getParameters()), true) + myResult = ClassType(identifier, myConverter.typesToTypeList(classType.getParameters()), true, myConverter) } return myResult } @@ -121,7 +124,7 @@ public open class TypeVisitor(private val myConverter: Converter) : PsiTypeVisit val boundType: Type = (if (superTypes.size > 0) ClassType(Identifier(getClassTypeName(superTypes[0])), myConverter.typesToTypeList(superTypes[0].getParameters()), - true) + true, myConverter) else StarProjectionType()) typeParams.add(boundType)