From bc52281208148992784ecbfffe099ba8764be07a Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 30 Mar 2020 14:30:49 +0300 Subject: [PATCH] New J2K: convert Java method reference to Kotlin one on copy-pasting Java code #KT-34965 fixed --- .../kotlin/nj2k/JavaToJKTreeBuilder.kt | 1 + .../conversions/BuiltinMembersConversion.kt | 18 ++++++++++++++---- .../kotlin/nj2k/printing/JKCodeBuilder.kt | 4 ++++ .../jetbrains/kotlin/nj2k/tree/expressions.kt | 7 ++++++- .../kotlin/nj2k/tree/visitors/JKVisitor.kt | 1 + .../visitors/JKVisitorWithCommentsPrinting.kt | 8 ++++++++ .../ConvertedMethodReference.expected.kt | 3 +++ .../copyPaste/ConvertedMethodReference.java | 5 +++++ .../copyPaste/ConvertedMethodReference.to.kt | 3 +++ .../UnconvertedMethodReference.expected.kt | 3 +++ .../copyPaste/UnconvertedMethodReference.java | 5 +++++ .../copyPaste/UnconvertedMethodReference.to.kt | 3 +++ ...KotlinCopyPasteConversionTestGenerated.java | 10 ++++++++++ 13 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 nj2k/testData/copyPaste/ConvertedMethodReference.expected.kt create mode 100644 nj2k/testData/copyPaste/ConvertedMethodReference.java create mode 100644 nj2k/testData/copyPaste/ConvertedMethodReference.to.kt create mode 100644 nj2k/testData/copyPaste/UnconvertedMethodReference.expected.kt create mode 100644 nj2k/testData/copyPaste/UnconvertedMethodReference.java create mode 100644 nj2k/testData/copyPaste/UnconvertedMethodReference.to.kt diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt index 607d6b78730..28b98e9e940 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/JavaToJKTreeBuilder.kt @@ -470,6 +470,7 @@ class JavaToJKTreeBuilder constructor( is JKClassSymbol -> JKClassAccessExpression(symbol) is JKFieldSymbol -> JKFieldAccessExpression(symbol) is JKPackageSymbol -> JKPackageAccessExpression(symbol) + is JKMethodSymbol -> JKMethodAccessExpression(symbol) else -> throwCanNotConvertError("unexpected symbol ${symbol::class}") }.qualified(qualifierExpression?.toJK()).also { it.withFormattingFrom(this) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt index 9dd26a5dad3..f290fc371f5 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt @@ -68,6 +68,14 @@ class BuiltinMembersConversion(context: NewJ2kConverterContext) : RecursiveAppli true } + is JKMethodAccessExpression -> + conversions[identifier.deepestFqName()]?.firstOrNull { conversion -> + if (conversion.from !is Method) return@firstOrNull false + if (conversion.to !is Method) return@firstOrNull false + if (conversion.filter?.invoke(this) == false) return@firstOrNull false + true + } + is JKNewExpression -> conversions[classSymbol.deepestFqName()]?.firstOrNull { conversion -> if (conversion.from !is NewExpression) return@firstOrNull false @@ -93,21 +101,23 @@ class BuiltinMembersConversion(context: NewJ2kConverterContext) : RecursiveAppli symbolProvider.provideMethodSymbol(fqName), argumentsProvider(from::arguments.detached()), from::typeArgumentList.detached() - ).withFormattingFrom(from) + ) is JKFieldAccessExpression -> JKCallExpressionImpl( symbolProvider.provideMethodSymbol(fqName), JKArgumentList(), JKTypeArgumentList() - ).withFormattingFrom(from) + ) + is JKMethodAccessExpression -> + JKMethodAccessExpression(symbolProvider.provideMethodSymbol(fqName)) is JKNewExpression -> JKCallExpressionImpl( symbolProvider.provideMethodSymbol(fqName), argumentsProvider(from::arguments.detached()), JKTypeArgumentList() - ).withFormattingFrom(from) + ) else -> error("Bad conversion") - } + }.withFormattingFrom(from) } private inner class FieldBuilder( diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/printing/JKCodeBuilder.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/printing/JKCodeBuilder.kt index cbc7a29b888..86d090dceba 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/printing/JKCodeBuilder.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/printing/JKCodeBuilder.kt @@ -142,6 +142,10 @@ internal class JKCodeBuilder(context: NewJ2kConverterContext) { printer.renderSymbol(classAccessExpression.identifier, classAccessExpression) } + override fun visitMethodAccessExpression(methodAccessExpression: JKMethodAccessExpression) { + printer.renderSymbol(methodAccessExpression.identifier, methodAccessExpression) + } + override fun visitFileRaw(file: JKFile) { if (file.packageDeclaration.name.value.isNotEmpty()) { file.packageDeclaration.accept(this) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/expressions.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/expressions.kt index 347c3f47c92..eaf256fc53c 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/expressions.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/expressions.kt @@ -181,7 +181,7 @@ class JKNewExpression( class JKFieldAccessExpression(var identifier: JKFieldSymbol) : JKExpression() { - override fun calculateType(typeFactory: JKTypeFactory) = identifier.fieldType + override fun calculateType(typeFactory: JKTypeFactory) = identifier.fieldType override fun accept(visitor: JKVisitor) = visitor.visitFieldAccessExpression(this) } @@ -196,6 +196,11 @@ class JKClassAccessExpression(var identifier: JKClassSymbol) : JKExpression() { override fun accept(visitor: JKVisitor) = visitor.visitClassAccessExpression(this) } +class JKMethodAccessExpression(val identifier: JKMethodSymbol) : JKExpression() { + override fun calculateType(typeFactory: JKTypeFactory): JKType? = null + override fun accept(visitor: JKVisitor) = visitor.visitMethodAccessExpression(this) +} + class JKMethodReferenceExpression( qualifier: JKExpression, val identifier: JKSymbol, diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt index 270aeb07491..e0572b84b41 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitor.kt @@ -83,6 +83,7 @@ abstract class JKVisitor { open fun visitFieldAccessExpression(fieldAccessExpression: JKFieldAccessExpression) = visitExpression(fieldAccessExpression) open fun visitPackageAccessExpression(packageAccessExpression: JKPackageAccessExpression) = visitExpression(packageAccessExpression) open fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression) = visitExpression(classAccessExpression) + open fun visitMethodAccessExpression(methodAccessExpression: JKMethodAccessExpression) = visitExpression(methodAccessExpression) open fun visitMethodReferenceExpression(methodReferenceExpression: JKMethodReferenceExpression) = visitExpression(methodReferenceExpression) diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt index 90333d15dba..853b27bb4a4 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/tree/visitors/JKVisitorWithCommentsPrinting.kt @@ -579,6 +579,14 @@ abstract class JKVisitorWithCommentsPrinting : JKVisitor() { open fun visitPackageAccessExpressionRaw(packageAccessExpression: JKPackageAccessExpression) = visitExpressionRaw(packageAccessExpression) + override fun visitMethodAccessExpression(methodAccessExpression: JKMethodAccessExpression) { + printLeftNonCodeElements(methodAccessExpression) + visitMethodAccessExpressionRaw(methodAccessExpression) + printRightNonCodeElements(methodAccessExpression) + } + + open fun visitMethodAccessExpressionRaw(methodAccessExpression: JKMethodAccessExpression) = visitExpressionRaw(methodAccessExpression) + override fun visitClassAccessExpression(classAccessExpression: JKClassAccessExpression) { printLeftNonCodeElements(classAccessExpression) visitClassAccessExpressionRaw(classAccessExpression) diff --git a/nj2k/testData/copyPaste/ConvertedMethodReference.expected.kt b/nj2k/testData/copyPaste/ConvertedMethodReference.expected.kt new file mode 100644 index 00000000000..198757d0082 --- /dev/null +++ b/nj2k/testData/copyPaste/ConvertedMethodReference.expected.kt @@ -0,0 +1,3 @@ +fun foo() { + println +} \ No newline at end of file diff --git a/nj2k/testData/copyPaste/ConvertedMethodReference.java b/nj2k/testData/copyPaste/ConvertedMethodReference.java new file mode 100644 index 00000000000..d831948c23d --- /dev/null +++ b/nj2k/testData/copyPaste/ConvertedMethodReference.java @@ -0,0 +1,5 @@ +class A { + public static void main(String[] args) { + System.out.println("nya") + } +} \ No newline at end of file diff --git a/nj2k/testData/copyPaste/ConvertedMethodReference.to.kt b/nj2k/testData/copyPaste/ConvertedMethodReference.to.kt new file mode 100644 index 00000000000..94c413776f2 --- /dev/null +++ b/nj2k/testData/copyPaste/ConvertedMethodReference.to.kt @@ -0,0 +1,3 @@ +fun foo() { + +} \ No newline at end of file diff --git a/nj2k/testData/copyPaste/UnconvertedMethodReference.expected.kt b/nj2k/testData/copyPaste/UnconvertedMethodReference.expected.kt new file mode 100644 index 00000000000..fef8b841041 --- /dev/null +++ b/nj2k/testData/copyPaste/UnconvertedMethodReference.expected.kt @@ -0,0 +1,3 @@ +fun foo() { + System.out.printf +} \ No newline at end of file diff --git a/nj2k/testData/copyPaste/UnconvertedMethodReference.java b/nj2k/testData/copyPaste/UnconvertedMethodReference.java new file mode 100644 index 00000000000..32263fc3ff8 --- /dev/null +++ b/nj2k/testData/copyPaste/UnconvertedMethodReference.java @@ -0,0 +1,5 @@ +class A { + public static void main(String[] args) { + System.out.printf("nya") + } +} \ No newline at end of file diff --git a/nj2k/testData/copyPaste/UnconvertedMethodReference.to.kt b/nj2k/testData/copyPaste/UnconvertedMethodReference.to.kt new file mode 100644 index 00000000000..94c413776f2 --- /dev/null +++ b/nj2k/testData/copyPaste/UnconvertedMethodReference.to.kt @@ -0,0 +1,3 @@ +fun foo() { + +} \ No newline at end of file diff --git a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinCopyPasteConversionTestGenerated.java b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinCopyPasteConversionTestGenerated.java index 65c526d34fe..6737268b67a 100644 --- a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinCopyPasteConversionTestGenerated.java +++ b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinCopyPasteConversionTestGenerated.java @@ -83,6 +83,11 @@ public class NewJavaToKotlinCopyPasteConversionTestGenerated extends AbstractNew runTest("nj2k/testData/copyPaste/ConversionInCorrectContext.java"); } + @TestMetadata("ConvertedMethodReference.java") + public void testConvertedMethodReference() throws Exception { + runTest("nj2k/testData/copyPaste/ConvertedMethodReference.java"); + } + @TestMetadata("CopyAnnotation.java") public void testCopyAnnotation() throws Exception { runTest("nj2k/testData/copyPaste/CopyAnnotation.java"); @@ -222,4 +227,9 @@ public class NewJavaToKotlinCopyPasteConversionTestGenerated extends AbstractNew public void testSingleWordFromIdentifier() throws Exception { runTest("nj2k/testData/copyPaste/SingleWordFromIdentifier.java"); } + + @TestMetadata("UnconvertedMethodReference.java") + public void testUnconvertedMethodReference() throws Exception { + runTest("nj2k/testData/copyPaste/UnconvertedMethodReference.java"); + } }