From 0e9abf8ca373565a56329ffddf2aca87923d3125 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 22 Nov 2018 13:05:28 +0300 Subject: [PATCH] New J2K: Add assert statement conversion --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 1 + .../kotlin/j2k/JavaToJKTreeBuilder.kt | 6 ++-- .../conversions/AssertStatementConversion.kt | 35 +++++++++++++++++++ .../org/jetbrains/kotlin/j2k/expressions.kt | 20 ++++++++++- 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssertStatementConversion.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index d9b99117a32..99ba5cd243c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -46,6 +46,7 @@ object ConversionsRunner { +JavaMethodToKotlinFunctionConversion() +MainFunctionConversion() +LiteralConversion() + +AssertStatementConversion(context) +InnerClassConversion() +ModifiersConversion(context) +StaticsToCompanionExtractConversion() diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 0c9628f2d91..3cfb78f2d43 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -368,8 +368,10 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { is PsiExpressionStatement -> JKExpressionStatementImpl(with(expressionTreeMapper) { expression.toJK() }) is PsiReturnStatement -> JKReturnStatementImpl(with(expressionTreeMapper) { returnValue.toJK() }) is PsiDeclarationStatement -> JKDeclarationStatementImpl(declaredElements.toJK()) - is PsiAssertStatement -> JKJavaAssertStatementImpl(with(expressionTreeMapper) { assertCondition.toJK() }, - with(expressionTreeMapper) { assertDescription.toJK() }) + is PsiAssertStatement -> + JKJavaAssertStatementImpl( + with(expressionTreeMapper) { assertCondition.toJK() }, + with(expressionTreeMapper) { assertDescription?.toJK() } ?: JKStubExpressionImpl()) is PsiIfStatement -> if (elseElement == null) JKIfStatementImpl(with(expressionTreeMapper) { condition.toJK() }, thenBranch.toJK()) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssertStatementConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssertStatementConversion.kt new file mode 100644 index 00000000000..bc7ef166f63 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssertStatementConversion.kt @@ -0,0 +1,35 @@ +/* + * 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.* +import org.jetbrains.kotlin.j2k.tree.* +import org.jetbrains.kotlin.j2k.tree.impl.JKExpressionStatementImpl +import org.jetbrains.kotlin.j2k.tree.impl.JKJavaOperatorImpl +import org.jetbrains.kotlin.j2k.tree.impl.JKLambdaExpressionImpl +import org.jetbrains.kotlin.j2k.tree.impl.toKtToken + + +class AssertStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKJavaAssertStatement) return recurse(element) + val messageExpression = + if (element.description is JKStubExpression) null + else JKLambdaExpressionImpl( + emptyList(), + JKExpressionStatementImpl(element::description.detached()) + ) + return recurse( + JKExpressionStatementImpl( + kotlinAssert( + element::condition.detached(), + messageExpression, + context.symbolProvider + ) + ) + ) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt index 4b989c93b92..bc76ebb9b0f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/expressions.kt @@ -169,4 +169,22 @@ fun useExpression( JKExpressionListImpl(listOf(lambda)) ) return JKQualifiedExpressionImpl(receiver, JKKtQualifierImpl.DOT, methodCall) -} \ No newline at end of file +} + +inline fun symbolByName(name: String, symbolProvider: JKSymbolProvider): Symbol = + symbolProvider + .provideDirectSymbol( + resolveFqName( + ClassId.fromString(name), + symbolProvider.symbolsByPsi.keys.first() + )!! + ) as Symbol + +fun kotlinAssert(assertion: JKExpression, message: JKExpression?, symbolProvider: JKSymbolProvider) = + JKKtCallExpressionImpl( + JKUnresolvedMethod(//TODO resolve assert + "assert", + kotlinTypeByName(KotlinBuiltIns.FQ_NAMES.unit.asString(), symbolProvider) + ), + JKExpressionListImpl(listOfNotNull(assertion, message)) + )