New J2K: Add AssignmentStatementSplitAlsoConversion
This commit is contained in:
committed by
Ilya Kirillov
parent
58fbe7913e
commit
461ef071f4
@@ -35,6 +35,7 @@ object ConversionsRunner {
|
|||||||
+AssignmentStatementOperatorConversion()
|
+AssignmentStatementOperatorConversion()
|
||||||
+AssignmentStatementSimplifyValConversion()
|
+AssignmentStatementSimplifyValConversion()
|
||||||
+AssignmentStatementSimplifyAlsoConversion()
|
+AssignmentStatementSimplifyAlsoConversion()
|
||||||
|
+AssignmentStatementSplitAlsoConversion()
|
||||||
+PolyadicExpressionConversion(context)
|
+PolyadicExpressionConversion(context)
|
||||||
+OperatorExpressionConversion(context)
|
+OperatorExpressionConversion(context)
|
||||||
+ThrowStatementConversion()
|
+ThrowStatementConversion()
|
||||||
|
|||||||
+78
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.j2k.conversions
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.j2k.copyTreeAndDetach
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.*
|
||||||
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
|
|
||||||
|
class AssignmentStatementSplitAlsoConversion : RecursiveApplicableConversionBase() {
|
||||||
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
|
return recurse(
|
||||||
|
when (element) {
|
||||||
|
is JKBlock -> element.splitAssignmentExpressions()
|
||||||
|
is JKStatement ->
|
||||||
|
element.splitAsAssignmentExpressions()?.let { JKBlockStatementImpl(JKBlockImpl(it)) }
|
||||||
|
else -> null
|
||||||
|
} ?: element)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun JKBlock.splitAssignmentExpressions(): JKBlock? {
|
||||||
|
val newStatements = statements.map { it.splitAsAssignmentExpressions() ?: listOf(it) }
|
||||||
|
return if (newStatements.any { it.size > 1 }) {
|
||||||
|
JKBlockImpl(
|
||||||
|
newStatements.flatMap { statements ->
|
||||||
|
if (statements.size == 1) statements.map { it.detached(this) }
|
||||||
|
else statements
|
||||||
|
}
|
||||||
|
)
|
||||||
|
} else null
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun JKStatement.splitAsAssignmentExpressions(): List<JKStatement>? {
|
||||||
|
val expression = when (this) {
|
||||||
|
is JKKtAssignmentStatement -> expression
|
||||||
|
is JKDeclarationStatementImpl -> (declaredStatements.singleOrNull() as? JKLocalVariableImpl)?.initializer
|
||||||
|
else -> null
|
||||||
|
} ?: return null
|
||||||
|
|
||||||
|
val qualifiedExpression = expression as? JKQualifiedExpression ?: return null
|
||||||
|
val alsoCall = qualifiedExpression.selector as? JKKtAlsoCallExpression ?: return null
|
||||||
|
val innerAssignmentStatement = alsoCall.statement as? JKKtAssignmentStatement ?: return null
|
||||||
|
|
||||||
|
val secondAssignment = when (this) {
|
||||||
|
is JKKtAssignmentStatement ->
|
||||||
|
JKKtAssignmentStatementImpl(
|
||||||
|
::field.detached(),
|
||||||
|
innerAssignmentStatement.field.copyTreeAndDetach(),
|
||||||
|
operator
|
||||||
|
)
|
||||||
|
is JKDeclarationStatement -> {
|
||||||
|
val variable = declaredStatements.single() as JKLocalVariableImpl
|
||||||
|
JKDeclarationStatementImpl(
|
||||||
|
listOf(
|
||||||
|
JKLocalVariableImpl(
|
||||||
|
variable::type.detached(),
|
||||||
|
variable::name.detached(),
|
||||||
|
innerAssignmentStatement.field.copyTreeAndDetach(),
|
||||||
|
variable.mutability
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else -> error("expression should be either JKKtAssignmentStatement or JKDeclarationStatementImpl")
|
||||||
|
}
|
||||||
|
|
||||||
|
return listOf(
|
||||||
|
JKKtAssignmentStatementImpl(
|
||||||
|
innerAssignmentStatement::field.detached(),
|
||||||
|
qualifiedExpression::receiver.detached(),
|
||||||
|
innerAssignmentStatement.operator
|
||||||
|
),
|
||||||
|
secondAssignment
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user