ripex 0.2.0

Multi-language structural parsing and fact extraction.
Documentation
use super::state::Parser;
use crate::rust::lexer::TokenKind;

pub fn skip_to_stmt_boundary(parser: &mut Parser) {
    loop {
        let kind = parser.peek();
        match kind {
            TokenKind::Semicolon | TokenKind::RBrace | TokenKind::Eof => return,
            _ if kind.is_keyword() => match kind {
                TokenKind::Fn
                | TokenKind::Let
                | TokenKind::Mut
                | TokenKind::Const
                | TokenKind::Static
                | TokenKind::Impl
                | TokenKind::Trait
                | TokenKind::Pub
                | TokenKind::Crate
                | TokenKind::Self_
                | TokenKind::Super
                | TokenKind::Use
                | TokenKind::Mod
                | TokenKind::Struct
                | TokenKind::Enum
                | TokenKind::Union
                | TokenKind::Type_
                | TokenKind::Where
                | TokenKind::For
                | TokenKind::In
                | TokenKind::If
                | TokenKind::Else
                | TokenKind::Match
                | TokenKind::While
                | TokenKind::Loop
                | TokenKind::Break
                | TokenKind::Continue
                | TokenKind::Return
                | TokenKind::Async
                | TokenKind::Await
                | TokenKind::Unsafe
                | TokenKind::Extern
                | TokenKind::Ref
                | TokenKind::Move
                | TokenKind::Dyn
                | TokenKind::As
                | TokenKind::True
                | TokenKind::False
                | TokenKind::None_ => return,
                _ => {
                    parser.advance();
                }
            },
            _ => {
                parser.advance();
            }
        }
    }
}

pub fn recover_from_error(parser: &mut Parser) {
    let pos_before = parser.pos;
    skip_to_stmt_boundary(parser);
    if parser.peek() == TokenKind::Semicolon {
        parser.advance();
    }
    if parser.pos == pos_before {
        parser.advance();
    }
}

pub fn is_eof(parser: &Parser) -> bool {
    parser.peek() == TokenKind::Eof
}