use tree_sitter::Node;
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) enum Position {
Source { row: usize, col: usize },
Relative(usize),
}
impl Position {
pub(crate) fn unwrap_row(&self) -> usize {
match self {
Self::Source { row, .. } => *row,
_ => unreachable!(),
}
}
pub(crate) fn unwrap_col(&self) -> usize {
match self {
Self::Source { col, .. } => *col,
_ => unreachable!(),
}
}
}
impl From<&Node<'_>> for Position {
fn from(n: &Node<'_>) -> Self {
let pos = n.start_position();
Self::Source {
row: pos.row,
col: pos.column,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) enum Token<'a> {
Raw(&'a str),
ModuleHeader(&'a str),
Comment(&'a str, Position),
SourceNewline,
Newline,
KeywordChoose,
KeywordLet,
KeywordIn,
KeywordUnchanged,
KeywordLocal,
KeywordInstance,
KeywordDomain,
KeywordSubset,
KeywordIf,
KeywordThen,
KeywordElse,
KeywordCase,
KeywordExtends,
KeywordConstant,
KeywordConstants,
KeywordVariable,
KeywordVariables,
KeywordExcept,
KeywordEnabled,
KeywordTheorem,
KeywordUnion,
Exists,
CaseBox,
CaseArrow,
All,
SetIn,
SetNotIn,
And,
Or,
MapsTo,
MapTo,
AllMapsTo,
Ident(&'a str),
Lit(&'a str),
ParenOpen,
ParenClose,
Comma,
SemiColon,
Plus,
Minus,
Multiply,
Eq,
Eq2,
NotEq,
SubsetEq,
Dot,
Dots2,
At,
SquareOpen,
SquareClose,
CurlyOpen,
CurlyClose,
AngleOpen,
AngleClose,
AppendShort,
Real,
Int,
Nat,
GreaterThan,
GreaterThanEqual,
LessThan,
LessThanEqual,
Not,
SetMinus,
Divide,
LineDivider(char),
Prime,
Always,
Eventually,
Implies,
Bang,
True,
False,
WeakFairness,
StrongFairness,
Union,
Intersect,
Compose,
StepOrStutter(&'a str),
}
impl Token<'_> {
pub(crate) fn can_precede(&self, next: &Self) -> bool {
match (self, next) {
(Token::Comma, Token::ParenClose) => false,
_ => true,
}
}
pub(crate) fn delimiting_space_len(&self, next: &Self) -> usize {
match (self, next) {
(_, Token::ModuleHeader(_)) => 0,
(_, Token::Comment(_, Position::Relative(v))) => *v,
(Token::Newline | Token::SourceNewline, _) => 0,
(_, Token::Newline | Token::SourceNewline) => 0,
(Token::Raw(s), _) if s.ends_with("\n") => 0,
(Token::Raw(_), _) => 1,
(_, Token::Raw(_)) => 1,
(Token::ParenOpen | Token::SquareOpen | Token::CurlyOpen | Token::Dots2, _) => 0,
(
Token::ParenClose
| Token::SquareClose
| Token::CurlyClose
| Token::AngleClose
| Token::At
| Token::Bang,
Token::Dot | Token::SquareOpen,
) => 0,
(Token::Ident(_), Token::SquareOpen) => 0,
(Token::AngleOpen, Token::AngleClose) => 0,
(Token::Ident(_), Token::Dot) => 0,
(Token::Dot, Token::Ident(_)) => 0,
(Token::Not, _) => 0,
(
Token::Eventually | Token::Always,
Token::Eventually | Token::Always | Token::StepOrStutter(_) | Token::Ident(_),
) => 0,
(Token::WeakFairness | Token::StrongFairness, _) => 0,
(Token::StepOrStutter(_), _) => 0,
(
Token::Ident(_)
| Token::ParenClose
| Token::SquareClose
| Token::CurlyClose
| Token::Always
| Token::Eventually,
Token::ParenOpen,
) => 0,
(
_,
Token::ParenClose
| Token::SquareClose
| Token::CurlyClose
| Token::Comma
| Token::Dots2
| Token::SemiColon
| Token::Prime,
) => 0,
_ => 1,
}
}
}