skullbrain-parser 0.1.0

Parses skullbrain tokens into a concrete syntax tree (CST).
Documentation
#![allow(unsafe_code)]

use cstree::Syntax;
use skullbrain_lexer::grammar::*;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum SyntaxKind {
    Unknown,
    Literal,
    Trivia,
    Comment,
    Ident,
    Error,

    Comma,
    Colon,
    Arrow,

    DelimitedRange,

    OpenParen,
    CloseParen,

    OpenBrace,
    CloseBrace,

    Type,

    Parameter,

    Modifiers,

    VariableDeclaration,

    ImmutableVariableKeyword,
    MutableVariableKeyword,

    Assignment,

    WhileLoop,
    // useful for quickly getting the useful part of the node for while/for loops etc
    Condition,
    Body,

    ForLoop,
    ForIterOpen,
    ForIterClose,

    Import,
    ImportSource,
    ImportAlias,
    ImportItem,

    ThrowError,

    TryCatch,
    Try,
    Catch,

    IfElse,
    If,
    Else,

    Operator,

    OpEq,
    OpNotEq,
    OpLt,
    OpGt,
    OpLtEq,
    OpGtEq,
    OpMinus,
    OpAnd,
    OpOr,
    OpNot,
    OpPlus,
    OpMul,
    OpDivide,
    OpMod,
    OpMethodChaining,
    Lhs,
    Rhs,

    LoopBreak,
    LoopContinue,

    Return,

    Keyword,
    TypeAlias,

    Function,
    FunctionSignature,

    Trait,
    TraitImpl,

    SemiColon,

    Class,

    Enum,
    EnumVariant,

    Match,
    MatchCondition,
    MatchConditionDefault,

    CallExpr,

    __LAST,
}

impl Syntax for SyntaxKind {
    fn from_raw(raw: cstree::RawSyntaxKind) -> Self {
        assert!(
            raw.0 < SyntaxKind::__LAST as u32,
            "Invalid raw syntax kind: {}",
            raw.0
        );

        // Safety: discriminant is valid by the assert above
        unsafe { ::std::mem::transmute::<u32, Self>(raw.0) }
    }

    fn into_raw(self) -> cstree::RawSyntaxKind {
        cstree::RawSyntaxKind(self as u32)
    }

    fn static_text(self) -> Option<&'static str> {
        let res = match self {
            SyntaxKind::Comma => COMMA_KEYWORD,
            SyntaxKind::Colon => COLON_KEYWORD,
            SyntaxKind::Arrow => ARROW_MATCH_ARM_FOWARD_OR_FUNC_RETURN_SIGNATURE_KEYWORD,
            SyntaxKind::OpenParen => OPEN_PAREN_KEYWORD,
            SyntaxKind::CloseParen => CLOSE_PAREN_KEYWORD,
            SyntaxKind::OpenBrace => OPEN_BRACE_KEYWORD,
            SyntaxKind::CloseBrace => CLOSE_BRACE_KEYWORD,
            SyntaxKind::ImmutableVariableKeyword => IMMUTABLE_VARIABLE_DELIMTER,
            SyntaxKind::MutableVariableKeyword => MUTBALE_VARIABLE_DELIMITER,
            SyntaxKind::ForIterOpen => FOR_LOOP_KEYWORD,
            SyntaxKind::ForIterClose => FOR_LOOP_ITER,
            SyntaxKind::ImportAlias => ALIAS_KEYWORD,
            SyntaxKind::OpEq => EQUALS_KEYWORD,
            SyntaxKind::OpNotEq => NOT_EQUALS_KEYWORD,
            SyntaxKind::OpLt => LESS_KEYWORD,
            SyntaxKind::OpGt => GREATER_KEYWORD,
            SyntaxKind::OpLtEq => LESS_EQUAL_KEYWORD,
            SyntaxKind::OpGtEq => GREATER_EQUAL_KEYWORD,
            SyntaxKind::OpMinus => MINUS_KEYWORD,
            SyntaxKind::OpAnd => AND_KEYWORD,
            SyntaxKind::OpOr => OR_KEYWORD,
            SyntaxKind::OpNot => NOT_KEYWORD,
            SyntaxKind::OpPlus => PLUS_KEYWORD,
            SyntaxKind::OpMul => MULTIPLY_KEYWORD,
            SyntaxKind::OpDivide => DIVIDE_KEYWORD,
            SyntaxKind::OpMod => MODULO_KEYWORD,
            SyntaxKind::OpMethodChaining => METHOD_CHAINING,
            SyntaxKind::SemiColon => LINE_END_DELIMITER,
            _ => return None,
        };

        Some(res)
    }
}