From 0eabab583ee9d5f877c722c149f6952f6f13f349 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 21 Sep 2023 15:09:50 +0300 Subject: [PATCH 1/3] Fixed TrailingCommaRule ### What's done: - add checking children to support case with comma before comment - reused ASTFactory It's part of #1737 --- .../ruleset/rules/chapter3/TrailingCommaRule.kt | 16 ++++++++++------ .../ruleset/chapter3/TrailingCommaFixTest.kt | 1 - 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/TrailingCommaRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/TrailingCommaRule.kt index c17a3e537b..b39e23f794 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/TrailingCommaRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/TrailingCommaRule.kt @@ -28,8 +28,8 @@ import org.jetbrains.kotlin.KtNodeTypes.WHEN_CONDITION_EXPRESSION import org.jetbrains.kotlin.KtNodeTypes.WHEN_CONDITION_IN_RANGE import org.jetbrains.kotlin.KtNodeTypes.WHEN_CONDITION_IS_PATTERN import org.jetbrains.kotlin.KtNodeTypes.WHEN_ENTRY +import org.jetbrains.kotlin.com.intellij.lang.ASTFactory import org.jetbrains.kotlin.com.intellij.lang.ASTNode -import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.kdoc.lexer.KDocTokens.KDOC import org.jetbrains.kotlin.lexer.KtTokens.BLOCK_COMMENT import org.jetbrains.kotlin.lexer.KtTokens.COMMA @@ -101,9 +101,13 @@ class TrailingCommaRule(configRules: List) : DiktatRule( } private fun ASTNode.checkTrailingComma(config: Boolean) { - val shouldFix = this.siblings(true).toList().run { - !this.map { it.elementType }.contains(COMMA) && this.any { it.isWhiteSpaceWithNewline() || it.isPartOfComment() } - } + val noCommaInSiblings = siblings(true).toList() + .let { siblings -> + siblings.none { it.elementType == COMMA } && siblings.any { it.isWhiteSpaceWithNewline() || it.isPartOfComment() } + } + val noCommaInChildren = children().none { it.elementType == COMMA } + val shouldFix = noCommaInSiblings && noCommaInChildren + if (shouldFix && config) { // we should write type of node in warning, to make it easier for user to find the parameter TRAILING_COMMA.warnAndFix(configRules, emitWarn, isFixMode, "after ${this.elementType}: ${this.text}", this.startOffset, this) { @@ -116,9 +120,9 @@ class TrailingCommaRule(configRules: List) : DiktatRule( val comments = listOf(EOL_COMMENT, BLOCK_COMMENT, KDOC) val firstCommentNodeOrNull = if (this.elementType == VALUE_PARAMETER) this.children().firstOrNull { it.elementType in comments } else null firstCommentNodeOrNull?.let { - this.addChild(LeafPsiElement(COMMA, ","), firstCommentNodeOrNull) + this.addChild(ASTFactory.leaf(COMMA, ","), it) } - ?: parent.addChild(LeafPsiElement(COMMA, ","), this.treeNext) + ?: parent.addChild(ASTFactory.leaf(COMMA, ","), this.treeNext) } } } diff --git a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/TrailingCommaFixTest.kt b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/TrailingCommaFixTest.kt index 1ee99abd22..1de6f28944 100644 --- a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/TrailingCommaFixTest.kt +++ b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/TrailingCommaFixTest.kt @@ -30,7 +30,6 @@ class TrailingCommaFixTest : FixTestBase("test/paragraph3/trailing_comma", ::Tra @Test @Tag(WarningNames.TRAILING_COMMA) - @Disabled("https://github.com/saveourtool/diktat/issues/1737") fun `should add all trailing comma`() { fixAndCompare("TrailingCommaExpected.kt", "TrailingCommaTest.kt", config) } From 077d1f1bafc92666912584636608fc4163558e60 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 21 Sep 2023 15:23:17 +0300 Subject: [PATCH 2/3] review notes + fix for StringTemplateFormatRule --- .../diktat/ruleset/rules/chapter3/StringTemplateFormatRule.kt | 2 +- .../diktat/ruleset/rules/chapter3/TrailingCommaRule.kt | 2 +- .../diktat/ruleset/chapter3/StringTemplateRuleFixTest.kt | 2 -- .../test/paragraph3/string_template/StringTemplateExpected.kt | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/StringTemplateFormatRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/StringTemplateFormatRule.kt index 78699ae7ee..9087a7dff1 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/StringTemplateFormatRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/StringTemplateFormatRule.kt @@ -73,7 +73,7 @@ class StringTemplateFormatRule(configRules: List) : DiktatRule( if (identifierName != null && node.treeParent.text.trim('"', '$') == identifierName) { STRING_TEMPLATE_QUOTES.warnAndFix(configRules, emitWarn, isFixMode, node.text, node.startOffset, node) { - val identifier = node.findChildByType(REFERENCE_EXPRESSION)!!.copyElement() + val identifier = node.findChildByType(REFERENCE_EXPRESSION)!! // node.treeParent is String template that we need to delete node.treeParent.treeParent.addChild(identifier, node.treeParent) node.treeParent.treeParent.removeChild(node.treeParent) diff --git a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/TrailingCommaRule.kt b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/TrailingCommaRule.kt index b39e23f794..fca3b2eaa1 100644 --- a/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/TrailingCommaRule.kt +++ b/diktat-rules/src/main/kotlin/com/saveourtool/diktat/ruleset/rules/chapter3/TrailingCommaRule.kt @@ -101,7 +101,7 @@ class TrailingCommaRule(configRules: List) : DiktatRule( } private fun ASTNode.checkTrailingComma(config: Boolean) { - val noCommaInSiblings = siblings(true).toList() + val noCommaInSiblings = siblings(true).toSet() .let { siblings -> siblings.none { it.elementType == COMMA } && siblings.any { it.isWhiteSpaceWithNewline() || it.isPartOfComment() } } diff --git a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/StringTemplateRuleFixTest.kt b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/StringTemplateRuleFixTest.kt index 97576722f1..561291ea9f 100644 --- a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/StringTemplateRuleFixTest.kt +++ b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/StringTemplateRuleFixTest.kt @@ -4,14 +4,12 @@ import com.saveourtool.diktat.ruleset.rules.chapter3.StringTemplateFormatRule import com.saveourtool.diktat.util.FixTestBase import generated.WarningNames -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test class StringTemplateRuleFixTest : FixTestBase("test/paragraph3/string_template", ::StringTemplateFormatRule) { @Test @Tag(WarningNames.STRING_TEMPLATE_CURLY_BRACES) - @Disabled("https://github.com/saveourtool/diktat/issues/1737") fun `should fix enum order`() { fixAndCompare("StringTemplateExpected.kt", "StringTemplateTest.kt") } diff --git a/diktat-rules/src/test/resources/test/paragraph3/string_template/StringTemplateExpected.kt b/diktat-rules/src/test/resources/test/paragraph3/string_template/StringTemplateExpected.kt index 5be98ce827..4c66da6077 100644 --- a/diktat-rules/src/test/resources/test/paragraph3/string_template/StringTemplateExpected.kt +++ b/diktat-rules/src/test/resources/test/paragraph3/string_template/StringTemplateExpected.kt @@ -12,7 +12,7 @@ class SomeClass { val binExpr = "${foo as Foo}" - val trippleQuotes = """$x""" + val trippleQuotes = x val test = """${'$'}""" From 6fee912d3843bed86a25b66c91acc4f1adfb2ddc Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Thu, 21 Sep 2023 15:35:57 +0300 Subject: [PATCH 3/3] added a warn test --- .../chapter3/StringTemplateRuleWarnTest.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/StringTemplateRuleWarnTest.kt b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/StringTemplateRuleWarnTest.kt index dbcce5bf03..f498296fdc 100644 --- a/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/StringTemplateRuleWarnTest.kt +++ b/diktat-rules/src/test/kotlin/com/saveourtool/diktat/ruleset/chapter3/StringTemplateRuleWarnTest.kt @@ -122,4 +122,20 @@ class StringTemplateRuleWarnTest : LintTestBase(::StringTemplateFormatRule) { """.trimMargin() ) } + + @Test + @Tag(STRING_TEMPLATE_QUOTES) + fun `should trigger on long string template`() { + lintMethod( + """ + |class Some { + | fun some() { + | val x = "asd" + | val trippleQuotes = ""${'"'}${'$'}x""${'"'} + | } + |} + """.trimMargin(), + DiktatError(4, 31, ruleId, "${Warnings.STRING_TEMPLATE_QUOTES.warnText()} ${'$'}x", true) + ) + } }