RemoveCurlyBracesFromTemplateInspection: add heuristic to change severity

Change severity to INFORMATION if a variable hasn't whitespace around & add an option to return the old behavior
 #KT-31717 Fixed
This commit is contained in:
Dmitry Gridin
2019-07-02 19:28:39 +07:00
parent e4d0c2cb0e
commit fda5692fc6
18 changed files with 51 additions and 1 deletions
@@ -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>(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 == '"')
}
@@ -1,3 +1,4 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: INFORMATION
fun foo() {
val x = 4
@@ -1,3 +1,4 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun foo(`object`: Any) {
val bar = "$<caret>{`object`}"
@@ -1,3 +1,4 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun foo(`object`: Any) {
val bar = "$`object`"
@@ -0,0 +1,6 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun foo() {
val x = 4
val y = "text $<caret>{x} moretext"
}
@@ -0,0 +1,6 @@
// HIGHLIGHT: GENERIC_ERROR_OR_WARNING
fun foo() {
val x = 4
val y = "text $x moretext"
}
@@ -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")