diff options
Diffstat (limited to 'src/unist.rs')
-rw-r--r-- | src/unist.rs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/unist.rs b/src/unist.rs new file mode 100644 index 0000000..75ef359 --- /dev/null +++ b/src/unist.rs @@ -0,0 +1,75 @@ +//! abstract syntax trees: [unist][]. +//! +//! [unist]: https://github.com/syntax-tree/unist + +use alloc::fmt; + +/// One place in a source file. +#[derive(Clone, Eq, PartialEq)] +pub struct Point { + /// 1-indexed integer representing a line in a source file. + pub line: usize, + /// 1-indexed integer representing a column in a source file. + pub column: usize, + /// 0-indexed integer representing a character in a source file. + pub offset: usize, +} + +impl Point { + #[must_use] + pub fn new(line: usize, column: usize, offset: usize) -> Point { + Point { + line, + column, + offset, + } + } +} + +impl fmt::Debug for Point { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}:{} ({})", self.line, self.column, self.offset) + } +} + +/// Location of a node in a source file. +#[derive(Clone, Eq, PartialEq)] +pub struct Position { + /// Represents the place of the first character of the parsed source region. + pub start: Point, + /// Represents the place of the first character after the parsed source + /// region, whether it exists or not. + pub end: Point, +} + +impl Position { + #[must_use] + pub fn new( + start_line: usize, + start_column: usize, + start_offset: usize, + end_line: usize, + end_column: usize, + end_offset: usize, + ) -> Position { + Position { + start: Point::new(start_line, start_column, start_offset), + end: Point::new(end_line, end_column, end_offset), + } + } +} + +impl fmt::Debug for Position { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "{}:{}-{}:{} ({}-{})", + self.start.line, + self.start.column, + self.end.line, + self.end.column, + self.start.offset, + self.end.offset + ) + } +} |