New J2K: Add support of synchronized statement
This commit is contained in:
committed by
Ilya Kirillov
parent
0674e6462c
commit
1d846085de
@@ -38,6 +38,7 @@ object ConversionsRunner {
|
||||
+EnumClassConversion()
|
||||
+ArrayInitializerConversion(context)
|
||||
+TryStatementConversion(context)
|
||||
+SynchronizedStatementConversion(context)
|
||||
+DefaultArgumentsConversion(context)
|
||||
+ConstructorConversion(context)
|
||||
+ImplicitInitializerConversion(context)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
}
|
||||
@@ -372,4 +372,13 @@ class JKJavaTryCatchSectionImpl(
|
||||
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)
|
||||
}
|
||||
|
||||
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 <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaSynchronizedStatement(this, data)
|
||||
}
|
||||
@@ -127,4 +127,9 @@ interface JKJavaLabelSwitchCase : JKJavaSwitchCase {
|
||||
var label: JKExpression
|
||||
}
|
||||
|
||||
interface JKJavaContinueStatement: JKStatement
|
||||
interface JKJavaContinueStatement: JKStatement
|
||||
|
||||
interface JKJavaSynchronizedStatement : JKStatement, JKBranchElement {
|
||||
val lockExpression: JKExpression
|
||||
val body: JKBlock
|
||||
}
|
||||
@@ -100,6 +100,7 @@ interface JKVisitor<out R, in D> {
|
||||
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)
|
||||
|
||||
@@ -197,6 +197,8 @@ 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 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)
|
||||
|
||||
Reference in New Issue
Block a user