PadXcode-iPad/Diagnostics/BuildDiagnosticParser.swift

39 lines
1.4 KiB
Swift
Raw Normal View History

2026-04-12 00:46:30 -07:00
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)
}
}