From e60c3f5ee79db2c4075ae8380e43111b7cca5484 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 29 May 2015 19:59:13 +0300 Subject: [PATCH] DeprecatedSymbolUsageFix: fixed for string template --- .../jetbrains/kotlin/psi/JetExpressionImpl.kt | 19 ++++++++++++++++-- .../inline/KotlinInlineValHandler.java | 20 +------------------ .../deprecatedSymbolUsage/stringTemplate.kt | 8 ++++++++ .../stringTemplate.kt.after | 8 ++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 6 ++++++ 5 files changed, 40 insertions(+), 21 deletions(-) create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt create mode 100644 idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt.after diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetExpressionImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetExpressionImpl.kt index 294512455c3..5a4e9da1de0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetExpressionImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetExpressionImpl.kt @@ -37,9 +37,24 @@ public abstract class JetExpressionImpl(node: ASTNode) : JetElementImpl(node), J companion object { fun replaceExpression(expression: JetExpression, newElement: PsiElement, rawReplaceHandler: (PsiElement) -> PsiElement): PsiElement { val parent = expression.getParent() - if (parent is JetExpression && newElement is JetExpression && JetPsiUtil.areParenthesesNecessary(newElement, expression, parent)) { - return rawReplaceHandler(JetPsiFactory(expression).createExpressionByPattern("($0)", newElement)) + + if (newElement is JetExpression) { + when (parent) { + is JetExpression -> { + if (JetPsiUtil.areParenthesesNecessary(newElement, expression, parent)) { + return rawReplaceHandler(JetPsiFactory(expression).createExpressionByPattern("($0)", newElement)) + } + } + + is JetSimpleNameStringTemplateEntry -> { + if (newElement !is JetSimpleNameExpression) { + val newEntry = parent.replace(JetPsiFactory(expression).createBlockStringTemplateEntry(newElement)) as JetBlockStringTemplateEntry + return newEntry.getExpression()!! + } + } + } } + return rawReplaceHandler(newElement) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineValHandler.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineValHandler.java index b4198c719ca..a83fb8c3e1d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineValHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineValHandler.java @@ -168,7 +168,7 @@ public class KotlinInlineValHandler extends InlineActionHandler { continue; } - inlinedExpressions.add(replaceExpression(referenceExpression, initializer)); + inlinedExpressions.add((JetExpression) referenceExpression.replace(initializer)); } for (PsiElement assignment : assignments) { @@ -393,22 +393,4 @@ public class KotlinInlineValHandler extends InlineActionHandler { } return false; } - - @NotNull - private static JetExpression replaceExpression( - @NotNull PsiElement referenceElement, - @NotNull JetExpression newExpression - ) { - PsiElement parent = referenceElement.getParent(); - if (parent instanceof JetSimpleNameStringTemplateEntry && - !(newExpression instanceof JetSimpleNameExpression)) { - JetBlockStringTemplateEntry templateEntry = - (JetBlockStringTemplateEntry) parent.replace( - JetPsiFactory((JetElement) parent).createBlockStringTemplateEntry(newExpression)); - JetExpression expression = templateEntry.getExpression(); - assert expression != null; - return expression; - } - return (JetExpression) referenceElement.replace(newExpression.copy()); - } } diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt b/idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt new file mode 100644 index 00000000000..2fd41247cc0 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt @@ -0,0 +1,8 @@ +// "Replace with '"p = $p"'" "true" + +@deprecated("", ReplaceWith("\"p = \$p\"")) +fun oldFun(p: Int) = "p = $p" + +fun foo(p: Int) { + val s = oldFun(p + 1) +} diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt.after b/idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt.after new file mode 100644 index 00000000000..8aff7a8d5b6 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt.after @@ -0,0 +1,8 @@ +// "Replace with '"p = $p"'" "true" + +@deprecated("", ReplaceWith("\"p = \$p\"")) +fun oldFun(p: Int) = "p = $p" + +fun foo(p: Int) { + val s = "p = ${p + 1}" +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index f89a5085249..cd4516a04bf 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3046,6 +3046,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("stringTemplate.kt") + public void testStringTemplate() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/stringTemplate.kt"); + doTest(fileName); + } + @TestMetadata("toOuterClassMethod.kt") public void testToOuterClassMethod() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt");