/// Reports violations as XML conforming to the Checkstyle specification, as defined here: /// https://www.jetbrains.com/help/teamcity/xml-report-processing.html struct CheckstyleReporter: Reporter { // MARK: - Reporter Conformance static let identifier = "checkstyle" static let isRealtime = false static let description = "Reports violations as Checkstyle XML." static func generateReport(_ violations: [StyleViolation]) -> String { [ "\n", violations .group(by: { ($0.location.file ?? "").escapedForXML() }) .sorted(by: { $0.key < $1.key }) .map(generateForViolationFile).joined(), "\n", ].joined() } // MARK: - Private private static func generateForViolationFile(_ file: String, violations: [StyleViolation]) -> String { [ "\n\t\n", violations.map(generateForSingleViolation).joined(), "\t", ].joined() } private static func generateForSingleViolation(_ violation: StyleViolation) -> String { let line: Int = violation.location.line ?? 0 let col: Int = violation.location.character ?? 0 let severity: String = violation.severity.rawValue let reason: String = violation.reason.escapedForXML() let identifier: String = violation.ruleIdentifier let source: String = "swiftlint.rules.\(identifier)".escapedForXML() return [ "\t\t\n", ].joined() } }