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 68f30a2bdf3..c8ffde59427 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetIntention.kt @@ -19,20 +19,26 @@ package org.jetbrains.kotlin.idea.intentions.conventionNameCalls import com.intellij.codeInsight.intention.HighPriorityAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.util.TextRange +import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingRangeIntention import org.jetbrains.kotlin.idea.intentions.callExpression -import org.jetbrains.kotlin.idea.intentions.calleeName import org.jetbrains.kotlin.idea.intentions.isReceiverExpressionWithValue +import org.jetbrains.kotlin.idea.intentions.toResolvedCall import org.jetbrains.kotlin.psi.JetDotQualifiedExpression import org.jetbrains.kotlin.psi.JetPsiFactory import org.jetbrains.kotlin.psi.buildExpression +import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess public class ExplicitGetInspection : IntentionBasedInspection(ReplaceGetIntention()) public class ReplaceGetIntention : JetSelfTargetingRangeIntention(javaClass(), "Replace 'get' call with index operator"), HighPriorityAction { override fun applicabilityRange(element: JetDotQualifiedExpression): TextRange? { - if (element.calleeName != "get") return null + val resolvedCall = element.toResolvedCall() ?: return null + if (!resolvedCall.isReallySuccess()) return null + val target = resolvedCall.resultingDescriptor as? FunctionDescriptor ?: return null + if (target.name.asString() != "get" || !target.isOperator) return null + val call = element.callExpression ?: return null if (call.getTypeArgumentList() != null) return null @@ -46,6 +52,10 @@ public class ReplaceGetIntention : JetSelfTargetingRangeIntentionet(1, 3, 4, 5) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/acceptableVararg.kt.after b/idea/testData/intentions/conventionNameCalls/replaceGet/acceptableVararg.kt.after index 88114b5dab1..1995cad0221 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/acceptableVararg.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/acceptableVararg.kt.after @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(a: Int, vararg b: Int, c: Int = 0) : Int = 0 + operator fun get(a: Int, vararg b: Int, c: Int = 0) : Int = 0 } val test = Test() test[1, 3, 4, 5] diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/argumentAndFunction.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/argumentAndFunction.kt index a7ee2926496..934eda5c428 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/argumentAndFunction.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/argumentAndFunction.kt @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(a: Int, b: Int, fn: (i: Int) -> Int) : Int = 0 + operator fun get(a: Int, b: Int, fn: (i: Int) -> Int) : Int = 0 } val test = Test() test.get(1, 2) { i -> diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/argumentAndFunction.kt.after b/idea/testData/intentions/conventionNameCalls/replaceGet/argumentAndFunction.kt.after index 3cb47e780b8..37257daadf1 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/argumentAndFunction.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/argumentAndFunction.kt.after @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(a: Int, b: Int, fn: (i: Int) -> Int) : Int = 0 + operator fun get(a: Int, b: Int, fn: (i: Int) -> Int) : Int = 0 } val test = Test() test[1, 2, { i -> diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/duplicateArguments.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/duplicateArguments.kt index 08a23a6918d..caea29a4a0f 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/duplicateArguments.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/duplicateArguments.kt @@ -3,7 +3,7 @@ // ERROR: No value passed for parameter b fun test() { class Test{ - fun get(a: Int, b: Int) : Int = 0 + operator fun get(a: Int, b: Int) : Int = 0 } val test = Test() test.get(a=0, a=1) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/extensionFunction.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/extensionFunction.kt index 8469dfa916e..8c3b95e2668 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/extensionFunction.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/extensionFunction.kt @@ -1,7 +1,8 @@ fun test() { class Test() - fun Test.get(i: Int) : Int = 0 + operator fun Test.get(i: Int) : Int = 0 + val test = Test() test.get(0) } diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/extensionFunction.kt.after b/idea/testData/intentions/conventionNameCalls/replaceGet/extensionFunction.kt.after index c2829f5fe6a..de95df26536 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/extensionFunction.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/extensionFunction.kt.after @@ -1,7 +1,8 @@ fun test() { class Test() - fun Test.get(i: Int) : Int = 0 + operator fun Test.get(i: Int) : Int = 0 + val test = Test() test[0] } diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/functionalArgument.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/functionalArgument.kt index 3851f263ee9..41d3a585e09 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/functionalArgument.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/functionalArgument.kt @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(fn: (i: Int) -> Int) : Int = 0 + operator fun get(fn: (i: Int) -> Int) : Int = 0 } val test = Test() test.get() { i -> diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/functionalArgument.kt.after b/idea/testData/intentions/conventionNameCalls/replaceGet/functionalArgument.kt.after index eb9b727bd88..7886980fe94 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/functionalArgument.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/functionalArgument.kt.after @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(fn: (i: Int) -> Int) : Int = 0 + operator fun get(fn: (i: Int) -> Int) : Int = 0 } val test = Test() test[{ i -> diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/inspectionData/expected.xml b/idea/testData/intentions/conventionNameCalls/replaceGet/inspectionData/expected.xml index 874febad96d..59d765eeadc 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/inspectionData/expected.xml +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/inspectionData/expected.xml @@ -28,7 +28,7 @@ extensionFunction.kt - 6 + 7 light_idea_test_case Explicit 'get' diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/invalidArgument.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/invalidArgument.kt index fae3a7228b3..7833c291f06 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/invalidArgument.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/invalidArgument.kt @@ -2,7 +2,7 @@ // ERROR: Cannot find a parameter with this name: c fun test() { class Test{ - fun get(a: Int=1, b: Int=2) : Int = 0 + operator fun get(a: Int=1, b: Int=2) : Int = 0 } val test = Test() test.get(c=3) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/missingDefaultArgument.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/missingDefaultArgument.kt index effd2a05ed1..ec9ecba95c6 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/missingDefaultArgument.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/missingDefaultArgument.kt @@ -1,7 +1,7 @@ // IS_APPLICABLE: false fun test() { class Test{ - fun get(a: Int=1, b: Int=2) : Int = 0 + operator fun get(a: Int=1, b: Int=2) : Int = 0 } val test = Test() test.get(b=3) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/multiArgument.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/multiArgument.kt index 5c4b2959191..6947c4197d0 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/multiArgument.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/multiArgument.kt @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(a: Int, b: Int) : Int = 0 + operator fun get(a: Int, b: Int) : Int = 0 } val test = Test() test.get(1, 2) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/multiArgument.kt.after b/idea/testData/intentions/conventionNameCalls/replaceGet/multiArgument.kt.after index 5eb89b0a1c9..a2a898cb5c7 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/multiArgument.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/multiArgument.kt.after @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(a: Int, b: Int) : Int = 0 + operator fun get(a: Int, b: Int) : Int = 0 } val test = Test() test[1, 2] diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/noArgument.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/noArgument.kt index aaf20659585..58a5f7ef6e9 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/noArgument.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/noArgument.kt @@ -1,7 +1,7 @@ // IS_APPLICABLE: false fun test() { class Test{ - fun get() : Int = 0 + operator fun get() : Int = 0 } val test = Test() test.get() diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/notOperator.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/notOperator.kt new file mode 100644 index 00000000000..b1ceac07976 --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/notOperator.kt @@ -0,0 +1,10 @@ +// IS_APPLICABLE: false +package p + +class C + +fun C.get(s: String) = s + +fun foo(c: C) { + c.get("x") +} diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt index 06155e771a3..f5ebcd15bf6 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt @@ -1,6 +1,6 @@ class C { companion object { - fun get(s: String): C = C() + operator fun get(s: String): C = C() } } diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt.after b/idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt.after index c2e99062d7d..5a13b8c72c9 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt.after @@ -1,6 +1,6 @@ class C { companion object { - fun get(s: String): C = C() + operator fun get(s: String): C = C() } } diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/sanityCheck.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/sanityCheck.kt index b3079cc1e45..b68378e3a2d 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/sanityCheck.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/sanityCheck.kt @@ -2,7 +2,7 @@ // ERROR: Unresolved reference: got fun test() { class Test{ - fun get(i: Int) : Int = 0 + operator fun get(i: Int) : Int = 0 } val test = Test() test.got(0) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/singleArgument.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/singleArgument.kt index 4037a712af3..81ee1da68cb 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/singleArgument.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/singleArgument.kt @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(i: Int) : Int = 0 + operator fun get(i: Int) : Int = 0 } val test = Test() test.get(0) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/singleArgument.kt.after b/idea/testData/intentions/conventionNameCalls/replaceGet/singleArgument.kt.after index fdc57ef9fbf..cdfc28a0de9 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/singleArgument.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/singleArgument.kt.after @@ -1,6 +1,6 @@ fun test() { class Test{ - fun get(i: Int) : Int = 0 + operator fun get(i: Int) : Int = 0 } val test = Test() test[0] diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/super.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/super.kt index 671bba995e5..13fc86a6195 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/super.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/super.kt @@ -1,7 +1,7 @@ // IS_APPLICABLE: false open class Base { - open fun get(s: String) = "" + open operator fun get(s: String) = "" } class C : Base() { diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/topLevelFun.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/topLevelFun.kt index 78136c9185b..ed828989ccb 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/topLevelFun.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/topLevelFun.kt @@ -1,7 +1,7 @@ // IS_APPLICABLE: false package p -fun get(s: String) = s +operator fun get(s: String) = s fun foo() { p.get("x") diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/unacceptableVararg.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/unacceptableVararg.kt index 7e73e0d5d53..fc7be00e7e3 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/unacceptableVararg.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/unacceptableVararg.kt @@ -1,7 +1,7 @@ // IS_APPLICABLE: false fun test() { class Test{ - fun get(a: Int, vararg b: Int, c: Int = 0) : Int = 0 + operator fun get(a: Int, vararg b: Int, c: Int = 0) : Int = 0 } val test = Test() test.get(1, 3, 4, c=5) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGet/unnamedAndNamed.kt b/idea/testData/intentions/conventionNameCalls/replaceGet/unnamedAndNamed.kt index 5e787a3ff16..da4be6cf0c9 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGet/unnamedAndNamed.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGet/unnamedAndNamed.kt @@ -1,7 +1,7 @@ // IS_APPLICABLE: false fun test() { class Test{ - fun get(a: Int = 0, b: Int = 1, c: Int = 2, d: Int = 3) : Int = 0 + operator fun get(a: Int = 0, b: Int = 1, c: Int = 2, d: Int = 3) : Int = 0 } val test = Test() test.get(1, c=3, b=2) diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index a026f78cf47..d3dddac23a4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -2783,6 +2783,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("notOperator.kt") + public void testNotOperator() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/conventionNameCalls/replaceGet/notOperator.kt"); + doTest(fileName); + } + @TestMetadata("qualifier.kt") public void testQualifier() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/conventionNameCalls/replaceGet/qualifier.kt");