[MaxLineLength] Fix signature in for blank characters in the Baseline (#4504)

This commit is contained in:
marschwar
2022-01-30 14:36:33 +01:00
committed by GitHub
parent 5176e41200
commit a6a26142c5
5 changed files with 39 additions and 9 deletions

View File

@@ -8,12 +8,12 @@ import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
/**
* Util function to search for the first [KtElement] in the parents of
* Util function to search for the [KtElement]s in the parents of
* the given [line] from a given offset in a [KtFile].
*/
internal fun findFirstKtElementInParents(file: KtFile, offset: Int, line: String): PsiElement? {
internal fun findKtElementInParents(file: KtFile, offset: Int, line: String): Sequence<PsiElement> {
return file.elementsInRange(TextRange.create(offset - line.length, offset))
.asSequence()
.plus(file.findElementAt(offset))
.mapNotNull { it?.getNonStrictParentOfType() }
.firstOrNull()
}

View File

@@ -11,6 +11,8 @@ import io.gitlab.arturbosch.detekt.api.config
import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.rules.lastArgumentMatchesUrl
import org.jetbrains.kotlin.com.intellij.psi.PsiElement
import org.jetbrains.kotlin.psi.KtFile
/**
* This rule reports lines of code which exceed a defined maximum line length.
@@ -49,7 +51,7 @@ class MaxLineLength(config: Config = Config.empty) : Rule(config) {
for (line in lines) {
offset += line.length
if (!isValidLine(line)) {
val ktElement = findFirstKtElementInParents(file, offset, line)
val ktElement = findFirstMeaningfulKtElementInParents(file, offset, line)
if (ktElement != null) {
report(CodeSmell(issue, Entity.from(ktElement), issue.description))
} else {
@@ -94,5 +96,11 @@ class MaxLineLength(config: Config = Config.empty) : Rule(config) {
companion object {
private const val DEFAULT_IDEA_LINE_LENGTH = 120
private val BLANK_OR_QUOTES = """[\s\"]*""".toRegex()
private fun findFirstMeaningfulKtElementInParents(file: KtFile, offset: Int, line: String): PsiElement? {
return findKtElementInParents(file, offset, line)
.firstOrNull { !BLANK_OR_QUOTES.matches(it.text) }
}
}
}

View File

@@ -8,6 +8,8 @@ import io.gitlab.arturbosch.detekt.api.Issue
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.Severity
import io.gitlab.arturbosch.detekt.rules.isPartOfString
import org.jetbrains.kotlin.com.intellij.psi.PsiElement
import org.jetbrains.kotlin.psi.KtFile
/**
* This rule reports lines that end with a whitespace.
@@ -28,7 +30,7 @@ class TrailingWhitespace(config: Config = Config.empty) : Rule(config) {
val trailingWhitespaces = countTrailingWhitespace(line)
if (trailingWhitespaces > 0) {
val file = fileContent.file
val ktElement = findFirstKtElementInParents(file, offset, line)
val ktElement = findFirstKtElementInParentsOrNull(file, offset, line)
if (ktElement == null || !ktElement.isPartOfString()) {
val entity = Entity.from(file, offset - trailingWhitespaces).let { entity ->
entity.copy(
@@ -49,4 +51,9 @@ class TrailingWhitespace(config: Config = Config.empty) : Rule(config) {
}
private fun createMessage(line: Int) = "Line ${line + 1} ends with a whitespace."
private fun findFirstKtElementInParentsOrNull(file: KtFile, offset: Int, line: String): PsiElement? {
return findKtElementInParents(file, offset, line)
.firstOrNull()
}
}

View File

@@ -8,6 +8,7 @@ import io.gitlab.arturbosch.detekt.test.TestConfig
import io.gitlab.arturbosch.detekt.test.assertThat
import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe
import org.assertj.core.api.Assertions.assertThat as doAssert
private const val MAX_LINE_LENGTH = "maxLineLength"
private const val EXCLUDE_PACKAGE_STATEMENTS = "excludePackageStatements"
@@ -35,7 +36,15 @@ class MaxLineLengthSpec : Spek({
val rule = MaxLineLength()
rule.visit(fileContent)
assertThat(rule.findings).hasSize(6)
assertThat(rule.findings).hasSize(7)
}
it("should report meaningful signature for all violations") {
val rule = MaxLineLength()
rule.visit(fileContent)
val locations = rule.findings.map { it.signature.substringAfterLast('$') }
doAssert(locations).allSatisfy { doAssert(it).isNotBlank() }
}
}

View File

@@ -6,24 +6,30 @@ class MaxLineLength {
val LOREM_IPSUM = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."
val A_VERY_LONG_MULTI_LINE = """
This is anotehr very very very very very very very very, very long multiline String that will break the MaxLineLength"
This is another very very very very very very very very, very long multiline String that will break the MaxLineLength"
""".trimIndent()
}
val loremIpsumField = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."
val longMultiLineField = """
This is anotehr very very very very very very very very
This is another very very very very very very very very
very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very
very long multiline String that will break the MaxLineLength
""".trimIndent()
val longMultiLineFieldWithLineBreaks =
"""
This is anotehr very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very
This is another very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very
very long multiline String with Line Break that will break the MaxLineLength
""".trimIndent()
val longMultiLineFieldWithLeadingQuote =
"""
"This is yet another very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very"
"very long multiline String with Line Break that will break the MaxLineLength"
""".trimIndent()
fun main() {
val thisIsAVeryLongValName = "This is a very, very long String that will break the MaxLineLength"