diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt index f7c1733a9fd..c327eaffb07 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.references.ReferenceAccess import org.jetbrains.kotlin.idea.references.readWriteAccess +import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector @@ -86,6 +87,7 @@ public class OperatorToFunctionIntention : JetSelfTargetingIntention { + var elementToBeReplaced = element + if (element is KtArrayAccessExpression && isAssignmentLeftSide(element)) { + elementToBeReplaced = element.parent as KtExpression + } + + val commentSaver = CommentSaver(elementToBeReplaced, saveLineBreaks = true) + val result = when (element) { is KtPrefixExpression -> convertPrefix(element) is KtPostfixExpression -> convertPostFix(element) @@ -216,6 +233,8 @@ public class OperatorToFunctionIntention : JetSelfTargetingIntention throw IllegalArgumentException(element.toString()) } + commentSaver.restore(result) + val callName = findCallName(result) ?: error("No call name found in ${result.text}") return result to callName diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/CommentSaver.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/CommentSaver.kt similarity index 99% rename from idea/idea-core/src/org/jetbrains/kotlin/idea/core/CommentSaver.kt rename to idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/CommentSaver.kt index 6c95c26e7b8..1ea44fe041d 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/CommentSaver.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/CommentSaver.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.core +package org.jetbrains.kotlin.idea.util import com.intellij.openapi.util.Key import com.intellij.openapi.util.TextRange @@ -24,8 +24,7 @@ import org.jetbrains.kotlin.lexer.KtToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.psiUtil.* -import java.util.ArrayList -import java.util.HashMap +import java.util.* import kotlin.properties.Delegates public class CommentSaver(originalElements: PsiChildRange, private val saveLineBreaks: Boolean = false/*TODO?*/) { diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertForEachToForLoopIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertForEachToForLoopIntention.kt index cfb4693c1b2..d9243fa4ae0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertForEachToForLoopIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertForEachToForLoopIntention.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.core.CommentSaver +import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToExpressionBodyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToExpressionBodyIntention.kt index e07d49daf06..1f56814a612 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToExpressionBodyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToExpressionBodyIntention.kt @@ -20,7 +20,7 @@ import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.core.CommentSaver +import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.idea.core.canOmitDeclaredType import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.lexer.KtTokens diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToForEachFunctionCallIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToForEachFunctionCallIntention.kt index 94dc6aedb8b..880346e4bf1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToForEachFunctionCallIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToForEachFunctionCallIntention.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor -import org.jetbrains.kotlin.idea.core.CommentSaver +import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtForExpression import org.jetbrains.kotlin.psi.KtPsiFactory diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/SplitIfIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/SplitIfIntention.kt index c42c9d18d14..e5e5d154556 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/SplitIfIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/SplitIfIntention.kt @@ -21,7 +21,7 @@ import com.intellij.openapi.util.TextRange import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.idea.conversion.copy.range import org.jetbrains.kotlin.idea.conversion.copy.start -import org.jetbrains.kotlin.idea.core.CommentSaver +import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/CallableUsageReplacementStrategy.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/CallableUsageReplacementStrategy.kt index 3459229d142..190837d20aa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/CallableUsageReplacementStrategy.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/CallableUsageReplacementStrategy.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.core.* import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeArgumentsIntention import org.jetbrains.kotlin.idea.intentions.setType +import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.idea.util.ShortenReferences diff --git a/idea/testData/intentions/operatorToFunction/keepComments.kt b/idea/testData/intentions/operatorToFunction/keepComments.kt new file mode 100644 index 00000000000..99bfb0c8a14 --- /dev/null +++ b/idea/testData/intentions/operatorToFunction/keepComments.kt @@ -0,0 +1,11 @@ +interface C { + operator fun set(p1: String, p2: String, value: Int) +} + +class D(val c: C) { + fun foo() { + this.c/* and this is c */[ + "a", // it's "a" + "b" /* and this is "b" */] = /* we use 10 */10 + } +} diff --git a/idea/testData/intentions/operatorToFunction/keepComments.kt.after b/idea/testData/intentions/operatorToFunction/keepComments.kt.after new file mode 100644 index 00000000000..b23549c9a76 --- /dev/null +++ b/idea/testData/intentions/operatorToFunction/keepComments.kt.after @@ -0,0 +1,10 @@ +interface C { + operator fun set(p1: String, p2: String, value: Int) +} + +class D(val c: C) { + fun foo() { + this.c/* and this is c */.set("a", // it's "a" + "b" /* and this is "b" */, /* we use 10 */10) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index bb5b9bd88d0..71a5a19fdc8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5943,6 +5943,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("keepComments.kt") + public void testKeepComments() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/operatorToFunction/keepComments.kt"); + doTest(fileName); + } + @TestMetadata("notApplicableAssignment.kt") public void testNotApplicableAssignment() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/operatorToFunction/notApplicableAssignment.kt");