From d932237e49696d8707a3efc74685e6c47fb782be Mon Sep 17 00:00:00 2001 From: Vfrolov Date: Thu, 2 Feb 2023 18:55:12 +0300 Subject: [PATCH 1/2] BLANK_LINE_BETWEEN_PROPERTIES false positive ### What's done: * fixed isFollowedByNewlineCheck Closes #1496 --- .../org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt | 6 +++++- .../ClassLikeStructuresOrderRuleWarnTest.kt | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt index bfe06c4c3e..9802d4a66e 100644 --- a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt +++ b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt @@ -185,7 +185,8 @@ fun ASTNode.isEol() = parent({ it.treeNext != null }, false)?.isFollowedByNewlin */ fun ASTNode.isFollowedByNewline() = parent({ it.treeNext != null }, strict = false)?.let { - it.treeNext.elementType == WHITE_SPACE && it.treeNext.text.contains("\n") + it.isFollowedByNewlineCheck() || + (it.treeNext.elementType == WHITE_SPACE && it.treeNext.treeNext.elementType == EOL_COMMENT && it.treeNext.treeNext.isFollowedByNewlineCheck()) } ?: false /** @@ -902,6 +903,9 @@ fun ASTNode.isBooleanExpression(): Boolean = fun PsiElement.isLongStringTemplateEntry(): Boolean = node.elementType == LONG_STRING_TEMPLATE_ENTRY +private fun ASTNode.isFollowedByNewlineCheck() = + this.treeNext.elementType == WHITE_SPACE && this.treeNext.text.contains("\n") + private fun Sequence.takeWhileInclusive(pred: (T) -> Boolean): Sequence { var shouldContinue = true return takeWhile { diff --git a/diktat-rules/src/test/kotlin/org/cqfn/diktat/ruleset/chapter3/ClassLikeStructuresOrderRuleWarnTest.kt b/diktat-rules/src/test/kotlin/org/cqfn/diktat/ruleset/chapter3/ClassLikeStructuresOrderRuleWarnTest.kt index 2d795bad41..415012b835 100644 --- a/diktat-rules/src/test/kotlin/org/cqfn/diktat/ruleset/chapter3/ClassLikeStructuresOrderRuleWarnTest.kt +++ b/diktat-rules/src/test/kotlin/org/cqfn/diktat/ruleset/chapter3/ClassLikeStructuresOrderRuleWarnTest.kt @@ -146,6 +146,20 @@ class ClassLikeStructuresOrderRuleWarnTest : LintTestBase(::ClassLikeStructuresO ) } + @Test + @Tag(WarningNames.BLANK_LINE_BETWEEN_PROPERTIES) + fun `a single-line comment after annotation`() { + lintMethod( + """class Example { + | private val val0 = Regex(""${'"'}\d+""${'"'}) + | + | @Deprecated("Deprecation message") // Trailing comment + | private val val2 = "" + |} + """.trimMargin() + ) + } + @Test @Tag(WarningNames.BLANK_LINE_BETWEEN_PROPERTIES) fun `should allow blank lines around properties with custom getters and setters - positive example`() { From f7b7740143f20d8bafdafcdb79c447f38e759e1e Mon Sep 17 00:00:00 2001 From: Vfrolov Date: Fri, 3 Feb 2023 11:47:51 +0300 Subject: [PATCH 2/2] BLANK_LINE_BETWEEN_PROPERTIES false positive ### What's done: * fixed isFollowedByNewlineCheck Closes #1496 --- .../kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt index 9802d4a66e..2c89140e90 100644 --- a/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt +++ b/diktat-rules/src/main/kotlin/org/cqfn/diktat/ruleset/utils/AstNodeUtils.kt @@ -185,8 +185,11 @@ fun ASTNode.isEol() = parent({ it.treeNext != null }, false)?.isFollowedByNewlin */ fun ASTNode.isFollowedByNewline() = parent({ it.treeNext != null }, strict = false)?.let { + val probablyWhitespace = it.treeNext it.isFollowedByNewlineCheck() || - (it.treeNext.elementType == WHITE_SPACE && it.treeNext.treeNext.elementType == EOL_COMMENT && it.treeNext.treeNext.isFollowedByNewlineCheck()) + (probablyWhitespace.elementType == WHITE_SPACE && probablyWhitespace.treeNext.run { + elementType == EOL_COMMENT && isFollowedByNewlineCheck() + }) } ?: false /**