diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveCurlyBracesFromTemplateInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveCurlyBracesFromTemplateInspection.kt index 2623394cf5f..3b577b8f64c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveCurlyBracesFromTemplateInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveCurlyBracesFromTemplateInspection.kt @@ -5,16 +5,23 @@ package org.jetbrains.kotlin.idea.inspections +import com.intellij.codeInspection.ProblemHighlightType +import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.idea.core.canDropBraces import org.jetbrains.kotlin.idea.core.dropBraces import org.jetbrains.kotlin.psi.KtBlockStringTemplateEntry -class RemoveCurlyBracesFromTemplateInspection : +class RemoveCurlyBracesFromTemplateInspection(@JvmField var reportWithoutWhitespace: Boolean = false) : AbstractApplicabilityBasedInspection(KtBlockStringTemplateEntry::class.java) { override fun inspectionText(element: KtBlockStringTemplateEntry): String = "Redundant curly braces in string template" + override fun inspectionHighlightType(element: KtBlockStringTemplateEntry) = + if (reportWithoutWhitespace || element.hasWhitespaceAround()) ProblemHighlightType.GENERIC_ERROR_OR_WARNING + else ProblemHighlightType.INFORMATION + override val defaultFixText: String = "Remove curly braces" override fun isApplicable(element: KtBlockStringTemplateEntry): Boolean = element.canDropBraces() @@ -22,4 +29,16 @@ class RemoveCurlyBracesFromTemplateInspection : override fun applyTo(element: KtBlockStringTemplateEntry, project: Project, editor: Editor?) { element.dropBraces() } + + override fun createOptionsPanel() = MultipleCheckboxOptionsPanel(this).apply { + addCheckbox("Report also for a variables without a whitespace around", "reportWithoutWhitespace") + } } + +private fun KtBlockStringTemplateEntry.hasWhitespaceAround(): Boolean = + prevSibling?.isWhitespaceOrQuote(true) == true && nextSibling?.isWhitespaceOrQuote(false) == true + +private fun PsiElement.isWhitespaceOrQuote(prev: Boolean): Boolean { + val char = if (prev) text.lastOrNull() else text.firstOrNull() + return char != null && (char.isWhitespace() || char == '"') +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt index 668aad75c37..a611c266f39 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt @@ -1,3 +1,4 @@ +// HIGHLIGHT: GENERIC_ERROR_OR_WARNING fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt.after b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt.after index 090fcf2f765..8f8e8067cfe 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt.after +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets1.kt.after @@ -1,3 +1,4 @@ +// HIGHLIGHT: GENERIC_ERROR_OR_WARNING fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets2.kt b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets2.kt index e5470887996..74b2cfd80bb 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets2.kt +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets2.kt @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets2.kt.after b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets2.kt.after index cfdeba2aa3d..5940b0a0bc8 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets2.kt.after +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets2.kt.after @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets3.kt b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets3.kt index 3c2d421a6cf..2d61603d68f 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets3.kt +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets3.kt @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets3.kt.after b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets3.kt.after index c0583a56623..888d64502c5 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets3.kt.after +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets3.kt.after @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets4.kt b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets4.kt index 6c3d93f840a..f49b2680e6f 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets4.kt +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets4.kt @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets4.kt.after b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets4.kt.after index 05e666efc59..4943f16282b 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets4.kt.after +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets4.kt.after @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets5.kt b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets5.kt index eda17cd3840..b69750763aa 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets5.kt +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets5.kt @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets5.kt.after b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets5.kt.after index 0e151976ce1..2c84f1c5524 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets5.kt.after +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets5.kt.after @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets6.kt b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets6.kt index d3ce1d4ede7..89f22d81cb2 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets6.kt +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets6.kt @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets6.kt.after b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets6.kt.after index bc81387889d..fb3766231e3 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets6.kt.after +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets6.kt.after @@ -1,3 +1,4 @@ +// HIGHLIGHT: INFORMATION fun foo() { val x = 4 diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt index b56448e1b9c..9cd2cd8848c 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt @@ -1,3 +1,4 @@ +// HIGHLIGHT: GENERIC_ERROR_OR_WARNING fun foo(`object`: Any) { val bar = "${`object`}" diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt.after b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt.after index bec984cd2f1..3790a1b3d4f 100644 --- a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt.after +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt.after @@ -1,3 +1,4 @@ +// HIGHLIGHT: GENERIC_ERROR_OR_WARNING fun foo(`object`: Any) { val bar = "$`object`" diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets8.kt b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets8.kt new file mode 100644 index 00000000000..88d18461ccd --- /dev/null +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets8.kt @@ -0,0 +1,6 @@ +// HIGHLIGHT: GENERIC_ERROR_OR_WARNING + +fun foo() { + val x = 4 + val y = "text ${x} moretext" +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets8.kt.after b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets8.kt.after new file mode 100644 index 00000000000..15e4677113a --- /dev/null +++ b/idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets8.kt.after @@ -0,0 +1,6 @@ +// HIGHLIGHT: GENERIC_ERROR_OR_WARNING + +fun foo() { + val x = 4 + val y = "text $x moretext" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 7adec06cf01..95bc72af4b2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -7884,6 +7884,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { public void testUnnecessaryBrackets7() throws Exception { runTest("idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets7.kt"); } + + @TestMetadata("unnecessaryBrackets8.kt") + public void testUnnecessaryBrackets8() throws Exception { + runTest("idea/testData/inspectionsLocal/removeCurlyBracesFromTemplate/unnecessaryBrackets8.kt"); + } } @TestMetadata("idea/testData/inspectionsLocal/removeEmptyParenthesesFromAnnotationEntry")