From 28c950ffbebb6942c365ab2e0abdbe9c47e8fe86 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 9 Oct 2015 22:48:21 +0300 Subject: [PATCH] Better replacement for annotations with parameters in ReplaceWIth pattern but still lot of safety pre-checks to be added --- .../CallableUsageReplacementStrategy.kt | 14 ++++++++++---- .../classUsages/annotationKeepNamedArgs.kt | 10 ++++++++++ .../classUsages/annotationKeepNamedArgs.kt.after | 10 ++++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 6 ++++++ 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt.after 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 1c63ac9e4a9..f67836f815c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/CallableUsageReplacementStrategy.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/CallableUsageReplacementStrategy.kt @@ -153,7 +153,14 @@ private fun performCallReplacement( commentSaver.restore(resultRange) - return resultRange.last as JetElement + var resultElement = resultRange.last as JetElement + + if (resultElement is JetAnnotationEntry) { // unwrap "@Dummy(...)" + val text = resultElement.valueArguments.single().getArgumentExpression()!!.text + resultElement = resultElement.replaced(JetPsiFactory(project).createAnnotationEntry("@" + text)) //TODO: what if it does not work? + } + + return resultElement } private fun JetElement.replaceCallElement(generatedExpression: JetExpression): JetElement { @@ -161,9 +168,8 @@ private fun JetElement.replaceCallElement(generatedExpression: JetExpression): J is JetExpression -> return replace(generatedExpression) as JetExpression is JetAnnotationEntry -> { - //TODO: bad techinique!! - val annotationEntry = JetPsiFactory(project).createAnnotationEntry("@" + generatedExpression.text) - return replace(annotationEntry) as JetElement + val dummyAnnotation = createByPattern("@Dummy($0)", generatedExpression) { JetPsiFactory(project).createAnnotationEntry(it) } + return replace(dummyAnnotation) as JetElement } else -> throw UnsupportedOperationException() //TODO: check it before!! diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt b/idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt new file mode 100644 index 00000000000..377096d6ce6 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt @@ -0,0 +1,10 @@ +// "Replace with 'Bar(p, "")'" "true" + +package test + +@Deprecated("Replace with bar", ReplaceWith("Bar(p, \"\")")) +annotation class Foo(val p: Int) + +annotation class Bar(val p: Int, val s: String) + +@Foo(p = 1) class C \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt.after b/idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt.after new file mode 100644 index 00000000000..baac3fe1e66 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt.after @@ -0,0 +1,10 @@ +// "Replace with 'Bar(p, "")'" "true" + +package test + +@Deprecated("Replace with bar", ReplaceWith("Bar(p, \"\")")) +annotation class Foo(val p: Int) + +annotation class Bar(val p: Int, val s: String) + +@Bar(p = 1, s = "") class C \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 65b54ae7b21..6478bc2e812 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3435,6 +3435,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("annotationKeepNamedArgs.kt") + public void testAnnotationKeepNamedArgs() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/classUsages/annotationKeepNamedArgs.kt"); + doTest(fileName); + } + @TestMetadata("constructorUsage1.kt") public void testConstructorUsage1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/classUsages/constructorUsage1.kt");