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()
|
+EnumClassConversion()
|
||||||
+ArrayInitializerConversion(context)
|
+ArrayInitializerConversion(context)
|
||||||
+TryStatementConversion(context)
|
+TryStatementConversion(context)
|
||||||
|
+SynchronizedStatementConversion(context)
|
||||||
+DefaultArgumentsConversion(context)
|
+DefaultArgumentsConversion(context)
|
||||||
+ConstructorConversion(context)
|
+ConstructorConversion(context)
|
||||||
+ImplicitInitializerConversion(context)
|
+ImplicitInitializerConversion(context)
|
||||||
|
|||||||
@@ -710,6 +710,11 @@ class JavaToJKTreeBuilder(
|
|||||||
finallyBlock?.toJK() ?: JKBodyStub,
|
finallyBlock?.toJK() ?: JKBodyStub,
|
||||||
catchSections.map { it.toJK() }
|
catchSections.map { it.toJK() }
|
||||||
)
|
)
|
||||||
|
is PsiSynchronizedStatement ->
|
||||||
|
JKJavaSynchronizedStatementImpl(
|
||||||
|
with(expressionTreeMapper) { lockExpression?.toJK() } ?: JKStubExpressionImpl(),
|
||||||
|
body?.toJK() ?: JKBodyStub
|
||||||
|
)
|
||||||
else -> TODO("for ${this::class}")
|
else -> TODO("for ${this::class}")
|
||||||
}.also {
|
}.also {
|
||||||
if (this != null) (it as PsiOwner).psi = this
|
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 parameter: JKParameter by child(parameter)
|
||||||
override var block: JKBlock by child(block)
|
override var block: JKBlock by child(block)
|
||||||
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitJavaTryCatchSection(this, data)
|
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
|
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 visitJavaDefaultSwitchCase(javaDefaultSwitchCase: JKJavaDefaultSwitchCase, data: D): R = visitJavaSwitchCase(javaDefaultSwitchCase, data)
|
||||||
fun visitJavaLabelSwitchCase(javaLabelSwitchCase: JKJavaLabelSwitchCase, data: D): R = visitJavaSwitchCase(javaLabelSwitchCase, data)
|
fun visitJavaLabelSwitchCase(javaLabelSwitchCase: JKJavaLabelSwitchCase, data: D): R = visitJavaSwitchCase(javaLabelSwitchCase, data)
|
||||||
fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement, data: D): R = visitStatement(javaContinueStatement, 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 visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter, data: D): R = visitTreeElement(ktGetterOrSetter, data)
|
||||||
fun visitKtEmptyGetterOrSetter(ktEmptyGetterOrSetter: JKKtEmptyGetterOrSetter, data: D): R = visitKtGetterOrSetter(ktEmptyGetterOrSetter, data)
|
fun visitKtEmptyGetterOrSetter(ktEmptyGetterOrSetter: JKKtEmptyGetterOrSetter, data: D): R = visitKtGetterOrSetter(ktEmptyGetterOrSetter, data)
|
||||||
fun visitKtProperty(ktProperty: JKKtProperty, data: D): R = visitField(ktProperty, 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)
|
override fun visitJavaLabelSwitchCase(javaLabelSwitchCase: JKJavaLabelSwitchCase, data: Nothing?) = visitJavaLabelSwitchCase(javaLabelSwitchCase)
|
||||||
fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement) = visitStatement(javaContinueStatement, null)
|
fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement) = visitStatement(javaContinueStatement, null)
|
||||||
override fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement, data: Nothing?) = visitJavaContinueStatement(javaContinueStatement)
|
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)
|
fun visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter) = visitTreeElement(ktGetterOrSetter, null)
|
||||||
override fun visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter, data: Nothing?) = visitKtGetterOrSetter(ktGetterOrSetter)
|
override fun visitKtGetterOrSetter(ktGetterOrSetter: JKKtGetterOrSetter, data: Nothing?) = visitKtGetterOrSetter(ktGetterOrSetter)
|
||||||
fun visitKtEmptyGetterOrSetter(ktEmptyGetterOrSetter: JKKtEmptyGetterOrSetter) = visitKtGetterOrSetter(ktEmptyGetterOrSetter, null)
|
fun visitKtEmptyGetterOrSetter(ktEmptyGetterOrSetter: JKKtEmptyGetterOrSetter) = visitKtGetterOrSetter(ktEmptyGetterOrSetter, null)
|
||||||
|
|||||||
Reference in New Issue
Block a user