diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt index 62bd56b132e..587b21ff753 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtPsiFactory.kt @@ -404,6 +404,11 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m return stringTemplateExpression.entries[0] as KtSimpleNameStringTemplateEntry } + fun createLiteralStringTemplateEntry(literal: String): KtLiteralStringTemplateEntry { + val stringTemplateExpression = createExpression("\"$literal\"") as KtStringTemplateExpression + return stringTemplateExpression.entries[0] as KtLiteralStringTemplateEntry + } + fun createStringTemplate(content: String) = createExpression("\"$content\"") as KtStringTemplateExpression fun createPackageDirective(fqName: FqName): KtPackageDirective { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeToFunctionInvocationFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeToFunctionInvocationFix.kt index 1cff9bbc1c8..a31b21d7626 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeToFunctionInvocationFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeToFunctionInvocationFix.kt @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtPsiFactory -import org.jetbrains.kotlin.psi.createExpressionByPattern +import org.jetbrains.kotlin.psi.* class ChangeToFunctionInvocationFix(element: KtExpression) : KotlinQuickFixAction(element) { override fun getFamilyName() = "Change to function invocation" @@ -31,7 +28,21 @@ class ChangeToFunctionInvocationFix(element: KtExpression) : KotlinQuickFixActio public override fun invoke(project: Project, editor: Editor?, file: KtFile) { val element = element ?: return - element.replace(KtPsiFactory(file).createExpressionByPattern("$0()", element)) + val psiFactory = KtPsiFactory(element) + val nextLiteralStringEntry = element.parent.nextSibling as? KtLiteralStringTemplateEntry + val nextText = nextLiteralStringEntry?.text + if (nextText != null && nextText.startsWith("(") && nextText.contains(")")) { + val parentheses = nextText.takeWhile { it != ')' } + ")" + val newNextText = nextText.removePrefix(parentheses) + if (newNextText.isNotEmpty()) { + nextLiteralStringEntry.replace(psiFactory.createLiteralStringTemplateEntry(newNextText)) + } else { + nextLiteralStringEntry.delete() + } + element.replace(KtPsiFactory(file).createExpressionByPattern("$0$1", element, parentheses)) + } else { + element.replace(KtPsiFactory(file).createExpressionByPattern("$0()", element)) + } } companion object : KotlinSingleIntentionActionFactory() { diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt new file mode 100644 index 00000000000..cfd1436914b --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun foo() {} + +fun test(){ + "$foo" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt.after b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt.after new file mode 100644 index 00000000000..0fbe6aa79f4 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt.after @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun foo() {} + +fun test(){ + "${foo()}" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate2.kt b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate2.kt new file mode 100644 index 00000000000..d1f08070b80 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate2.kt @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun foo() {} + +fun test(){ + "$foo()" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate2.kt.after b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate2.kt.after new file mode 100644 index 00000000000..0fbe6aa79f4 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate2.kt.after @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun foo() {} + +fun test(){ + "${foo()}" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate3.kt b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate3.kt new file mode 100644 index 00000000000..30e04b4fbb9 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate3.kt @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun bar(i: Int, j: Int) {} + +fun test(){ + "$bar(1, 2)" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate3.kt.after b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate3.kt.after new file mode 100644 index 00000000000..0b9d83ae1c5 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate3.kt.after @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun bar(i: Int, j: Int) {} + +fun test(){ + "${bar(1, 2)}" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate4.kt b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate4.kt new file mode 100644 index 00000000000..eeece17d657 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate4.kt @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun foo() {} + +fun test(){ + "$foo(" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate4.kt.after b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate4.kt.after new file mode 100644 index 00000000000..098861e1d08 --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate4.kt.after @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun foo() {} + +fun test(){ + "${foo()}(" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate5.kt b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate5.kt new file mode 100644 index 00000000000..c9c7f095adc --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate5.kt @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun bar(i: Int, j: Int) {} + +fun test(s: String){ + "$bar(1, 2) sometext $s" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate5.kt.after b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate5.kt.after new file mode 100644 index 00000000000..ac6994a30bf --- /dev/null +++ b/idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate5.kt.after @@ -0,0 +1,6 @@ +// "Change to function invocation" "true" +fun bar(i: Int, j: Int) {} + +fun test(s: String){ + "${bar(1, 2)} sometext $s" +} \ 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 d6213a22cc1..14458e1d635 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -12768,6 +12768,31 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { public void testFunInvWithoutParentheses() throws Exception { runTest("idea/testData/quickfix/variables/changeToFunctionInvocation/funInvWithoutParentheses.kt"); } + + @TestMetadata("inStringTemplate.kt") + public void testInStringTemplate() throws Exception { + runTest("idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt"); + } + + @TestMetadata("inStringTemplate2.kt") + public void testInStringTemplate2() throws Exception { + runTest("idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate2.kt"); + } + + @TestMetadata("inStringTemplate3.kt") + public void testInStringTemplate3() throws Exception { + runTest("idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate3.kt"); + } + + @TestMetadata("inStringTemplate4.kt") + public void testInStringTemplate4() throws Exception { + runTest("idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate4.kt"); + } + + @TestMetadata("inStringTemplate5.kt") + public void testInStringTemplate5() throws Exception { + runTest("idea/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate5.kt"); + } } @TestMetadata("idea/testData/quickfix/variables/changeToPropertyAccess")