diff --git a/Sources/Common/Error.swift b/Sources/Common/Error.swift new file mode 100644 index 0000000..00bed18 --- /dev/null +++ b/Sources/Common/Error.swift @@ -0,0 +1,126 @@ +// p4rse, Copyright 2026, Will Hawkins +// +// This file is part of p4rse. +// +// This file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +public struct Error: Errorable, Equatable, CustomStringConvertible { + public func format() -> String { + return self.description + } + + public func msg() -> String { + return self._msg + } + + public func append(error: any Errorable) -> any Errorable { + return Errors(self, error) + } + + let _msg: String + + public init(withMessage msg: String) { + self._msg = msg + } + + public var description: String { + return self._msg + } +} + +public struct ErrorWithLocation: Errorable, Equatable, CustomStringConvertible { + let startFormat: String = "\u{1B}[31;1;4m" + let endFormat: String = "\u{1B}[0m" + + public func format() -> String { + return startFormat + "\(self.location)" + endFormat + ": \(self._msg)" + } + + public func msg() -> String { + return self.description + } + + public func append(error: any Errorable) -> any Errorable { + return Errors(self, error) + } + + let _msg: String + + let location: SourceLocation + + public init(sourceLocation location: SourceLocation, withError msg: String) { + self._msg = msg + self.location = location + } + + public var description: String { + return "\(self.location): \(self._msg)" + } +} + +public struct Errors: Errorable, CustomStringConvertible { + public func format() -> String { + return self.description + } + + public func msg() -> String { + return self.description + } + + public func append(error: any Errorable) -> any Errorable { + return Errors(self.errors + [error]) + } + + public var description: String { + return self.errors.map { error in + return error.msg() + }.joined(separator: ";") + } + + public let errors: [any Errorable] + + init(_ errors: [any Errorable]) { + self.errors = errors + } + + public init(_ e1: any Errorable, _ e2: any Errorable) { + self.errors = [e1, e2] + } +} + +public struct ErrorWithLabel: Errorable { + let label: String + let error: any Errorable + + public init(_ label: String, _ error: any Errorable) { + self.label = label + self.error = error + } + + public func format() -> String { + return self.description + } + + public func msg() -> String { + return self.description + } + + public func append(error: any Errorable) -> any Errorable { + return Errors(self, error) + } + + public var description: String { + return "\(self.label): \(self.error.msg())" + } +} diff --git a/Sources/Common/Result.swift b/Sources/Common/Result.swift index eb97311..da6119a 100644 --- a/Sources/Common/Result.swift +++ b/Sources/Common/Result.swift @@ -15,113 +15,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -public struct Error: Errorable, Equatable, CustomStringConvertible { - public func format() -> String { - return self.description - } - - public func msg() -> String { - return self._msg - } - - public func append(error: any Errorable) -> any Errorable { - return Errors(self, error) - } - - let _msg: String - - public init(withMessage msg: String) { - self._msg = msg - } - - public var description: String { - return self._msg - } -} - -public struct ErrorWithLocation: Errorable, Equatable, CustomStringConvertible { - - public func format() -> String { - return self.description - } - - public func msg() -> String { - return self.description - } - - public func append(error: any Errorable) -> any Errorable { - return Errors(self, error) - } - - let _msg: String - - let location: SourceLocation - - public init(sourceLocation location: SourceLocation, withError msg: String) { - self._msg = msg - self.location = location - } - - public var description: String { - return "\(self.location): \(self._msg)" - } -} - -public struct Errors: Errorable, CustomStringConvertible { - public func format() -> String { - return self.description - } - - public func msg() -> String { - return self.description - } - - public func append(error: any Errorable) -> any Errorable { - return Errors(self.errors + [error]) - } - - public var description: String { - return self.errors.map { error in - return error.msg() - }.joined(separator: ";") - } - - public let errors: [any Errorable] - - init(_ errors: [any Errorable]) { - self.errors = errors - } - - public init(_ e1: any Errorable, _ e2: any Errorable) { - self.errors = [e1, e2] - } -} - -public struct ErrorWithLabel: Errorable { - let label: String - let error: any Errorable - - public init(_ label: String, _ error: any Errorable) { - self.label = label - self.error = error - } - - public func format() -> String { - return self.description - } - - public func msg() -> String { - return self.description - } - - public func append(error: any Errorable) -> any Errorable { - return Errors(self, error) - } - - public var description: String { - return "\(self.label): \(self.error.msg())" - } -} public enum Result: Equatable { case Ok(OKT) diff --git a/Tests/p4rseTests/ErrorTests/Formatting.swift b/Tests/p4rseTests/ErrorTests/Formatting.swift new file mode 100644 index 0000000..d6c5aff --- /dev/null +++ b/Tests/p4rseTests/ErrorTests/Formatting.swift @@ -0,0 +1,34 @@ +// p4rse, Copyright 2026, Will Hawkins +// +// This file is part of p4rse. +// +// This file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import Common +import Foundation +import Macros +import P4Runtime +import P4Lang +import SwiftTreeSitter +import Testing +import TreeSitter +import TreeSitterP4 + +@testable import P4Compiler + +@Test func test_error_with_location_formatting() async throws { + let e = ErrorWithLocation(sourceLocation: SourceLocation(1, 5), withError: "There was an error") + + print(e.format()) +}