Add parseLocated / parseStreamLocated, returning a Model.LocatedValue tree parallel in shape to Value, where every node carries its source span (1-based line/column) and located children. Collections span from their opening to closing event; scalars carry a start-anchored span; aliases and merge-inherited pairs honestly point at their reference site. The plain Value, its equality, and the conformance oracle are untouched: locations are built only when the streaming composer is asked for them (tracksLocations), behind new entry points, so the default value path is byte-identical. A whole-suite test proves the located projection equals a plain parse for every passing case (402/402), including through merge keys and aliases, and the canonical-event and gap gates stay green.
20 lines
782 B
Swift
20 lines
782 B
Swift
public extension PureYAML.Model {
|
|
/// A 1-based line/column position in the source text. Carried by ``LocatedValue`` so a
|
|
/// consumer (an editor, a linter, a CI report) can point at exactly where a value-tree
|
|
/// node was written. Positions live on the parallel located tree, never on ``Value``,
|
|
/// so the plain value tree and its equality stay free of source coordinates.
|
|
struct SourcePosition: Equatable, Hashable, Sendable, Comparable {
|
|
public var line: Int
|
|
public var column: Int
|
|
|
|
public init(line: Int, column: Int) {
|
|
self.line = line
|
|
self.column = column
|
|
}
|
|
|
|
public static func < (lhs: Self, rhs: Self) -> Bool {
|
|
(lhs.line, lhs.column) < (rhs.line, rhs.column)
|
|
}
|
|
}
|
|
}
|