New J2K: Add forEach statement generation
This commit is contained in:
committed by
Ilya Kirillov
parent
7b5ffce7aa
commit
3ddc05fdd9
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user