diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 1025613a5c3..10e17ce5f26 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -24,6 +24,7 @@ object ConversionsRunner { private fun createRootConversion(context: ConversionContext) = batchPipe { +BinaryExpressionConversion(context) + +ThrowStatementConversion() +ArrayInitializerConversion(context) +ModalityConversion(context) +ImplicitInitializerConversion() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 70b98a5372a..32637611300 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -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 diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index a73f1b401ce..53eb94f2f41 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -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) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ThrowStatementConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ThrowStatementConversion.kt new file mode 100644 index 00000000000..77e8aecc176 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/ThrowStatementConversion.kt @@ -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)) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 020298ac91d..12cd467b6ae 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -306,3 +306,8 @@ class JKJavaLabelSwitchCaseImpl( override var label: JKExpression by child(label) override fun accept(visitor: JKVisitor, 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 accept(visitor: JKVisitor, data: D): R = visitor.visitJavaThrowStatement(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 e8b02238dc8..bfe1f95947b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -261,3 +261,8 @@ class JKKtConvertedFromForLoopSyntheticWhileStatementImpl( override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtConvertedFromForLoopSyntheticWhileStatement(this, data) } + +class JKKtThrowExpressionImpl(exception: JKExpression) : JKKtThrowExpression, JKBranchElementBase() { + override var exception: JKExpression by child(exception) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtThrowExpression(this, data) +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index 817bb7c1c9a..c093fb29003 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -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 diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt index 8d708b0f46c..a6e1a9af1a5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/k.kt @@ -93,4 +93,9 @@ interface JKKtOperatorExpression : JKExpression { interface JKKtConvertedFromForLoopSyntheticWhileStatement : JKStatement { var variableDeclaration: JKStatement var whileStatement: JKWhileStatement +} + + +interface JKKtThrowExpression : JKExpression { + var exception: JKExpression } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt index 4a13e48a068..1ae5ec1af5c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/types.kt @@ -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()) } 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 54d84d539a1..3a450ca1d44 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -75,6 +75,7 @@ interface JKVisitor { 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 { 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 3e528acab69..d42ef2e5508 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -147,6 +147,8 @@ interface JKVisitorVoid : JKVisitor { 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 { 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) }