diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetIntention.kt index 80b4a1c06ce..fc650402d39 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetIntention.kt @@ -32,9 +32,15 @@ import org.jetbrains.kotlin.psi.buildExpression import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess public class ExplicitGetInspection : IntentionBasedInspection( - ReplaceGetIntention(), - additionalChecker = { expression -> (expression.toResolvedCall()!!.resultingDescriptor as FunctionDescriptor).isExplicitOperator() } -) + ReplaceGetIntention(), ExplicitGetInspection.additionalChecker + +) { + companion object { + val additionalChecker = { expression: JetDotQualifiedExpression -> + (expression.toResolvedCall()!!.resultingDescriptor as FunctionDescriptor).isExplicitOperator() + } + } +} private fun FunctionDescriptor.isExplicitOperator(): Boolean { return if (overriddenDescriptors.isEmpty()) diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt index 5b93c48fd08..981d2e1cadf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.idea.inspections.RedundantSamConstructorInspection import org.jetbrains.kotlin.idea.intentions.* import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfThenToElvisIntention import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfThenToSafeAccessIntention +import org.jetbrains.kotlin.idea.intentions.conventionNameCalls.ExplicitGetInspection import org.jetbrains.kotlin.idea.intentions.conventionNameCalls.ReplaceGetIntention import org.jetbrains.kotlin.idea.quickfix.RemoveModifierFix import org.jetbrains.kotlin.idea.quickfix.RemoveRightPartOfBinaryExpressionFix @@ -59,7 +60,7 @@ object J2KPostProcessingRegistrar { registerIntentionBasedProcessing(IfThenToElvisIntention()) { applyTo(it) } registerIntentionBasedProcessing(IfNullToElvisIntention()) { applyTo(it) } registerIntentionBasedProcessing(SimplifyNegatedBinaryExpressionIntention()) { applyTo(it) } - registerIntentionBasedProcessing(ReplaceGetIntention()) { applyTo(it) } + registerIntentionBasedProcessing(ReplaceGetIntention(), additionalChecker = ExplicitGetInspection.additionalChecker) { applyTo(it) } registerIntentionBasedProcessing(AddOperatorModifierIntention()) { applyTo(it) } registerDiagnosticBasedProcessing(Errors.USELESS_CAST) { element, diagnostic -> @@ -102,12 +103,22 @@ object J2KPostProcessingRegistrar { private inline fun > registerIntentionBasedProcessing( intention: TIntention, crossinline apply: TIntention.(TElement) -> Unit + ) { + //TODO: replace with optional argument when supported for inline functions + return registerIntentionBasedProcessing(intention, { true }, apply) + } + + private inline fun > registerIntentionBasedProcessing( + intention: TIntention, + noinline additionalChecker: (TElement) -> Boolean, + crossinline apply: TIntention.(TElement) -> Unit ) { _processings.add(object : J2kPostProcessing { override fun createAction(element: JetElement, diagnostics: Diagnostics): (() -> Unit)? { if (!javaClass().isInstance(element)) return null - @Suppress("UNCHECKED_CAST") - if (intention.applicabilityRange(element as TElement) == null) return null + val tElement = element as TElement + if (intention.applicabilityRange(tElement) == null) return null + if (!additionalChecker(tElement)) return null return { intention.apply(element) } } }) diff --git a/j2k/testData/JavaApi.java b/j2k/testData/JavaApi.java index db9f3538eee..8ab4dac7930 100644 --- a/j2k/testData/JavaApi.java +++ b/j2k/testData/JavaApi.java @@ -113,4 +113,10 @@ public class JavaClassDerivedFromKotlinClassWithProperties extends KotlinClassWi @Override public void setSomeVar2(String value) { } +} + +public class JavaClass { + public int get(int p) { + return 0; + } } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/postProcessing/GetOperator.java b/j2k/testData/fileOrElement/postProcessing/GetOperator.java index 39549367610..a546afee58b 100644 --- a/j2k/testData/fileOrElement/postProcessing/GetOperator.java +++ b/j2k/testData/fileOrElement/postProcessing/GetOperator.java @@ -1,5 +1,6 @@ import java.util.HashMap; import kotlinApi.KotlinClass; +import javaApi.JavaClass; class X { int get(int index) { @@ -19,4 +20,8 @@ class C { int foo(KotlinClass kotlinClass) { return kotlinClass.get(0); // not operator! } + + int foo(JavaClass javaClass) { + return javaClass.get(0); + } } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/postProcessing/GetOperator.kt b/j2k/testData/fileOrElement/postProcessing/GetOperator.kt index d479f3f1676..984a5fbbe2d 100644 --- a/j2k/testData/fileOrElement/postProcessing/GetOperator.kt +++ b/j2k/testData/fileOrElement/postProcessing/GetOperator.kt @@ -1,6 +1,7 @@ // ERROR: Type mismatch: inferred type is kotlin.String? but kotlin.String was expected import java.util.HashMap import kotlinApi.KotlinClass +import javaApi.JavaClass internal class X { operator fun get(index: Int): Int { @@ -20,4 +21,8 @@ internal class C { fun foo(kotlinClass: KotlinClass): Int { return kotlinClass.get(0) // not operator! } -} + + fun foo(javaClass: JavaClass): Int { + return javaClass.get(0) + } +} \ No newline at end of file