-
-
Notifications
You must be signed in to change notification settings - Fork 757
/
XmlOutputReport.kt
62 lines (52 loc) · 2.37 KB
/
XmlOutputReport.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package io.github.detekt.report.xml
import io.gitlab.arturbosch.detekt.api.Detektion
import io.gitlab.arturbosch.detekt.api.Issue
import io.gitlab.arturbosch.detekt.api.OutputReport
import io.gitlab.arturbosch.detekt.api.SetupContext
import io.gitlab.arturbosch.detekt.api.getOrNull
import io.gitlab.arturbosch.detekt.api.internal.BuiltInOutputReport
import java.nio.file.Path
import java.util.Locale
import kotlin.io.path.absolute
import kotlin.io.path.invariantSeparatorsPathString
import kotlin.io.path.relativeTo
/**
* Contains rule violations in an XML format. The report follows the structure of a Checkstyle report.
* See: https://detekt.dev/configurations.html#output-reports
*/
class XmlOutputReport : BuiltInOutputReport, OutputReport() {
override val id: String = "XmlOutputReport"
override val ending = "xml"
private val Issue.severityLabel: String
get() = severity.name.lowercase(Locale.US)
var basePath: Path? = null
override fun init(context: SetupContext) {
basePath = context.getOrNull<Path>(DETEKT_OUTPUT_REPORT_BASE_PATH_KEY)?.absolute()
}
override fun render(detektion: Detektion): String {
val lines = ArrayList<String>()
lines += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
lines += "<checkstyle version=\"4.3\">"
detektion.issues
.groupBy {
basePath?.let { path -> it.location.filePath.absolutePath.relativeTo(path) }
?: it.location.filePath.absolutePath
}
.forEach { (filePath, issues) ->
lines += "<file name=\"${filePath.invariantSeparatorsPathString.toXmlString()}\">"
issues.forEach {
lines += arrayOf(
"\t<error line=\"${it.location.source.line.toXmlString()}\"",
"column=\"${it.location.source.column.toXmlString()}\"",
"severity=\"${it.severityLabel.toXmlString()}\"",
"message=\"${it.message.toXmlString()}\"",
"source=\"${"detekt.${it.ruleInfo.id.value.toXmlString()}"}\" />"
).joinToString(separator = " ")
}
lines += "</file>"
}
lines += "</checkstyle>"
return lines.joinToString(separator = "\n")
}
private fun Any.toXmlString() = XmlEscape.escapeXml(toString().trim())
}