From 3ddc05fdd912360c47c286228d112c2774286d7f Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 10 Nov 2018 20:10:37 +0300 Subject: [PATCH] New J2K: Add forEach statement generation --- .../org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt | 6 ++++++ .../jetbrains/kotlin/j2k/conversions/ForConversion.kt | 4 ++-- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 10 +++++++++- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt | 8 -------- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt | 6 ++++++ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt | 6 ------ .../jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt | 4 ++-- .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 6 +++--- 8 files changed, 28 insertions(+), 22 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 4b16575dfd4..35b6fa09d2f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -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() }) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt index 86048e9c20e..f93e6b26c9c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ForConversion.kt @@ -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() ?: 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() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index fd63e47915b..cc73b87ba92 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -484,4 +484,12 @@ class JKEnumConstantImpl( } fun JKTypeElement.present(): Boolean = - type != JKNoTypeImpl \ No newline at end of file + 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 accept(visitor: JKVisitor, data: D): R = visitor.visitForInStatement(this, data) +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index a95f1596b9d..026b4a0f73b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -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 accept(visitor: JKVisitor, data: D): R = visitor.visitKtForInStatement(this, data) -} - class JKKtOperatorExpressionImpl( receiver: JKExpression, override var identifier: JKMethodSymbol, diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 5f01b266974..d6acc1b0d3c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -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 } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt index 21c15607548..10e4024572d 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt @@ -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 diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index df8b9b5c4f0..2cebbab5fbe 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -63,7 +63,8 @@ interface JKVisitor { 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 { 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) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index 09f0aacd6be..5db2fb23145 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -123,8 +123,10 @@ interface JKVisitorVoid : JKVisitor { 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 { 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)