Java to Kotlin converter: code refactoring

This commit is contained in:
Valentin Kipyatkov
2014-06-26 22:32:39 +04:00
parent 66005a3469
commit a58141b576
3 changed files with 25 additions and 18 deletions
@@ -167,8 +167,8 @@ class ConstructorConverter(private val converter: Converter) {
return generateArtificialPrimaryConstructor(psiClass.getName()!!, classBody)
}
else {
replaceConstructorCallsInFactoryFunctions(classBody, psiClass.getName()!!)
return classBody
val updatedFunctions = replaceConstructorCallsInFactoryFunctions(classBody.factoryFunctions, psiClass.getName()!!)
return ClassBody(classBody.primaryConstructorSignature, classBody.members, classBody.classObjectMembers, updatedFunctions, classBody.lBrace, classBody.rBrace)
}
}
@@ -176,13 +176,14 @@ class ConstructorConverter(private val converter: Converter) {
assert(classBody.primaryConstructorSignature == null)
val fieldsToInitialize = classBody.members.filterIsInstance(javaClass<Field>()).filter { it.isVal }
for (factoryFunction in classBody.factoryFunctions) {
val body = factoryFunction.body!!
val updatedFactoryFunctions = ArrayList<FactoryFunction>()
for (function in classBody.factoryFunctions) {
val body = function.body!!
// 2 cases: secondary constructor either calls another constructor or does not call any
val newStatements = replaceConstructorCallInFactoryFunction(body, className) ?:
insertCallToArtificialPrimary(body, className, fieldsToInitialize)
factoryFunction.body = Block(newStatements, LBrace().assignNoPrototype(), RBrace().assignNoPrototype()).assignNoPrototype()
//TODO: no assignment here
val newBody = Block(newStatements, LBrace().assignNoPrototype(), RBrace().assignNoPrototype()).assignNoPrototype()
updatedFactoryFunctions.add(function.withBody(newBody))
}
val parameters = fieldsToInitialize.map { field ->
@@ -196,15 +197,18 @@ class ConstructorConverter(private val converter: Converter) {
val parameterList = ParameterList(parameters).assignNoPrototype()
val constructorSignature = PrimaryConstructorSignature(modifiers, parameterList).assignNoPrototype()
val updatedMembers = classBody.members.filter { !fieldsToInitialize.contains(it) }
return ClassBody(constructorSignature, updatedMembers, classBody.classObjectMembers, classBody.factoryFunctions, classBody.lBrace, classBody.rBrace)
return ClassBody(constructorSignature, updatedMembers, classBody.classObjectMembers, updatedFactoryFunctions, classBody.lBrace, classBody.rBrace)
}
private fun replaceConstructorCallsInFactoryFunctions(classBody: ClassBody, className: String) {
for (factoryFunction in classBody.factoryFunctions) {
val body = factoryFunction.body!!
private fun replaceConstructorCallsInFactoryFunctions(functions: List<FactoryFunction>, className: String): List<FactoryFunction> {
return functions.map { function ->
val body = function.body!!
val statements = replaceConstructorCallInFactoryFunction(body, className)
if (statements != null) {
factoryFunction.body = Block(statements, body.lBrace, body.rBrace).assignPrototypesFrom(body)
function.withBody(Block(statements, body.lBrace, body.rBrace).assignPrototypesFrom(body))
}
else {
function
}
}
}
@@ -58,5 +58,8 @@ class FactoryFunction(name: Identifier,
returnType: Type,
parameterList: ParameterList,
typeParameterList: TypeParameterList,
block: Block)
: Function(name, annotations, modifiers, returnType, typeParameterList, parameterList, block, false)
body: Block)
: Function(name, annotations, modifiers, returnType, typeParameterList, parameterList, body, false)
fun FactoryFunction.withBody(body: Block)
= FactoryFunction(name, annotations, modifiers, returnType, parameterList, typeParameterList, body).assignPrototypesFrom(this)
@@ -22,10 +22,10 @@ open class Function(
val name: Identifier,
annotations: Annotations,
modifiers: Modifiers,
val `type`: Type,
val returnType: Type,
val typeParameterList: TypeParameterList,
val parameterList: ParameterList,
var body: Block?,
val body: Block?,
val isInTrait: Boolean
) : Member(annotations, modifiers) {
@@ -52,14 +52,14 @@ open class Function(
.append(parameterList)
.append(")")
if (!`type`.isUnit()) {
builder append ":" append `type`
if (!returnType.isUnit()) {
builder append ":" append returnType
}
typeParameterList.appendWhere(builder)
if (body != null) {
builder append " " append body!!
builder append " " append body
}
}
}