From c5e13ebc68810d1c3cdc9bba1fb501266950b9d6 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 22 Oct 2015 14:48:22 +0300 Subject: [PATCH] Minor corrections on code review --- .../jetbrains/kotlin/util/OperatorChecker.kt | 41 ++++++++++--------- .../ReplaceGetOrSet.html | 2 +- .../ReplaceGetOrSetIntention.kt | 7 ++-- .../replaceGetOrSet/set2.kt | 4 +- .../replaceGetOrSet/set2.kt.after | 4 +- .../replaceGetOrSet/setWithNoParameters.kt | 11 +++++ .../replaceGetOrSet/setWithVararg.kt | 11 +++++ .../intentions/IntentionTestGenerated.java | 12 ++++++ 8 files changed, 64 insertions(+), 28 deletions(-) create mode 100644 idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithNoParameters.kt create mode 100644 idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithVararg.kt diff --git a/core/descriptors/src/org/jetbrains/kotlin/util/OperatorChecker.kt b/core/descriptors/src/org/jetbrains/kotlin/util/OperatorChecker.kt index 5bcba37dd16..aa1070e8604 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/util/OperatorChecker.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/util/OperatorChecker.kt @@ -26,29 +26,30 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.descriptorUtil.module -import org.jetbrains.kotlin.types.typeUtil.* -import org.jetbrains.kotlin.util.OperatorNameConventions.GET -import org.jetbrains.kotlin.util.OperatorNameConventions.SET -import org.jetbrains.kotlin.util.OperatorNameConventions.INVOKE -import org.jetbrains.kotlin.util.OperatorNameConventions.CONTAINS -import org.jetbrains.kotlin.util.OperatorNameConventions.ITERATOR -import org.jetbrains.kotlin.util.OperatorNameConventions.NEXT -import org.jetbrains.kotlin.util.OperatorNameConventions.HAS_NEXT -import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS -import org.jetbrains.kotlin.util.OperatorNameConventions.COMPARE_TO -import org.jetbrains.kotlin.util.OperatorNameConventions.BINARY_OPERATION_NAMES +import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf +import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.util.OperatorNameConventions.ASSIGNMENT_OPERATIONS +import org.jetbrains.kotlin.util.OperatorNameConventions.BINARY_OPERATION_NAMES +import org.jetbrains.kotlin.util.OperatorNameConventions.COMPARE_TO import org.jetbrains.kotlin.util.OperatorNameConventions.COMPONENT_REGEX -import org.jetbrains.kotlin.util.OperatorNameConventions.PLUS -import org.jetbrains.kotlin.util.OperatorNameConventions.MINUS -import org.jetbrains.kotlin.util.OperatorNameConventions.RANGE_TO -import org.jetbrains.kotlin.util.OperatorNameConventions.UNARY_PLUS -import org.jetbrains.kotlin.util.OperatorNameConventions.UNARY_MINUS -import org.jetbrains.kotlin.util.OperatorNameConventions.NOT -import org.jetbrains.kotlin.util.OperatorNameConventions.INC +import org.jetbrains.kotlin.util.OperatorNameConventions.CONTAINS import org.jetbrains.kotlin.util.OperatorNameConventions.DEC +import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS +import org.jetbrains.kotlin.util.OperatorNameConventions.GET import org.jetbrains.kotlin.util.OperatorNameConventions.GET_VALUE +import org.jetbrains.kotlin.util.OperatorNameConventions.HAS_NEXT +import org.jetbrains.kotlin.util.OperatorNameConventions.INC +import org.jetbrains.kotlin.util.OperatorNameConventions.INVOKE +import org.jetbrains.kotlin.util.OperatorNameConventions.ITERATOR +import org.jetbrains.kotlin.util.OperatorNameConventions.MINUS +import org.jetbrains.kotlin.util.OperatorNameConventions.NEXT +import org.jetbrains.kotlin.util.OperatorNameConventions.NOT +import org.jetbrains.kotlin.util.OperatorNameConventions.PLUS +import org.jetbrains.kotlin.util.OperatorNameConventions.RANGE_TO +import org.jetbrains.kotlin.util.OperatorNameConventions.SET import org.jetbrains.kotlin.util.OperatorNameConventions.SET_VALUE +import org.jetbrains.kotlin.util.OperatorNameConventions.UNARY_MINUS +import org.jetbrains.kotlin.util.OperatorNameConventions.UNARY_PLUS object OperatorChecks { fun canBeOperator(functionDescriptor: FunctionDescriptor): Boolean { @@ -127,4 +128,6 @@ object OperatorChecks { private val FunctionDescriptor.noDefaultsAndVarargs: Boolean get() = valueParameters.all { !it.hasDefaultValue() && it.varargElementType == null } -} \ No newline at end of file +} + +fun FunctionDescriptor.isValidOperator() = isOperator && OperatorChecks.canBeOperator(this) \ No newline at end of file diff --git a/idea/resources/inspectionDescriptions/ReplaceGetOrSet.html b/idea/resources/inspectionDescriptions/ReplaceGetOrSet.html index 4dae55e30fa..23d7d9f8698 100644 --- a/idea/resources/inspectionDescriptions/ReplaceGetOrSet.html +++ b/idea/resources/inspectionDescriptions/ReplaceGetOrSet.html @@ -1,5 +1,5 @@ -This inspection reports any explicit calls of 'get' or 'set' functions which can be replaced by indexing operator [] +This inspection reports any explicit calls of get or set functions which can be replaced by indexing operator [] diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetOrSetIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetOrSetIntention.kt index 9b8fbfceca3..c2379cc03da 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetOrSetIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceGetOrSetIntention.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.util.OperatorNameConventions +import org.jetbrains.kotlin.util.isValidOperator public class ReplaceGetOrSetInspection : IntentionBasedInspection( ReplaceGetOrSetIntention(), ReplaceGetOrSetInspection.additionalChecker @@ -68,7 +69,7 @@ class ReplaceGetOrSetIntention : JetSelfTargetingRangeIntention 0) - } + assert(allArguments.isNotEmpty()) val expression = KtPsiFactory(element).buildExpression { appendExpression(element.getReceiverExpression()) diff --git a/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/set2.kt b/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/set2.kt index d4d490d5f37..17b2712ccc0 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/set2.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/set2.kt @@ -1,11 +1,11 @@ // INTENTION_TEXT: Replace 'set' call with indexing operator class C { - operator fun set(s: String, value: Int) {} + operator fun set(s: String, p: Int, value: Int): Boolean = true } class D(val c: C) { fun foo() { - this.c.set("x", 1) + this.c.set("x", 2, 1) } } diff --git a/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/set2.kt.after b/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/set2.kt.after index 4dadfcb3d69..899529775ae 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/set2.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/set2.kt.after @@ -1,11 +1,11 @@ // INTENTION_TEXT: Replace 'set' call with indexing operator class C { - operator fun set(s: String, value: Int) {} + operator fun set(s: String, p: Int, value: Int): Boolean = true } class D(val c: C) { fun foo() { - this.c["x"] = 1 + this.c["x", 2] = 1 } } diff --git a/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithNoParameters.kt b/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithNoParameters.kt new file mode 100644 index 00000000000..9b55825aefd --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithNoParameters.kt @@ -0,0 +1,11 @@ +// IS_APPLICABLE: false + +class C { + operator fun set(){} +} + +class D(val c: C) { + fun foo() { + this.c.set() + } +} diff --git a/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithVararg.kt b/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithVararg.kt new file mode 100644 index 00000000000..78f17e3b90a --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithVararg.kt @@ -0,0 +1,11 @@ +// IS_APPLICABLE: false + +class C { + operator fun set(s: String, vararg value: Int): Boolean = true +} + +class D(val c: C) { + fun foo() { + this.c.set("x", 1, 2) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 6552bc3c10e..1a932897553 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -2870,6 +2870,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("setWithNoParameters.kt") + public void testSetWithNoParameters() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithNoParameters.kt"); + doTest(fileName); + } + + @TestMetadata("setWithVararg.kt") + public void testSetWithVararg() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/conventionNameCalls/replaceGetOrSet/setWithVararg.kt"); + doTest(fileName); + } + @TestMetadata("singleArgument.kt") public void testSingleArgument() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/conventionNameCalls/replaceGetOrSet/singleArgument.kt");