New J2K: Add try statement

This commit is contained in:
Ilya Kirillov
2018-11-06 16:04:03 +03:00
committed by Ilya Kirillov
parent 594d0ba7e9
commit 8d45bce06a
12 changed files with 163 additions and 2 deletions
@@ -26,6 +26,7 @@ object ConversionsRunner {
+BinaryExpressionConversion(context)
+ThrowStatementConversion()
+ArrayInitializerConversion(context)
+TryStatementConversion(context)
+ModalityConversion(context)
+ImplicitInitializerConversion()
+DefaultArgumentsConversion(context)
@@ -382,11 +382,21 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
is PsiEmptyStatement -> JKEmptyStatementImpl()
is PsiThrowStatement ->
JKJavaThrowStatementImpl(with(expressionTreeMapper) { exception.toJK() })
is PsiTryStatement ->
JKJavaTryStatementImpl(
tryBlock?.toJK() ?: JKBodyStub,
finallyBlock?.toJK() ?: JKBodyStub,
catchSections.map { it.toJK() }
)
else -> TODO("for ${this::class}")
}.also {
if (this != null) (it as PsiOwner).psi = this
}
}
fun PsiCatchSection.toJK(): JKJavaTryCatchSection =
JKJavaTryCatchSectionImpl(parameter?.toJK()!!, catchBlock?.toJK() ?: JKBodyStub)
.also { it.psi = this }
}
//TODO better way than generateSequence.last??
@@ -45,6 +45,28 @@ class NewCodeBuilder {
printer.print("/* !!! Hit visitElement for element type: ${treeElement::class} !!! */")
}
override fun visitKtTryExpression(ktTryExpression: JKKtTryExpression) {
printer.printlnWithNoIndent("try ")
if (ktTryExpression.tryBlock != JKBodyStub) {
printer.block { ktTryExpression.tryBlock.accept(this) }
}
ktTryExpression.catchSections.forEach { it.accept(this) }
if (ktTryExpression.finallyBlock != JKBodyStub) {
printer.printlnWithNoIndent("finally ")
printer.block { ktTryExpression.finallyBlock.accept(this) }
}
}
override fun visitKtTryCatchSection(ktTryCatchSection: JKKtTryCatchSection) {
printer.printWithNoIndent("catch ")
printer.par {
ktTryCatchSection.parameter.accept(this)
}
if (ktTryCatchSection.block != JKBodyStub) {
printer.block { ktTryCatchSection.block.accept(this) }
}
}
override fun visitKtForInStatement(ktForInStatement: JKKtForInStatement) {
printer.printWithNoIndent("for (")
ktForInStatement.declaration.accept(this)
@@ -0,0 +1,41 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.j2k.conversions
import org.jetbrains.kotlin.j2k.ConversionContext
import org.jetbrains.kotlin.j2k.copyTreeAndDetach
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.impl.*
class TryStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaTryStatement) return recurse(element)
val tryExpression = JKKtTryExpressionImpl(
element::tryBlock.detached(),
element::finallyBlock.detached(),
element.catchSections.flatMap(::convertCatchSection)
)
return recurse(JKExpressionStatementImpl(tryExpression))
}
private fun convertCatchSection(javaCatchSection: JKJavaTryCatchSection): List<JKKtTryCatchSection> {
javaCatchSection.block.detach(javaCatchSection)
return javaCatchSection.parameter.type.type.let {
(it as? JKJavaDisjunctionType)?.disjunctions ?: listOf(it)
}.map {
val parameter = JKParameterImpl(
JKTypeElementImpl(it),
javaCatchSection.parameter.name.copyTreeAndDetach(),
JKModifierListImpl()
)
JKKtTryCatchSectionImpl(
parameter,
javaCatchSection.block.copyTreeAndDetach()
)
}
}
}
@@ -20,6 +20,7 @@ import com.intellij.psi.JavaTokenType
import com.intellij.psi.impl.source.tree.ElementType.OPERATION_BIT_SET
import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.ast.Parameter
import org.jetbrains.kotlin.j2k.tree.*
import org.jetbrains.kotlin.j2k.tree.JKLiteralExpression.LiteralType.*
import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor
@@ -232,6 +233,11 @@ object JKJavaVoidType : JKType {
class JKJavaArrayTypeImpl(override val type: JKType, override var nullability: Nullability = Nullability.Default) : JKJavaArrayType {
}
class JKJavaDisjunctionTypeImpl(
override val disjunctions: List<JKType>,
override val nullability: Nullability = Nullability.Default
) : JKJavaDisjunctionType
class JKReturnStatementImpl(expression: JKExpression) : JKBranchElementBase(), JKReturnStatement, PsiOwner by PsiOwnerImpl() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitReturnStatement(this, data)
@@ -310,4 +316,25 @@ class JKJavaLabelSwitchCaseImpl(
class JKJavaThrowStatementImpl(exception: JKExpression) : JKJavaThrowStatement, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override var exception: JKExpression by child(exception)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaThrowStatement(this, data)
}
class JKJavaTryStatementImpl(
tryBlock: JKBlock,
finallyBlock: JKBlock,
catchSections: List<JKJavaTryCatchSection>
) : JKJavaTryStatement,
JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override var tryBlock: JKBlock by child(tryBlock)
override var finallyBlock: JKBlock by child(finallyBlock)
override var catchSections: List<JKJavaTryCatchSection> by children(catchSections)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaTryStatement(this, data)
}
class JKJavaTryCatchSectionImpl(
parameter: JKParameter,
block: JKBlock
) : JKJavaTryCatchSection, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
override var parameter: JKParameter by child(parameter)
override var block: JKBlock by child(block)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaTryCatchSection(this, data)
}
@@ -265,4 +265,24 @@ class JKKtConvertedFromForLoopSyntheticWhileStatementImpl(
class JKKtThrowExpressionImpl(exception: JKExpression) : JKKtThrowExpression, JKBranchElementBase() {
override var exception: JKExpression by child(exception)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtThrowExpression(this, data)
}
class JKKtTryExpressionImpl(
tryBlock: JKBlock,
finallyBlock: JKBlock,
catchSections: List<JKKtTryCatchSection>
) : JKKtTryExpression, JKBranchElementBase(){
override var tryBlock: JKBlock by child(tryBlock)
override var finallyBlock: JKBlock by child(finallyBlock)
override var catchSections: List<JKKtTryCatchSection> by children(catchSections)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtTryExpression(this, data)
}
class JKKtTryCatchSectionImpl(
parameter: JKParameter,
block: JKBlock
) : JKKtTryCatchSection, JKBranchElementBase() {
override var parameter: JKParameter by child(parameter)
override var block: JKBlock by child(block)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitKtTryCatchSection(this, data)
}
+12 -1
View File
@@ -88,11 +88,22 @@ interface JKJavaAssignmentExpression : JKExpression, JKBranchElement {
var operator: JKOperator
}
interface JKJavaThrowStatement : JKStatement {
var exception: JKExpression
}
interface JKJavaTryStatement : JKStatement {
var tryBlock: JKBlock
var finallyBlock: JKBlock
var catchSections: List<JKJavaTryCatchSection>
}
interface JKJavaTryCatchSection : JKTreeElement {
var parameter: JKParameter
var block: JKBlock
}
interface JKJavaSwitchStatement : JKStatement {
var expression: JKExpression
var cases: List<JKJavaSwitchCase>
@@ -98,4 +98,15 @@ interface JKKtConvertedFromForLoopSyntheticWhileStatement : JKStatement {
interface JKKtThrowExpression : JKExpression {
var exception: JKExpression
}
interface JKKtTryExpression : JKExpression {
var tryBlock: JKBlock
var finallyBlock: JKBlock
var catchSections: List<JKKtTryCatchSection>
}
interface JKKtTryCatchSection : JKTreeElement {
var parameter: JKParameter
var block: JKBlock
}
@@ -86,6 +86,10 @@ interface JKStarProjectionType : JKType {
get() = Nullability.NotNull
}
interface JKJavaDisjunctionType : JKType {
val disjunctions: List<JKType>
}
inline fun <reified T> JKElement.getParentOfType(): T? {
var p = parent
while (true) {
@@ -68,7 +68,9 @@ fun PsiType.toJK(symbolProvider: JKSymbolProvider, nullability: Nullability = Nu
is PsiArrayType -> JKJavaArrayTypeImpl(componentType.toJK(symbolProvider, nullability), nullability)
is PsiPrimitiveType -> JKJavaPrimitiveTypeImpl.KEYWORD_TO_INSTANCE[presentableText]
?: error("Invalid primitive type $presentableText")
else -> throw Exception("Invalid PSI")
is PsiDisjunctionType ->
JKJavaDisjunctionTypeImpl(disjunctions.map { it.toJK(symbolProvider) })
else -> throw Exception("Invalid PSI ${this::class.java}")
}
}
@@ -76,6 +76,8 @@ interface JKVisitor<out R, in D> {
fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: D): R = visitExpression(javaPolyadicExpression, data)
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: D): R = visitExpression(javaAssignmentExpression, data)
fun visitJavaThrowStatement(javaThrowStatement: JKJavaThrowStatement, data: D): R = visitStatement(javaThrowStatement, data)
fun visitJavaTryStatement(javaTryStatement: JKJavaTryStatement, data: D): R = visitStatement(javaTryStatement, data)
fun visitJavaTryCatchSection(javaTryCatchSection: JKJavaTryCatchSection, data: D): R = visitTreeElement(javaTryCatchSection, data)
fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement, data: D): R = visitStatement(javaContinueStatement, data)
fun visitJavaSwitchStatement(javaSwitchStatement: JKJavaSwitchStatement, data: D): R = visitStatement(javaSwitchStatement, data)
fun visitJavaSwitchCase(javaSwitchCase: JKJavaSwitchCase, data: D): R = visitTreeElement(javaSwitchCase, data)
@@ -102,4 +104,6 @@ interface JKVisitor<out R, in D> {
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)
fun visitKtTryExpression(ktTryExpression: JKKtTryExpression, data: D): R = visitExpression(ktTryExpression, data)
fun visitKtTryCatchSection(ktTryCatchSection: JKKtTryCatchSection, data: D): R = visitTreeElement(ktTryCatchSection, data)
}
@@ -159,6 +159,10 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitJavaLabelSwitchCase(javaLabelSwitchCase: JKJavaLabelSwitchCase, data: Nothing?) = visitJavaLabelSwitchCase(javaLabelSwitchCase)
fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement) = visitStatement(javaContinueStatement, null)
override fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement, data: Nothing?) = visitJavaContinueStatement(javaContinueStatement)
fun visitJavaTryStatement(javaTryStatement: JKJavaTryStatement) = visitStatement(javaTryStatement, null)
override fun visitJavaTryStatement(javaTryStatement: JKJavaTryStatement, data: Nothing?) = visitJavaTryStatement(javaTryStatement)
fun visitJavaTryCatchSection(javaTryCatchSection: JKJavaTryCatchSection) = visitTreeElement(javaTryCatchSection, null)
override fun visitJavaTryCatchSection(javaTryCatchSection: JKJavaTryCatchSection, data: Nothing?) = visitJavaTryCatchSection(javaTryCatchSection)
fun visitKtProperty(ktProperty: JKKtProperty) = visitField(ktProperty, null)
override fun visitKtProperty(ktProperty: JKKtProperty, data: Nothing?) = visitKtProperty(ktProperty)
fun visitKtFunction(ktFunction: JKKtFunction) = visitMethod(ktFunction, null)
@@ -201,4 +205,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitKtConvertedFromForLoopSyntheticWhileStatement(ktConvertedFromForLoopSyntheticWhileStatement: JKKtConvertedFromForLoopSyntheticWhileStatement, data: Nothing?) = visitKtConvertedFromForLoopSyntheticWhileStatement(ktConvertedFromForLoopSyntheticWhileStatement)
fun visitKtThrowExpression(ktThrowExpression: JKKtThrowExpression) = visitExpression(ktThrowExpression, null)
override fun visitKtThrowExpression(ktThrowExpression: JKKtThrowExpression, data: Nothing?) = visitKtThrowExpression(ktThrowExpression)
fun visitKtTryExpression(ktTryExpression: JKKtTryExpression) = visitExpression(ktTryExpression, null)
override fun visitKtTryExpression(ktTryExpression: JKKtTryExpression, data: Nothing?) = visitKtTryExpression(ktTryExpression)
fun visitKtTryCatchSection(ktTryCatchSection: JKKtTryCatchSection) = visitTreeElement(ktTryCatchSection, null)
override fun visitKtTryCatchSection(ktTryCatchSection: JKKtTryCatchSection, data: Nothing?) = visitKtTryCatchSection(ktTryCatchSection)
}