From 1d846085de41e2fa5e97a686a485906fdd55639d Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 17 Jan 2019 16:11:56 +0300 Subject: [PATCH] New J2K: Add support of synchronized statement --- .../jetbrains/kotlin/j2k/ConversionsRunner.kt | 1 + .../kotlin/j2k/JavaToJKTreeBuilder.kt | 5 +++ .../SynchronizedStatementConversion.kt | 32 +++++++++++++++++++ .../org/jetbrains/kotlin/j2k/tree/impl/j.kt | 9 ++++++ j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt | 7 +++- .../kotlin/j2k/tree/visitors/JKVisitor.kt | 1 + .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 2 ++ 7 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/SynchronizedStatementConversion.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index b8cbfafb2d1..82852dc8aed 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -38,6 +38,7 @@ object ConversionsRunner { +EnumClassConversion() +ArrayInitializerConversion(context) +TryStatementConversion(context) + +SynchronizedStatementConversion(context) +DefaultArgumentsConversion(context) +ConstructorConversion(context) +ImplicitInitializerConversion(context) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 1d688c43bbd..b498cacac81 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -710,6 +710,11 @@ class JavaToJKTreeBuilder( finallyBlock?.toJK() ?: JKBodyStub, catchSections.map { it.toJK() } ) + is PsiSynchronizedStatement -> + JKJavaSynchronizedStatementImpl( + with(expressionTreeMapper) { lockExpression?.toJK() } ?: JKStubExpressionImpl(), + body?.toJK() ?: JKBodyStub + ) else -> TODO("for ${this::class}") }.also { if (this != null) (it as PsiOwner).psi = this diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/SynchronizedStatementConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/SynchronizedStatementConversion.kt new file mode 100644 index 00000000000..760f57fd566 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/SynchronizedStatementConversion.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2019 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.* + + +class SynchronizedStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKJavaSynchronizedStatement) return recurse(element) + element.invalidate() + val lambdaBody = JKLambdaExpressionImpl( + JKBlockStatementImpl(element.body), + emptyList() + ) + val synchronizedCall = + JKKtCallExpressionImpl( + context.symbolProvider.provideByFqNameMulti("kotlin.synchronized"), + JKExpressionListImpl( + element.lockExpression, + lambdaBody + ) + ) + return recurse(JKExpressionStatementImpl(synchronizedCall)) + } + +} \ 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 950006c207b..e5deb34b7e0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -372,4 +372,13 @@ class JKJavaTryCatchSectionImpl( override var parameter: JKParameter by child(parameter) override var block: JKBlock by child(block) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaTryCatchSection(this, data) +} + +class JKJavaSynchronizedStatementImpl( + lockExpression: JKExpression, + body: JKBlock +) : JKJavaSynchronizedStatement, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { + override val lockExpression: JKExpression by child(lockExpression) + override val body: JKBlock by child(body) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaSynchronizedStatement(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 801f369af35..688a05d5a93 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -127,4 +127,9 @@ interface JKJavaLabelSwitchCase : JKJavaSwitchCase { var label: JKExpression } -interface JKJavaContinueStatement: JKStatement \ No newline at end of file +interface JKJavaContinueStatement: JKStatement + +interface JKJavaSynchronizedStatement : JKStatement, JKBranchElement { + val lockExpression: JKExpression + val body: JKBlock +} \ No newline at end of file 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 c43b14a51de..b89851c57e5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -100,6 +100,7 @@ interface JKVisitor { fun visitJavaDefaultSwitchCase(javaDefaultSwitchCase: JKJavaDefaultSwitchCase, data: D): R = visitJavaSwitchCase(javaDefaultSwitchCase, data) fun visitJavaLabelSwitchCase(javaLabelSwitchCase: JKJavaLabelSwitchCase, data: D): R = visitJavaSwitchCase(javaLabelSwitchCase, data) fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement, data: D): R = visitStatement(javaContinueStatement, data) + fun visitJavaSynchronizedStatement(javaSynchronizedStatement: JKJavaSynchronizedStatement, data: D): R = visitStatement(javaSynchronizedStatement, data) fun visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter, data: D): R = visitTreeElement(ktGetterOrSetter, data) fun visitKtEmptyGetterOrSetter(ktEmptyGetterOrSetter: JKKtEmptyGetterOrSetter, data: D): R = visitKtGetterOrSetter(ktEmptyGetterOrSetter, data) fun visitKtProperty(ktProperty: JKKtProperty, data: D): R = visitField(ktProperty, 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 25605be5153..3a5cf0eee67 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -197,6 +197,8 @@ interface JKVisitorVoid : JKVisitor { 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 visitJavaSynchronizedStatement(javaSynchronizedStatement: JKJavaSynchronizedStatement) = visitStatement(javaSynchronizedStatement, null) + override fun visitJavaSynchronizedStatement(javaSynchronizedStatement: JKJavaSynchronizedStatement, data: Nothing?) = visitJavaSynchronizedStatement(javaSynchronizedStatement) fun visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter) = visitTreeElement(ktGetterOrSetter, null) override fun visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter, data: Nothing?) = visitKtGetterOrSetter(ktGetterOrSetter) fun visitKtEmptyGetterOrSetter(ktEmptyGetterOrSetter: JKKtEmptyGetterOrSetter) = visitKtGetterOrSetter(ktEmptyGetterOrSetter, null)