skullbrain-parser 0.1.0

Parses skullbrain tokens into a concrete syntax tree (CST).
Documentation
use super::*;

impl<'input, D: Diagnostics, C: ConcreteSyntaxTreeBuilder> ParserState<'input, D, C> {
    pub(super) fn parse_trait_delc(&mut self) {
        self.parse_in_context(ScopeContext::TraitDelc, |state| {
            state.start_node(SyntaxKind::Trait);
            state.parse_optional_modifiers();
            state.parse_shared_trait_delc();
            state.finish_node();
        })
    }

    pub(super) fn parse_trait_impl(&mut self) {
        let start_details = (!self.is_in_valid_class_context()).then(|| self.diagnostic_details());

        self.start_node(SyntaxKind::TraitImpl);
        self.parse_shared_trait_delc();
        self.finish_node();

        if let Some(mut diagnostic_details) = start_details {
            diagnostic_details.span.end = self.diagnostic_details().span.start;

            let error = ParseError::invalid_use_of_trait_impl();
            self.emit_diagnostic(error, diagnostic_details);
        }
    }

    fn parse_shared_trait_delc(&mut self) {
        self.parse_token(SyntaxKind::Keyword);
        self.parse_name_followed_by_braced_expression(ParseError::expected_trait_name_before());
    }
}

#[cfg(test)]
mod test {
    #[test]
    fn test_trait_delc() {
        crate::test::create_parsing_test("trait/delc*.skull", |state| {
            state.parse_trait_delc();
        });
    }
}