New J2K: Add forEach statement generation

This commit is contained in:
Ilya Kirillov
2018-11-10 20:10:37 +03:00
committed by Ilya Kirillov
parent 7b5ffce7aa
commit 3ddc05fdd9
8 changed files with 28 additions and 22 deletions
@@ -362,6 +362,12 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
is PsiForStatement -> JKJavaForLoopStatementImpl(
initialization.toJK(), with(expressionTreeMapper) { condition.toJK() }, update.toJK(), body.toJK()
)
is PsiForeachStatement ->
JKForInStatementImpl(
iterationParameter.toJK(),
with(expressionTreeMapper) { iteratedValue?.toJK() ?: JKStubExpressionImpl() },
body?.toJK() ?: blockStatement()
)
is PsiBlockStatement -> JKBlockStatementImpl(codeBlock.toJK())
is PsiWhileStatement -> JKWhileStatementImpl(with(expressionTreeMapper) { condition.toJK() }, body.toJK())
is PsiDoWhileStatement -> JKDoWhileStatementImpl(body.toJK(), with(expressionTreeMapper) { condition.toJK() })
@@ -84,7 +84,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
}
}
private fun convertToForeach(loopStatement: JKJavaForLoopStatement): JKKtForInStatement? {
private fun convertToForeach(loopStatement: JKJavaForLoopStatement): JKForInStatement? {
val loopVar =
(loopStatement.initializer as? JKDeclarationStatement)?.declaredStatements?.singleOrNull() as? JKLocalVariable ?: return null
val loopVarPsi = loopVar.psi<PsiLocalVariable>() ?: return null
@@ -126,7 +126,7 @@ class ForConversion(private val context: ConversionContext) : RecursiveApplicabl
loopVar::name.detached(),
JKStubExpressionImpl()
)
return JKKtForInStatementImpl(
return JKForInStatementImpl(
loopVarDeclaration,
range,
loopStatement::body.detached()
@@ -484,4 +484,12 @@ class JKEnumConstantImpl(
}
fun JKTypeElement.present(): Boolean =
type != JKNoTypeImpl
type != JKNoTypeImpl
class JKForInStatementImpl(declaration: JKDeclaration, iterationExpression: JKExpression, body: JKStatement) :
JKForInStatement, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override var declaration: JKDeclaration by child(declaration)
override var iterationExpression: JKExpression by child(iterationExpression)
override var body: JKStatement by child(body)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitForInStatement(this, data)
}
@@ -237,14 +237,6 @@ fun JKClass.getOrCreateInitDeclaration(): JKKtInitDeclaration {
return newDeclaration
}
class JKKtForInStatementImpl(declaration: JKDeclaration, iterationExpression: JKExpression, body: JKStatement) :
JKKtForInStatement, JKBranchElementBase() {
override var declaration: JKDeclaration by child(declaration)
override var iterationExpression: JKExpression by child(iterationExpression)
override var body: JKStatement by child(body)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtForInStatement(this, data)
}
class JKKtOperatorExpressionImpl(
receiver: JKExpression,
override var identifier: JKMethodSymbol,
@@ -290,4 +290,10 @@ interface JKTypeParameterListOwner : JKTreeElement {
interface JKEnumConstant : JKField {
val arguments: JKExpressionList
}
interface JKForInStatement : JKStatement {
var declaration: JKDeclaration
var iterationExpression: JKExpression
var body: JKStatement
}
@@ -78,12 +78,6 @@ interface JKKtInitDeclaration : JKDeclaration {
var block: JKBlock
}
interface JKKtForInStatement : JKStatement {
var declaration: JKDeclaration
var iterationExpression: JKExpression
var body: JKStatement
}
interface JKKtOperatorExpression : JKExpression {
var receiver: JKExpression
var identifier: JKMethodSymbol
@@ -63,7 +63,8 @@ interface JKVisitor<out R, in D> {
fun visitTypeParameterList(typeParameterList: JKTypeParameterList, data: D): R = visitTreeElement(typeParameterList, data)
fun visitTypeParameter(typeParameter: JKTypeParameter, data: D): R = visitTreeElement(typeParameter, data)
fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner, data: D): R = visitTreeElement(typeParameterListOwner, data)
fun visitEnumConstant(enumConstant: JKEnumConstant, data: D): R = visitTreeElement(enumConstant, data)
fun visitEnumConstant(enumConstant: JKEnumConstant, data: D): R = visitField(enumConstant, data)
fun visitForInStatement(forInStatement: JKForInStatement, data: D): R = visitStatement(forInStatement, data)
fun visitJavaField(javaField: JKJavaField, data: D): R = visitField(javaField, data)
fun visitJavaMethod(javaMethod: JKJavaMethod, data: D): R = visitMethod(javaMethod, data)
fun visitJavaMethodCallExpression(javaMethodCallExpression: JKJavaMethodCallExpression, data: D): R = visitMethodCallExpression(javaMethodCallExpression, data)
@@ -104,7 +105,6 @@ interface JKVisitor<out R, in D> {
fun visitKtValueWhenLabel(ktValueWhenLabel: JKKtValueWhenLabel, data: D): R = visitKtWhenLabel(ktValueWhenLabel, data)
fun visitKtIsExpression(ktIsExpression: JKKtIsExpression, data: D): R = visitExpression(ktIsExpression, data)
fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration, data: D): R = visitDeclaration(ktInitDeclaration, data)
fun visitKtForInStatement(ktForInStatement: JKKtForInStatement, data: D): R = visitStatement(ktForInStatement, data)
fun visitKtOperatorExpression(ktOperatorExpression: JKKtOperatorExpression, data: D): R = visitExpression(ktOperatorExpression, data)
fun visitKtConvertedFromForLoopSyntheticWhileStatement(ktConvertedFromForLoopSyntheticWhileStatement: JKKtConvertedFromForLoopSyntheticWhileStatement, data: D): R = visitStatement(ktConvertedFromForLoopSyntheticWhileStatement, data)
fun visitKtThrowExpression(ktThrowExpression: JKKtThrowExpression, data: D): R = visitExpression(ktThrowExpression, data)
@@ -123,8 +123,10 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitTypeParameter(typeParameter: JKTypeParameter, data: Nothing?) = visitTypeParameter(typeParameter)
fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner) = visitTreeElement(typeParameterListOwner, null)
override fun visitTypeParameterListOwner(typeParameterListOwner: JKTypeParameterListOwner, data: Nothing?) = visitTypeParameterListOwner(typeParameterListOwner)
fun visitEnumConstant(enumConstant: JKEnumConstant) = visitTreeElement(enumConstant, null)
fun visitEnumConstant(enumConstant: JKEnumConstant) = visitField(enumConstant, null)
override fun visitEnumConstant(enumConstant: JKEnumConstant, data: Nothing?) = visitEnumConstant(enumConstant)
fun visitForInStatement(forInStatement: JKForInStatement) = visitStatement(forInStatement, null)
override fun visitForInStatement(forInStatement: JKForInStatement, data: Nothing?) = visitForInStatement(forInStatement)
fun visitJavaField(javaField: JKJavaField) = visitField(javaField, null)
override fun visitJavaField(javaField: JKJavaField, data: Nothing?) = visitJavaField(javaField)
fun visitJavaMethod(javaMethod: JKJavaMethod) = visitMethod(javaMethod, null)
@@ -205,8 +207,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitKtIsExpression(ktIsExpression: JKKtIsExpression, data: Nothing?) = visitKtIsExpression(ktIsExpression)
fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration) = visitDeclaration(ktInitDeclaration, null)
override fun visitKtInitDeclaration(ktInitDeclaration: JKKtInitDeclaration, data: Nothing?) = visitKtInitDeclaration(ktInitDeclaration)
fun visitKtForInStatement(ktForInStatement: JKKtForInStatement) = visitStatement(ktForInStatement, null)
override fun visitKtForInStatement(ktForInStatement: JKKtForInStatement, data: Nothing?) = visitKtForInStatement(ktForInStatement)
fun visitKtOperatorExpression(ktOperatorExpression: JKKtOperatorExpression) = visitExpression(ktOperatorExpression, null)
override fun visitKtOperatorExpression(ktOperatorExpression: JKKtOperatorExpression, data: Nothing?) = visitKtOperatorExpression(ktOperatorExpression)
fun visitKtConvertedFromForLoopSyntheticWhileStatement(ktConvertedFromForLoopSyntheticWhileStatement: JKKtConvertedFromForLoopSyntheticWhileStatement) = visitStatement(ktConvertedFromForLoopSyntheticWhileStatement, null)