New J2K: Try with resource conversion
This commit is contained in:
committed by
Ilya Kirillov
parent
8d602b9e47
commit
ba08f233b6
@@ -38,6 +38,7 @@ class JKSymbolProvider {
|
|||||||
is PsiField -> JKMultiverseFieldSymbol(psi, this)
|
is PsiField -> JKMultiverseFieldSymbol(psi, this)
|
||||||
is KtNamedFunction -> JKMultiverseFunctionSymbol(psi, this)
|
is KtNamedFunction -> JKMultiverseFunctionSymbol(psi, this)
|
||||||
is KtProperty -> JKMultiversePropertySymbol(psi, this)
|
is KtProperty -> JKMultiversePropertySymbol(psi, this)
|
||||||
|
is PsiLocalVariable -> JKMultiverseFieldSymbol(psi, this)
|
||||||
else -> TODO(psi::class.toString())
|
else -> TODO(psi::class.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -309,19 +309,22 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
|||||||
fun Array<out PsiElement>.toJK(): List<JKDeclaration> {
|
fun Array<out PsiElement>.toJK(): List<JKDeclaration> {
|
||||||
return this.map {
|
return this.map {
|
||||||
if (it is PsiLocalVariable) {
|
if (it is PsiLocalVariable) {
|
||||||
JKLocalVariableImpl(
|
it.toJK()
|
||||||
with(modifierMapper) { it.modifierList.toJK() },
|
|
||||||
with(expressionTreeMapper) { it.typeElement.toJK() },
|
|
||||||
JKNameIdentifierImpl(it.name ?: TODO()),
|
|
||||||
with(expressionTreeMapper) { it.initializer.toJK() }
|
|
||||||
).also { i ->
|
|
||||||
symbolProvider.provideUniverseSymbol(it, i)
|
|
||||||
i.psi = it
|
|
||||||
}
|
|
||||||
} else TODO()
|
} else TODO()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun PsiLocalVariable.toJK(): JKLocalVariable =
|
||||||
|
JKLocalVariableImpl(
|
||||||
|
with(modifierMapper) { modifierList.toJK() },
|
||||||
|
with(expressionTreeMapper) { typeElement.toJK() },
|
||||||
|
JKNameIdentifierImpl(this.name ?: TODO()),
|
||||||
|
with(expressionTreeMapper) { initializer.toJK() }
|
||||||
|
).also { i ->
|
||||||
|
symbolProvider.provideUniverseSymbol(this, i)
|
||||||
|
i.psi = this
|
||||||
|
}
|
||||||
|
|
||||||
fun PsiStatement?.toJK(): JKStatement {
|
fun PsiStatement?.toJK(): JKStatement {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
null -> JKExpressionStatementImpl(JKStubExpressionImpl())
|
null -> JKExpressionStatementImpl(JKStubExpressionImpl())
|
||||||
@@ -384,6 +387,7 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) {
|
|||||||
JKJavaThrowStatementImpl(with(expressionTreeMapper) { exception.toJK() })
|
JKJavaThrowStatementImpl(with(expressionTreeMapper) { exception.toJK() })
|
||||||
is PsiTryStatement ->
|
is PsiTryStatement ->
|
||||||
JKJavaTryStatementImpl(
|
JKJavaTryStatementImpl(
|
||||||
|
resourceList?.toList()?.map { (it as PsiLocalVariable).toJK() }.orEmpty(),
|
||||||
tryBlock?.toJK() ?: JKBodyStub,
|
tryBlock?.toJK() ?: JKBodyStub,
|
||||||
finallyBlock?.toJK() ?: JKBodyStub,
|
finallyBlock?.toJK() ?: JKBodyStub,
|
||||||
catchSections.map { it.toJK() }
|
catchSections.map { it.toJK() }
|
||||||
|
|||||||
@@ -5,23 +5,65 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k.conversions
|
package org.jetbrains.kotlin.j2k.conversions
|
||||||
|
|
||||||
import org.jetbrains.kotlin.j2k.ConversionContext
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.j2k.copyTreeAndDetach
|
import org.jetbrains.kotlin.j2k.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.*
|
import org.jetbrains.kotlin.j2k.tree.*
|
||||||
import org.jetbrains.kotlin.j2k.tree.impl.*
|
import org.jetbrains.kotlin.j2k.tree.impl.*
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
class TryStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
class TryStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
if (element !is JKJavaTryStatement) return recurse(element)
|
if (element !is JKJavaTryStatement) return recurse(element)
|
||||||
val tryExpression = JKKtTryExpressionImpl(
|
return if (element.resourceDeclarations.isEmpty())
|
||||||
element::tryBlock.detached(),
|
recurse(convertNoResourcesTryStatement(element))
|
||||||
element::finallyBlock.detached(),
|
else recurse(convertTryStatementWithResources(element))
|
||||||
element.catchSections.flatMap(::convertCatchSection)
|
|
||||||
)
|
|
||||||
return recurse(JKExpressionStatementImpl(tryExpression))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun convertNoResourcesTryStatement(tryStatement: JKJavaTryStatement): JKStatement =
|
||||||
|
JKExpressionStatementImpl(
|
||||||
|
JKKtTryExpressionImpl(
|
||||||
|
tryStatement::tryBlock.detached(),
|
||||||
|
tryStatement::finallyBlock.detached(),
|
||||||
|
tryStatement.catchSections.flatMap(::convertCatchSection)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun convertTryStatementWithResources(tryStatement: JKJavaTryStatement): JKStatement {
|
||||||
|
val body =
|
||||||
|
resourceDeclarationsToUseExpression(
|
||||||
|
tryStatement.resourceDeclarations,
|
||||||
|
JKBlockStatementImpl(tryStatement::tryBlock.detached())
|
||||||
|
)
|
||||||
|
return if (tryStatement.finallyBlock !is JKBodyStub || tryStatement.catchSections.isNotEmpty()) {
|
||||||
|
JKExpressionStatementImpl(
|
||||||
|
JKKtTryExpressionImpl(
|
||||||
|
JKBlockImpl(listOf(body)),
|
||||||
|
tryStatement::finallyBlock.detached(),
|
||||||
|
tryStatement.catchSections.flatMap(::convertCatchSection)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else body
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun resourceDeclarationsToUseExpression(
|
||||||
|
resourceDeclarations: List<JKDeclaration>,
|
||||||
|
innerStatement: JKStatement
|
||||||
|
): JKStatement =
|
||||||
|
resourceDeclarations
|
||||||
|
.reversed()
|
||||||
|
.fold(innerStatement) { inner, variable ->
|
||||||
|
JKExpressionStatementImpl(
|
||||||
|
useExpression(
|
||||||
|
receiver = (variable as JKLocalVariable)::initializer.detached(),
|
||||||
|
variableIdentifier = variable::name.detached(),
|
||||||
|
body = inner,
|
||||||
|
symbolProvider = context.symbolProvider
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private fun convertCatchSection(javaCatchSection: JKJavaTryCatchSection): List<JKKtTryCatchSection> {
|
private fun convertCatchSection(javaCatchSection: JKJavaTryCatchSection): List<JKKtTryCatchSection> {
|
||||||
javaCatchSection.block.detach(javaCatchSection)
|
javaCatchSection.block.detach(javaCatchSection)
|
||||||
return javaCatchSection.parameter.type.type.let {
|
return javaCatchSection.parameter.type.type.let {
|
||||||
|
|||||||
@@ -319,11 +319,13 @@ class JKJavaThrowStatementImpl(exception: JKExpression) : JKJavaThrowStatement,
|
|||||||
}
|
}
|
||||||
|
|
||||||
class JKJavaTryStatementImpl(
|
class JKJavaTryStatementImpl(
|
||||||
|
resourceDeclarations: List<JKDeclaration>,
|
||||||
tryBlock: JKBlock,
|
tryBlock: JKBlock,
|
||||||
finallyBlock: JKBlock,
|
finallyBlock: JKBlock,
|
||||||
catchSections: List<JKJavaTryCatchSection>
|
catchSections: List<JKJavaTryCatchSection>
|
||||||
) : JKJavaTryStatement,
|
) : JKJavaTryStatement,
|
||||||
JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
|
JKBranchElementBase(), PsiOwner by PsiOwnerImpl() {
|
||||||
|
override var resourceDeclarations: List<JKDeclaration> by children(resourceDeclarations)
|
||||||
override var tryBlock: JKBlock by child(tryBlock)
|
override var tryBlock: JKBlock by child(tryBlock)
|
||||||
override var finallyBlock: JKBlock by child(finallyBlock)
|
override var finallyBlock: JKBlock by child(finallyBlock)
|
||||||
override var catchSections: List<JKJavaTryCatchSection> by children(catchSections)
|
override var catchSections: List<JKJavaTryCatchSection> by children(catchSections)
|
||||||
|
|||||||
@@ -5,10 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k.tree.impl
|
package org.jetbrains.kotlin.j2k.tree.impl
|
||||||
|
|
||||||
import com.intellij.psi.PsiClass
|
import com.intellij.psi.*
|
||||||
import com.intellij.psi.PsiField
|
|
||||||
import com.intellij.psi.PsiMethod
|
|
||||||
import com.intellij.psi.PsiReference
|
|
||||||
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
|
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl
|
||||||
import com.intellij.util.reverse
|
import com.intellij.util.reverse
|
||||||
import org.jetbrains.kotlin.j2k.JKSymbolProvider
|
import org.jetbrains.kotlin.j2k.JKSymbolProvider
|
||||||
@@ -144,15 +141,15 @@ class JKUniverseFieldSymbol : JKFieldSymbol, JKUniverseSymbol<JKField> {
|
|||||||
get() = target.name.value // TODO("Fix this")
|
get() = target.name.value // TODO("Fix this")
|
||||||
}
|
}
|
||||||
|
|
||||||
class JKMultiverseFieldSymbol(override val target: PsiField, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
|
class JKMultiverseFieldSymbol(override val target: PsiVariable, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
|
||||||
override val fieldType: JKType
|
override val fieldType: JKType
|
||||||
get() = target.type.toJK(symbolProvider)
|
get() = target.type.toJK(symbolProvider)
|
||||||
override val name: String
|
override val name: String
|
||||||
get() = target.name
|
get() = target.name!!
|
||||||
override val declaredIn: JKSymbol
|
override val declaredIn: JKSymbol
|
||||||
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
||||||
override val fqName: String
|
override val fqName: String
|
||||||
get() = target.name // TODO("Fix this")
|
get() = target.name!! // TODO("Fix this")
|
||||||
}
|
}
|
||||||
|
|
||||||
class JKMultiversePropertySymbol(override val target: KtProperty, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
|
class JKMultiversePropertySymbol(override val target: KtProperty, private val symbolProvider: JKSymbolProvider) : JKFieldSymbol {
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ interface JKJavaThrowStatement : JKStatement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface JKJavaTryStatement : JKStatement {
|
interface JKJavaTryStatement : JKStatement {
|
||||||
|
var resourceDeclarations: List<JKDeclaration>
|
||||||
var tryBlock: JKBlock
|
var tryBlock: JKBlock
|
||||||
var finallyBlock: JKBlock
|
var finallyBlock: JKBlock
|
||||||
var catchSections: List<JKJavaTryCatchSection>
|
var catchSections: List<JKJavaTryCatchSection>
|
||||||
|
|||||||
Reference in New Issue
Block a user