Fix for KT-5410 J2K: someObject + "someString" should be converted to someObject.toString() + "someString"
Otherwise `+` operator will not resolve
This commit is contained in:
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.j2k
|
|||||||
|
|
||||||
import com.intellij.psi.search.LocalSearchScope
|
import com.intellij.psi.search.LocalSearchScope
|
||||||
import com.intellij.psi.search.searches.ReferencesSearch
|
import com.intellij.psi.search.searches.ReferencesSearch
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
@@ -36,6 +37,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
|
|||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierType
|
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierType
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getType
|
||||||
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
||||||
import org.jetbrains.kotlin.utils.mapToIndex
|
import org.jetbrains.kotlin.utils.mapToIndex
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -60,6 +62,7 @@ object J2KPostProcessingRegistrar {
|
|||||||
_processings.add(RemoveExplicitTypeArgumentsProcessing())
|
_processings.add(RemoveExplicitTypeArgumentsProcessing())
|
||||||
_processings.add(RemoveRedundantOverrideVisibilityProcessing())
|
_processings.add(RemoveRedundantOverrideVisibilityProcessing())
|
||||||
_processings.add(MoveLambdaOutsideParenthesesProcessing())
|
_processings.add(MoveLambdaOutsideParenthesesProcessing())
|
||||||
|
_processings.add(FixObjectStringConcatenationProcessing())
|
||||||
_processings.add(ConvertToStringTemplateProcessing())
|
_processings.add(ConvertToStringTemplateProcessing())
|
||||||
_processings.add(UsePropertyAccessSyntaxProcessing())
|
_processings.add(UsePropertyAccessSyntaxProcessing())
|
||||||
_processings.add(RemoveRedundantSamAdaptersProcessing())
|
_processings.add(RemoveRedundantSamAdaptersProcessing())
|
||||||
@@ -243,4 +246,31 @@ object J2KPostProcessingRegistrar {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class FixObjectStringConcatenationProcessing : J2kPostProcessing {
|
||||||
|
override fun createAction(element: KtElement, diagnostics: Diagnostics): (() -> Unit)? {
|
||||||
|
if (element !is KtBinaryExpression ||
|
||||||
|
element.operationToken != KtTokens.PLUS ||
|
||||||
|
diagnostics.forElement(element.operationReference).none {
|
||||||
|
it.factory == Errors.UNRESOLVED_REFERENCE_WRONG_RECEIVER
|
||||||
|
|| it.factory == Errors.NONE_APPLICABLE
|
||||||
|
})
|
||||||
|
return null
|
||||||
|
|
||||||
|
val bindingContext = element.analyzeAndGetResult().bindingContext
|
||||||
|
val rightType = element.right?.getType(bindingContext) ?: return null
|
||||||
|
|
||||||
|
if (KotlinBuiltIns.isString(rightType)) {
|
||||||
|
return {
|
||||||
|
val factory = KtPsiFactory(element)
|
||||||
|
element.left!!.replace(factory.buildExpression {
|
||||||
|
appendFixedText("(")
|
||||||
|
appendExpression(element.left)
|
||||||
|
appendFixedText(").toString()")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
public class Test {
|
||||||
|
public static class B {
|
||||||
|
public static class C {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public C c() {
|
||||||
|
return new C();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void a() {
|
||||||
|
B b = new B();
|
||||||
|
System.out.println(b + "");
|
||||||
|
String a = 1 + "0";
|
||||||
|
System.out.println(b.c() + "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String p = new Test() + "123";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
class Test {
|
||||||
|
class B {
|
||||||
|
class C
|
||||||
|
|
||||||
|
fun c(): C {
|
||||||
|
return C()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun a() {
|
||||||
|
val b = B()
|
||||||
|
println(b.toString() + "")
|
||||||
|
val a = 1.toString() + "0"
|
||||||
|
println(b.c().toString() + "")
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
@JvmStatic fun main(args: Array<String>) {
|
||||||
|
val p = Test().toString() + "123"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -553,6 +553,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("lhsObjectPlusString.java")
|
||||||
|
public void testLhsObjectPlusString() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/binaryExpression/lhsObjectPlusString.java");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("minus.java")
|
@TestMetadata("minus.java")
|
||||||
public void testMinus() throws Exception {
|
public void testMinus() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/binaryExpression/minus.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/binaryExpression/minus.java");
|
||||||
|
|||||||
@@ -553,6 +553,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("lhsObjectPlusString.java")
|
||||||
|
public void testLhsObjectPlusString() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/binaryExpression/lhsObjectPlusString.java");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("minus.java")
|
@TestMetadata("minus.java")
|
||||||
public void testMinus() throws Exception {
|
public void testMinus() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/binaryExpression/minus.java");
|
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/binaryExpression/minus.java");
|
||||||
|
|||||||
Reference in New Issue
Block a user