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|note):\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) } }