New J2K: Add throw statement

This commit is contained in:
Ilya Kirillov
2018-11-06 14:13:48 +03:00
committed by Ilya Kirillov
parent 66f12d9fea
commit 594d0ba7e9
11 changed files with 58 additions and 0 deletions
@@ -24,6 +24,7 @@ object ConversionsRunner {
private fun createRootConversion(context: ConversionContext) =
batchPipe {
+BinaryExpressionConversion(context)
+ThrowStatementConversion()
+ArrayInitializerConversion(context)
+ModalityConversion(context)
+ImplicitInitializerConversion()
@@ -380,6 +380,8 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
JKLabeledStatementImpl(statement.toJK(), labels.map { JKNameIdentifierImpl(it.text) })
}
is PsiEmptyStatement -> JKEmptyStatementImpl()
is PsiThrowStatement ->
JKJavaThrowStatementImpl(with(expressionTreeMapper) { exception.toJK() })
else -> TODO("for ${this::class}")
}.also {
if (this != null) (it as PsiOwner).psi = this
@@ -54,6 +54,11 @@ class NewCodeBuilder {
ktForInStatement.body.accept(this)
}
override fun visitKtThrowExpression(ktThrowExpression: JKKtThrowExpression) {
printer.printlnWithNoIndent("throw ")
ktThrowExpression.exception.accept(this)
}
override fun visitDoWhileStatement(doWhileStatement: JKDoWhileStatement) {
printer.printWithNoIndent("do")
doWhileStatement.body.accept(this)
@@ -0,0 +1,22 @@
/*
* 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.tree.JKExpressionStatement
import org.jetbrains.kotlin.j2k.tree.JKJavaThrowStatement
import org.jetbrains.kotlin.j2k.tree.JKTreeElement
import org.jetbrains.kotlin.j2k.tree.detached
import org.jetbrains.kotlin.j2k.tree.impl.JKExpressionStatementImpl
import org.jetbrains.kotlin.j2k.tree.impl.JKKtThrowExpressionImpl
class ThrowStatementConversion : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaThrowStatement) return recurse(element)
val throwExpression = JKKtThrowExpressionImpl(element::exception.detached())
return recurse(JKExpressionStatementImpl(throwExpression))
}
}
@@ -306,3 +306,8 @@ class JKJavaLabelSwitchCaseImpl(
override var label: JKExpression by child(label)
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaLabelSwitchCase(this, data)
}
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)
}
@@ -261,3 +261,8 @@ class JKKtConvertedFromForLoopSyntheticWhileStatementImpl(
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R =
visitor.visitKtConvertedFromForLoopSyntheticWhileStatement(this, data)
}
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)
}
@@ -88,6 +88,11 @@ interface JKJavaAssignmentExpression : JKExpression, JKBranchElement {
var operator: JKOperator
}
interface JKJavaThrowStatement : JKStatement {
var exception: JKExpression
}
interface JKJavaSwitchStatement : JKStatement {
var expression: JKExpression
var cases: List<JKJavaSwitchCase>
@@ -93,4 +93,9 @@ interface JKKtOperatorExpression : JKExpression {
interface JKKtConvertedFromForLoopSyntheticWhileStatement : JKStatement {
var variableDeclaration: JKStatement
var whileStatement: JKWhileStatement
}
interface JKKtThrowExpression : JKExpression {
var exception: JKExpression
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.j2k.tree
import com.intellij.psi.*
import com.intellij.util.reverse
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.j2k.ConversionContext
@@ -36,6 +37,7 @@ fun JKExpression.type(context: ConversionContext): JKType =
is JKMethodCallExpression -> identifier.returnType
is JKFieldAccessExpressionImpl -> identifier.fieldType
is JKQualifiedExpressionImpl -> this.selector.type(context)
is JKKtThrowExpression -> kotlinTypeByName(KotlinBuiltIns.FQ_NAMES.nothing.asString(), context.symbolProvider)
else -> TODO(this::class.java.toString())
}
@@ -75,6 +75,7 @@ interface JKVisitor<out R, in D> {
fun visitJavaInstanceOfExpression(javaInstanceOfExpression: JKJavaInstanceOfExpression, data: D): R = visitExpression(javaInstanceOfExpression, data)
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 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)
@@ -100,4 +101,5 @@ interface JKVisitor<out R, in D> {
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)
}
@@ -147,6 +147,8 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitJavaPolyadicExpression(javaPolyadicExpression: JKJavaPolyadicExpression, data: Nothing?) = visitJavaPolyadicExpression(javaPolyadicExpression)
fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression) = visitExpression(javaAssignmentExpression, null)
override fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: Nothing?) = visitJavaAssignmentExpression(javaAssignmentExpression)
fun visitJavaThrowStatement(javaThrowStatement: JKJavaThrowStatement) = visitStatement(javaThrowStatement, null)
override fun visitJavaThrowStatement(javaThrowStatement: JKJavaThrowStatement, data: Nothing?) = visitJavaThrowStatement(javaThrowStatement)
fun visitJavaSwitchStatement(javaSwitchStatement: JKJavaSwitchStatement) = visitStatement(javaSwitchStatement, null)
override fun visitJavaSwitchStatement(javaSwitchStatement: JKJavaSwitchStatement, data: Nothing?) = visitJavaSwitchStatement(javaSwitchStatement)
fun visitJavaSwitchCase(javaSwitchCase: JKJavaSwitchCase) = visitTreeElement(javaSwitchCase, null)
@@ -197,4 +199,6 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitKtOperatorExpression(ktOperatorExpression: JKKtOperatorExpression, data: Nothing?) = visitKtOperatorExpression(ktOperatorExpression)
fun visitKtConvertedFromForLoopSyntheticWhileStatement(ktConvertedFromForLoopSyntheticWhileStatement: JKKtConvertedFromForLoopSyntheticWhileStatement) = visitStatement(ktConvertedFromForLoopSyntheticWhileStatement, null)
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)
}