From 4b0840beb1d942b0b4bdb50aab9c4d926d3e5d11 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 27 Nov 2018 13:55:40 +0300 Subject: [PATCH] New J2K: Add multiple updaters to Java `for` loop --- .../kotlin/j2k/conversions/ForConversion.kt | 15 ++++++++------- .../org/jetbrains/kotlin/j2k/tree/impl/j.kt | 4 ++-- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt index 7039bd275e3..b6f79322455 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt @@ -44,13 +44,13 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl } private fun createWhileBody(loopStatement: JKJavaForLoopStatement): JKStatement { - if (loopStatement.updater is JKEmptyStatement) return loopStatement::body.detached() + if (loopStatement.updaters.singleOrNull() is JKEmptyStatement) return loopStatement::body.detached() val continueStatementConverter = object : RecursiveApplicableConversionBase() { override fun applyToElement(element: JKTreeElement): JKTreeElement { if (element !is JKContinueStatement) return recurse(element) val elementPsi = element.psi()!! if (elementPsi.findContinuedStatement()?.toContinuedLoop() != loopStatement.psi()) return recurse(element) - val statements = listOf(loopStatement.updater, element) + val statements = loopStatement.updaters + element return recurse(JKBlockStatementImpl(JKBlockImpl(statements))) } @@ -72,14 +72,14 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl val statements = if (hasNameConflict) { - listOf(continueStatementConverter.applyToElement(body) as JKStatement, loopStatement::updater.detached()) + listOf(continueStatementConverter.applyToElement(body) as JKStatement) + loopStatement::updaters.detached() } else { - body.block::statements.detached() + loopStatement::updater.detached() + body.block::statements.detached() + loopStatement::updaters.detached() } return JKBlockStatementImpl(JKBlockImpl(statements)) } else { val statements = - listOf(continueStatementConverter.applyToElement(body) as JKStatement, loopStatement::updater.detached()) + listOf(continueStatementConverter.applyToElement(body) as JKStatement) + loopStatement::updaters.detached() return JKBlockStatementImpl(JKBlockImpl(statements)) } } @@ -98,7 +98,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl if (left.identifier.target != loopVar) return null val start = loopVar::initializer.detached() val operationType = - (loopStatement.updater as? JKExpressionStatement)?.expression?.isVariableIncrementOrDecrement(loopVar) + (loopStatement.updaters.singleOrNull() as? JKExpressionStatement)?.expression?.isVariableIncrementOrDecrement(loopVar) val reversed = when (operationType?.token?.text) { "++" -> false "--" -> true @@ -233,6 +233,8 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl private fun indicesByCollectionSize(javaSizeCall: JKQualifiedExpression): JKQualifiedExpression? { val methodCall = javaSizeCall.selector as? JKMethodCallExpression ?: return null + val receiverType = javaSizeCall.receiver.type(context) as? JKClassType ?: return null + //TODO check if receiver type is Collection if (methodCall.identifier.name == "size" && methodCall.arguments.expressions.isEmpty()) { return toIndicesCall(javaSizeCall) @@ -243,7 +245,6 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl private fun indicesByArrayLength(javaSizeCall: JKQualifiedExpression): JKQualifiedExpression? { val methodCall = javaSizeCall.selector as? JKFieldAccessExpression ?: return null val receiverType = javaSizeCall.receiver.type(context) - //TODO check if receiver type is kotlin.array if (methodCall.identifier.name == "length" && receiverType is JKJavaArrayType) { return toIndicesCall(javaSizeCall) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index bb0463e1502..6c81762eb2d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -281,10 +281,10 @@ class JKJavaAssertStatementImpl(condition: JKExpression, description: JKExpressi override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaAssertStatement(this, data) } -class JKJavaForLoopStatementImpl(initializer: JKStatement, condition: JKExpression, updater: JKStatement, body: JKStatement) : +class JKJavaForLoopStatementImpl(initializer: JKStatement, condition: JKExpression, updaters: List, body: JKStatement) : JKJavaForLoopStatement, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { override var body by child(body) - override var updater by child(updater) + override var updaters by children(updaters) override var condition by child(condition) override var initializer by child(initializer) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index 594444c99e7..a23ab30523f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -85,7 +85,7 @@ interface JKJavaAssertStatement : JKStatement { interface JKJavaForLoopStatement : JKLoopStatement { var initializer: JKStatement var condition: JKExpression - var updater: JKStatement + var updaters: List } interface JKJavaInstanceOfExpression : JKExpression {