New J2K: convert Java method reference to Kotlin one on copy-pasting Java code
#KT-34965 fixed
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
fun foo() {
|
||||
println
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
class A {
|
||||
public static void main(String[] args) {
|
||||
<selection>System.out.println</selection>("nya")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fun foo() {
|
||||
<caret>
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fun foo() {
|
||||
System.out.printf
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
class A {
|
||||
public static void main(String[] args) {
|
||||
<selection>System.out.printf</selection>("nya")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fun foo() {
|
||||
<caret>
|
||||
}
|
||||
+10
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user