J2K: Fix java 9 try-with-resources
This commit is contained in:
@@ -990,7 +990,7 @@ class JavaToJKTreeBuilder constructor(
|
|||||||
JKJavaThrowStatement(with(expressionTreeMapper) { exception.toJK() })
|
JKJavaThrowStatement(with(expressionTreeMapper) { exception.toJK() })
|
||||||
is PsiTryStatement ->
|
is PsiTryStatement ->
|
||||||
JKJavaTryStatement(
|
JKJavaTryStatement(
|
||||||
resourceList?.toList()?.map { (it as PsiLocalVariable).toJK() }.orEmpty(),
|
resourceList?.toList()?.map { (it as PsiResourceListElement).toJK() }.orEmpty(),
|
||||||
tryBlock?.toJK() ?: JKBodyStub,
|
tryBlock?.toJK() ?: JKBodyStub,
|
||||||
finallyBlock?.toJK() ?: JKBodyStub,
|
finallyBlock?.toJK() ?: JKBodyStub,
|
||||||
catchSections.map { it.toJK() }
|
catchSections.map { it.toJK() }
|
||||||
@@ -1009,6 +1009,13 @@ class JavaToJKTreeBuilder constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun PsiResourceListElement.toJK(): JKJavaResourceElement =
|
||||||
|
when (this) {
|
||||||
|
is PsiResourceVariable -> JKJavaResourceDeclaration((this as PsiLocalVariable).toJK())
|
||||||
|
is PsiResourceExpression -> JKJavaResourceExpression(with(expressionTreeMapper) { this@toJK.expression.toJK() })
|
||||||
|
else -> throwCanNotConvertError()
|
||||||
|
}
|
||||||
|
|
||||||
fun PsiCatchSection.toJK(): JKJavaTryCatchSection =
|
fun PsiCatchSection.toJK(): JKJavaTryCatchSection =
|
||||||
JKJavaTryCatchSection(
|
JKJavaTryCatchSection(
|
||||||
parameter?.toJK() ?: throwCanNotConvertError(),
|
parameter?.toJK() ?: throwCanNotConvertError(),
|
||||||
|
|||||||
@@ -17,9 +17,10 @@ import org.jetbrains.kotlin.nj2k.useExpression
|
|||||||
class TryStatementConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
|
class TryStatementConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
|
||||||
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)
|
||||||
return if (element.resourceDeclarations.isEmpty())
|
return if (element.isTryWithResources)
|
||||||
|
recurse(convertTryStatementWithResources(element))
|
||||||
|
else
|
||||||
recurse(convertNoResourcesTryStatement(element))
|
recurse(convertNoResourcesTryStatement(element))
|
||||||
else recurse(convertTryStatementWithResources(element))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun convertNoResourcesTryStatement(tryStatement: JKJavaTryStatement): JKStatement =
|
private fun convertNoResourcesTryStatement(tryStatement: JKJavaTryStatement): JKStatement =
|
||||||
@@ -49,16 +50,20 @@ class TryStatementConversion(context: NewJ2kConverterContext) : RecursiveApplica
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun resourceDeclarationsToUseExpression(
|
private fun resourceDeclarationsToUseExpression(
|
||||||
resourceDeclarations: List<JKDeclaration>,
|
resourceDeclarations: List<JKJavaResourceElement>,
|
||||||
innerStatement: JKStatement
|
innerStatement: JKStatement
|
||||||
): JKStatement =
|
): JKStatement =
|
||||||
resourceDeclarations
|
resourceDeclarations
|
||||||
.reversed()
|
.reversed()
|
||||||
.fold(innerStatement) { inner, variable ->
|
.fold(innerStatement) { inner, element ->
|
||||||
|
val (receiver, name) = when (element) {
|
||||||
|
is JKJavaResourceExpression -> element::expression.detached() to null
|
||||||
|
is JKJavaResourceDeclaration -> element.declaration::initializer.detached() to element.declaration::name.detached()
|
||||||
|
}
|
||||||
JKExpressionStatement(
|
JKExpressionStatement(
|
||||||
useExpression(
|
useExpression(
|
||||||
receiver = (variable as JKLocalVariable)::initializer.detached(),
|
receiver = receiver,
|
||||||
variableIdentifier = variable::name.detached(),
|
variableIdentifier = name,
|
||||||
body = inner,
|
body = inner,
|
||||||
symbolProvider = symbolProvider
|
symbolProvider = symbolProvider
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -90,17 +90,16 @@ fun blockStatement(statements: List<JKStatement>) =
|
|||||||
|
|
||||||
fun useExpression(
|
fun useExpression(
|
||||||
receiver: JKExpression,
|
receiver: JKExpression,
|
||||||
variableIdentifier: JKNameIdentifier,
|
variableIdentifier: JKNameIdentifier?,
|
||||||
body: JKStatement,
|
body: JKStatement,
|
||||||
symbolProvider: JKSymbolProvider
|
symbolProvider: JKSymbolProvider
|
||||||
): JKExpression {
|
): JKExpression {
|
||||||
val useSymbol = symbolProvider.provideMethodSymbol("kotlin.io.use")
|
val useSymbol = symbolProvider.provideMethodSymbol("kotlin.io.use")
|
||||||
val lambdaParameter =
|
val lambdaParameter = if (variableIdentifier != null) JKParameter(JKTypeElement(JKNoType), variableIdentifier) else null
|
||||||
JKParameter(JKTypeElement(JKNoType), variableIdentifier)
|
|
||||||
|
|
||||||
val lambda = JKLambdaExpression(
|
val lambda = JKLambdaExpression(
|
||||||
body,
|
body,
|
||||||
listOf(lambdaParameter)
|
listOfNotNull(lambdaParameter)
|
||||||
)
|
)
|
||||||
val methodCall =
|
val methodCall =
|
||||||
JKCallExpressionImpl(
|
JKCallExpressionImpl(
|
||||||
|
|||||||
@@ -251,4 +251,13 @@ class JKKtTryCatchSection(
|
|||||||
var parameter: JKParameter by child(parameter)
|
var parameter: JKParameter by child(parameter)
|
||||||
var block: JKBlock by child(block)
|
var block: JKBlock by child(block)
|
||||||
override fun accept(visitor: JKVisitor) = visitor.visitKtTryCatchSection(this)
|
override fun accept(visitor: JKVisitor) = visitor.visitKtTryCatchSection(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sealed class JKJavaResourceElement : JKTreeElement(), PsiOwner by PsiOwnerImpl()
|
||||||
|
|
||||||
|
class JKJavaResourceExpression(expression: JKExpression) : JKJavaResourceElement() {
|
||||||
|
var expression by child(expression)
|
||||||
|
}
|
||||||
|
class JKJavaResourceDeclaration(declaration: JKLocalVariable) : JKJavaResourceElement() {
|
||||||
|
var declaration by child(declaration)
|
||||||
|
}
|
||||||
|
|||||||
@@ -125,16 +125,18 @@ class JKJavaThrowStatement(exception: JKExpression) : JKStatement() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class JKJavaTryStatement(
|
class JKJavaTryStatement(
|
||||||
resourceDeclarations: List<JKDeclaration>,
|
resourceDeclarations: List<JKJavaResourceElement>,
|
||||||
tryBlock: JKBlock,
|
tryBlock: JKBlock,
|
||||||
finallyBlock: JKBlock,
|
finallyBlock: JKBlock,
|
||||||
catchSections: List<JKJavaTryCatchSection>
|
catchSections: List<JKJavaTryCatchSection>
|
||||||
) : JKStatement() {
|
) : JKStatement() {
|
||||||
var resourceDeclarations: List<JKDeclaration> by children(resourceDeclarations)
|
var resourceDeclarations: List<JKJavaResourceElement> by children(resourceDeclarations)
|
||||||
var tryBlock: JKBlock by child(tryBlock)
|
var tryBlock: JKBlock by child(tryBlock)
|
||||||
var finallyBlock: JKBlock by child(finallyBlock)
|
var finallyBlock: JKBlock by child(finallyBlock)
|
||||||
var catchSections: List<JKJavaTryCatchSection> by children(catchSections)
|
var catchSections: List<JKJavaTryCatchSection> by children(catchSections)
|
||||||
override fun accept(visitor: JKVisitor) = visitor.visitJavaTryStatement(this)
|
override fun accept(visitor: JKVisitor) = visitor.visitJavaTryStatement(this)
|
||||||
|
|
||||||
|
val isTryWithResources get() = resourceDeclarations.isNotEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
class JKJavaSynchronizedStatement(
|
class JKJavaSynchronizedStatement(
|
||||||
|
|||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
public class Java9 {
|
||||||
|
public void check() throws IOException {
|
||||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
|
||||||
|
try(br;
|
||||||
|
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
) {
|
||||||
|
br.readLine();
|
||||||
|
br2.readLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
import java.io.BufferedReader
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.InputStreamReader
|
||||||
|
|
||||||
|
class Java9 {
|
||||||
|
@Throws(IOException::class)
|
||||||
|
fun check() {
|
||||||
|
val br = BufferedReader(InputStreamReader(System.`in`))
|
||||||
|
br.use {
|
||||||
|
BufferedReader(InputStreamReader(System.`in`)).use { br2 ->
|
||||||
|
br.readLine()
|
||||||
|
br2.readLine()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
public class Java9 {
|
||||||
|
public void check() throws IOException {
|
||||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
try(br;
|
||||||
|
br2
|
||||||
|
) {
|
||||||
|
br.readLine();
|
||||||
|
br2.readLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import java.io.BufferedReader
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.InputStreamReader
|
||||||
|
|
||||||
|
class Java9 {
|
||||||
|
@Throws(IOException::class)
|
||||||
|
fun check() {
|
||||||
|
val br = BufferedReader(InputStreamReader(System.`in`))
|
||||||
|
val br2 = BufferedReader(InputStreamReader(System.`in`))
|
||||||
|
br.use {
|
||||||
|
br2.use {
|
||||||
|
br.readLine()
|
||||||
|
br2.readLine()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+10
@@ -5066,6 +5066,16 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("nj2k/testData/newJ2k/tryWithResource"), Pattern.compile("^([^\\.]+)\\.java$"), null, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("nj2k/testData/newJ2k/tryWithResource"), Pattern.compile("^([^\\.]+)\\.java$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("Java9.java")
|
||||||
|
public void testJava9() throws Exception {
|
||||||
|
runTest("nj2k/testData/newJ2k/tryWithResource/Java9.java");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("Java9Multiple.java")
|
||||||
|
public void testJava9Multiple() throws Exception {
|
||||||
|
runTest("nj2k/testData/newJ2k/tryWithResource/Java9Multiple.java");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("Multiline.java")
|
@TestMetadata("Multiline.java")
|
||||||
public void testMultiline() throws Exception {
|
public void testMultiline() throws Exception {
|
||||||
runTest("nj2k/testData/newJ2k/tryWithResource/Multiline.java");
|
runTest("nj2k/testData/newJ2k/tryWithResource/Multiline.java");
|
||||||
|
|||||||
Reference in New Issue
Block a user