New J2K: Add continue statement
This commit is contained in:
committed by
Ilya Kirillov
parent
ed61aac4fd
commit
0a08467b45
@@ -391,6 +391,12 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
|||||||
else
|
else
|
||||||
JKBreakStatementImpl()
|
JKBreakStatementImpl()
|
||||||
}
|
}
|
||||||
|
is PsiContinueStatement -> {
|
||||||
|
val label = labelIdentifier?.let {
|
||||||
|
JKLabelTextImpl(JKNameIdentifierImpl(it.text))
|
||||||
|
} ?: JKLabelEmptyImpl()
|
||||||
|
JKContinueStatementImpl(label)
|
||||||
|
}
|
||||||
else -> TODO("for ${this::class}")
|
else -> TODO("for ${this::class}")
|
||||||
}.also {
|
}.also {
|
||||||
if (this != null) backAnnotation[it] = this
|
if (this != null) backAnnotation[it] = this
|
||||||
|
|||||||
@@ -300,6 +300,21 @@ class NewCodeBuilder {
|
|||||||
printer.printWithNoIndent("super")
|
printer.printWithNoIndent("super")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitContinueStatement(continueStatement: JKContinueStatement) {
|
||||||
|
printer.printWithNoIndent("continue ")
|
||||||
|
continueStatement.label.accept(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitLabelEmpty(labelEmpty: JKLabelEmpty) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitLabelText(labelText: JKLabelText) {
|
||||||
|
printer.printWithNoIndent("@")
|
||||||
|
labelText.label.accept(this)
|
||||||
|
printer.printWithNoIndent(" ")
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitPostfixExpression(postfixExpression: JKPostfixExpression) {
|
override fun visitPostfixExpression(postfixExpression: JKPostfixExpression) {
|
||||||
postfixExpression.expression.accept(this)
|
postfixExpression.expression.accept(this)
|
||||||
printer.printWithNoIndent(postfixExpression.operator.operatorText)
|
printer.printWithNoIndent(postfixExpression.operator.operatorText)
|
||||||
|
|||||||
@@ -6,12 +6,9 @@
|
|||||||
package org.jetbrains.kotlin.j2k.conversions
|
package org.jetbrains.kotlin.j2k.conversions
|
||||||
|
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import jdk.nashorn.internal.ir.BlockStatement
|
|
||||||
import org.jetbrains.kotlin.j2k.ConversionContext
|
import org.jetbrains.kotlin.j2k.ConversionContext
|
||||||
import org.jetbrains.kotlin.j2k.ReferenceSearcher
|
import org.jetbrains.kotlin.j2k.ReferenceSearcher
|
||||||
import org.jetbrains.kotlin.j2k.ast.*
|
|
||||||
import org.jetbrains.kotlin.j2k.hasWriteAccesses
|
import org.jetbrains.kotlin.j2k.hasWriteAccesses
|
||||||
import org.jetbrains.kotlin.j2k.isInSingleLine
|
|
||||||
import org.jetbrains.kotlin.j2k.tree.*
|
import org.jetbrains.kotlin.j2k.tree.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
@@ -51,8 +48,9 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
|
|||||||
if (loopStatement.updater is JKEmptyStatement) return loopStatement::body.detached()
|
if (loopStatement.updater is JKEmptyStatement) return loopStatement::body.detached()
|
||||||
val continueStatementConverter = object : RecursiveApplicableConversionBase() {
|
val continueStatementConverter = object : RecursiveApplicableConversionBase() {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
if (element !is JKJavaContinueStatement) return recurse(element)
|
if (element !is JKContinueStatement) return recurse(element)
|
||||||
//TODO ??? if (statement.findContinuedStatement()?.toContinuedLoop() != this@ForConverter.statement) return null
|
val elementPsi = element.psi<PsiContinueStatement>()!!
|
||||||
|
if (elementPsi.findContinuedStatement()?.toContinuedLoop() != loopStatement.psi<PsiForStatement>()) return recurse(element)
|
||||||
val statements = listOf(loopStatement.updater, element)
|
val statements = listOf(loopStatement.updater, element)
|
||||||
return recurse(JKBlockStatementImpl(JKBlockImpl(statements)))
|
return recurse(JKBlockStatementImpl(JKBlockImpl(statements)))
|
||||||
}
|
}
|
||||||
@@ -129,6 +127,14 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun PsiStatement.toContinuedLoop(): PsiLoopStatement? {
|
||||||
|
return when (this) {
|
||||||
|
is PsiLoopStatement -> this
|
||||||
|
is PsiLabeledStatement -> statement?.toContinuedLoop()
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun forIterationRange(
|
private fun forIterationRange(
|
||||||
start: JKExpression,
|
start: JKExpression,
|
||||||
bound: JKExpression,
|
bound: JKExpression,
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ class JKJavaOperatorImpl private constructor(val token: IElementType) : JKOperat
|
|||||||
JavaTokenType.PLUSPLUS -> "++"
|
JavaTokenType.PLUSPLUS -> "++"
|
||||||
JavaTokenType.EXCL -> "!"
|
JavaTokenType.EXCL -> "!"
|
||||||
JavaTokenType.ASTERISKEQ -> "*="
|
JavaTokenType.ASTERISKEQ -> "*="
|
||||||
|
JavaTokenType.EQEQ -> "=="
|
||||||
else -> TODO("TODO $token")
|
else -> TODO("TODO $token")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -381,4 +381,17 @@ val JKStatement.statements: List<JKStatement>
|
|||||||
when (this) {
|
when (this) {
|
||||||
is JKBlockStatement -> block.statements
|
is JKBlockStatement -> block.statements
|
||||||
else -> listOf(this)
|
else -> listOf(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class JKLabelEmptyImpl : JKLabelEmpty, JKElementBase() {
|
||||||
|
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitLabelEmpty(this, data)
|
||||||
|
}
|
||||||
|
class JKLabelTextImpl(label: JKNameIdentifier) : JKLabelText, JKBranchElementBase() {
|
||||||
|
override val label: JKNameIdentifier by child(label)
|
||||||
|
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitLabelText(this, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
class JKContinueStatementImpl(label: JKLabel) : JKContinueStatement, JKBranchElementBase() {
|
||||||
|
override var label: JKLabel by child(label)
|
||||||
|
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitContinueStatement(this, data)
|
||||||
|
}
|
||||||
@@ -286,7 +286,3 @@ class JKKtOperatorExpressionImpl(
|
|||||||
override var argument: JKExpression by child(argument)
|
override var argument: JKExpression by child(argument)
|
||||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtOperatorExpression(this, data)
|
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtOperatorExpression(this, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
class JKJavaContinueStatementImpl() : JKJavaContinueStatement, JKElementBase() {
|
|
||||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaContinueStatement(this, data)
|
|
||||||
}
|
|
||||||
@@ -250,3 +250,15 @@ interface JKDelegationConstructorCall : JKMethodCallExpression {
|
|||||||
val expression: JKExpression
|
val expression: JKExpression
|
||||||
override val arguments: JKExpressionList
|
override val arguments: JKExpressionList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface JKLabel : JKTreeElement
|
||||||
|
|
||||||
|
interface JKLabelEmpty : JKLabel
|
||||||
|
|
||||||
|
interface JKLabelText : JKLabel {
|
||||||
|
val label: JKNameIdentifier
|
||||||
|
}
|
||||||
|
|
||||||
|
interface JKContinueStatement : JKStatement {
|
||||||
|
var label: JKLabel
|
||||||
|
}
|
||||||
@@ -54,6 +54,10 @@ interface JKVisitor<out R, in D> {
|
|||||||
fun visitAssignableExpression(assignableExpression: JKAssignableExpression, data: D): R = visitExpression(assignableExpression, data)
|
fun visitAssignableExpression(assignableExpression: JKAssignableExpression, data: D): R = visitExpression(assignableExpression, data)
|
||||||
fun visitLambdaExpression(lambdaExpression: JKLambdaExpression, data: D): R = visitExpression(lambdaExpression, data)
|
fun visitLambdaExpression(lambdaExpression: JKLambdaExpression, data: D): R = visitExpression(lambdaExpression, data)
|
||||||
fun visitDelegationConstructorCall(delegationConstructorCall: JKDelegationConstructorCall, data: D): R = visitMethodCallExpression(delegationConstructorCall, data)
|
fun visitDelegationConstructorCall(delegationConstructorCall: JKDelegationConstructorCall, data: D): R = visitMethodCallExpression(delegationConstructorCall, data)
|
||||||
|
fun visitLabel(label: JKLabel, data: D): R = visitTreeElement(label, data)
|
||||||
|
fun visitLabelEmpty(labelEmpty: JKLabelEmpty, data: D): R = visitLabel(labelEmpty, data)
|
||||||
|
fun visitLabelText(labelText: JKLabelText, data: D): R = visitLabel(labelText, data)
|
||||||
|
fun visitContinueStatement(continueStatement: JKContinueStatement, data: D): R = visitStatement(continueStatement, data)
|
||||||
fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data)
|
fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data)
|
||||||
fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data)
|
fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data)
|
||||||
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data)
|
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data)
|
||||||
|
|||||||
@@ -105,6 +105,14 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
|
|||||||
override fun visitLambdaExpression(lambdaExpression: JKLambdaExpression, data: Nothing?) = visitLambdaExpression(lambdaExpression)
|
override fun visitLambdaExpression(lambdaExpression: JKLambdaExpression, data: Nothing?) = visitLambdaExpression(lambdaExpression)
|
||||||
fun visitDelegationConstructorCall(delegationConstructorCall: JKDelegationConstructorCall) = visitMethodCallExpression(delegationConstructorCall, null)
|
fun visitDelegationConstructorCall(delegationConstructorCall: JKDelegationConstructorCall) = visitMethodCallExpression(delegationConstructorCall, null)
|
||||||
override fun visitDelegationConstructorCall(delegationConstructorCall: JKDelegationConstructorCall, data: Nothing?) = visitDelegationConstructorCall(delegationConstructorCall)
|
override fun visitDelegationConstructorCall(delegationConstructorCall: JKDelegationConstructorCall, data: Nothing?) = visitDelegationConstructorCall(delegationConstructorCall)
|
||||||
|
fun visitLabel(label: JKLabel) = visitTreeElement(label, null)
|
||||||
|
override fun visitLabel(label: JKLabel, data: Nothing?) = visitLabel(label)
|
||||||
|
fun visitLabelEmpty(labelEmpty: JKLabelEmpty) = visitLabel(labelEmpty, null)
|
||||||
|
override fun visitLabelEmpty(labelEmpty: JKLabelEmpty, data: Nothing?) = visitLabelEmpty(labelEmpty)
|
||||||
|
fun visitLabelText(labelText: JKLabelText) = visitLabel(labelText, null)
|
||||||
|
override fun visitLabelText(labelText: JKLabelText, data: Nothing?) = visitLabelText(labelText)
|
||||||
|
fun visitContinueStatement(continueStatement: JKContinueStatement) = visitStatement(continueStatement, null)
|
||||||
|
override fun visitContinueStatement(continueStatement: JKContinueStatement, data: Nothing?) = visitContinueStatement(continueStatement)
|
||||||
fun visitJavaField(javaField: JKJavaField) = visitField(javaField, null)
|
fun visitJavaField(javaField: JKJavaField) = visitField(javaField, null)
|
||||||
override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField)
|
override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField)
|
||||||
fun visitJavaMethod(javaMethod: JKJavaMethod) = visitMethod(javaMethod, null)
|
fun visitJavaMethod(javaMethod: JKJavaMethod) = visitMethod(javaMethod, null)
|
||||||
|
|||||||
Reference in New Issue
Block a user