38 lines
1.4 KiB
Swift
38 lines
1.4 KiB
Swift
import Foundation
|
|
|
|
struct ParsedDiagnostic {
|
|
let filePath: String
|
|
let line: Int
|
|
let column: Int
|
|
let severity: DiagnosticRange.Severity
|
|
let message: String
|
|
|
|
func toDiagnosticRange() -> DiagnosticRange {
|
|
DiagnosticRange(line: line, column: column, length: 40,
|
|
severity: severity, message: message)
|
|
}
|
|
}
|
|
|
|
struct BuildDiagnosticParser {
|
|
private static let pattern = try! NSRegularExpression(
|
|
pattern: #"^(.+\.swift):(\d+):(\d+):\s+(error|warning):\s+(.+)$"#
|
|
)
|
|
|
|
static func parse(_ lines: [String]) -> [ParsedDiagnostic] {
|
|
lines.compactMap { parseLine($0) }
|
|
}
|
|
|
|
private static func parseLine(_ line: String) -> ParsedDiagnostic? {
|
|
let range = NSRange(line.startIndex..., in: line)
|
|
guard let match = pattern.firstMatch(in: line, range: range) else { return nil }
|
|
func g(_ i: Int) -> String? {
|
|
guard let r = Range(match.range(at: i), in: line) else { return nil }
|
|
return String(line[r])
|
|
}
|
|
guard let path = g(1), let lineStr = g(2), let lineNum = Int(lineStr),
|
|
let colStr = g(3), let colNum = Int(colStr),
|
|
let sev = g(4), let msg = g(5) else { return nil }
|
|
return ParsedDiagnostic(filePath: path, line: lineNum, column: colNum,
|
|
severity: sev == "error" ? .error : .warning, message: msg)
|
|
}
|
|
}
|