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");
+ }
}