From d738a12b861144d0c73ab60f1621138415c1026a Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Mon, 15 Apr 2019 18:20:44 +0700 Subject: [PATCH] Fix false positive ReplaceJavaStaticMethodWithKotlinAnalog for java.io.PrintStream --- ...JavaStaticMethodWithKotlinAnalogInspection.kt | 16 ++++++++++------ .../io/notApplicablePrint.kt | 5 +++++ .../LocalInspectionTestGenerated.java | 5 +++++ 3 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 idea/testData/inspectionsLocal/replaceJavaStaticMethodWithKotlinAnalog/io/notApplicablePrint.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceJavaStaticMethodWithKotlinAnalogInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceJavaStaticMethodWithKotlinAnalogInspection.kt index 82bb53c0dd5..fdc83e5029c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceJavaStaticMethodWithKotlinAnalogInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceJavaStaticMethodWithKotlinAnalogInspection.kt @@ -12,17 +12,16 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference +import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.inspections.collections.isCalling import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtDotQualifiedExpression -import org.jetbrains.kotlin.psi.KtPsiFactory -import org.jetbrains.kotlin.psi.callExpressionVisitor +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall @@ -121,8 +120,8 @@ class ReplaceJavaStaticMethodWithKotlinAnalogInspection : AbstractKotlinInspecti } private val JAVA_IO = listOf( - Replacement("java.io.PrintStream.print", "kotlin.io.print"), - Replacement("java.io.PrintStream.println", "kotlin.io.println") + Replacement("java.io.PrintStream.print", "kotlin.io.print", filter = ::isJavaSystemOut), + Replacement("java.io.PrintStream.println", "kotlin.io.println", filter = ::isJavaSystemOut) ) private val JAVA_SYSTEM = listOf( @@ -182,3 +181,8 @@ class ReplaceJavaStaticMethodWithKotlinAnalogInspection : AbstractKotlinInspecti ).groupBy { it.javaMethodShortName } } } + +private fun isJavaSystemOut(callExpression: KtCallExpression): Boolean = (callExpression.calleeExpression as? KtSimpleNameExpression) + ?.getReceiverExpression() + ?.resolveToCall() + ?.isCalling(FqName("java.lang.System.out")) ?: false \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/replaceJavaStaticMethodWithKotlinAnalog/io/notApplicablePrint.kt b/idea/testData/inspectionsLocal/replaceJavaStaticMethodWithKotlinAnalog/io/notApplicablePrint.kt new file mode 100644 index 00000000000..bcf4f8013d2 --- /dev/null +++ b/idea/testData/inspectionsLocal/replaceJavaStaticMethodWithKotlinAnalog/io/notApplicablePrint.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +// PROBLEM: none +fun test() { + System.err.print("foo") +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 9c4697f955a..c54aff720c2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -7263,6 +7263,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/replaceJavaStaticMethodWithKotlinAnalog/io"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), TargetBackend.ANY, true); } + @TestMetadata("notApplicablePrint.kt") + public void testNotApplicablePrint() throws Exception { + runTest("idea/testData/inspectionsLocal/replaceJavaStaticMethodWithKotlinAnalog/io/notApplicablePrint.kt"); + } + @TestMetadata("print.kt") public void testPrint() throws Exception { runTest("idea/testData/inspectionsLocal/replaceJavaStaticMethodWithKotlinAnalog/io/print.kt");