kproc_parser/rust/
ktrait.rs

1use crate::kparser::{KParserError, KParserTracer};
2use crate::kproc_macros::KTokenStream;
3use crate::rust::core::*;
4use crate::rust::kattr::check_and_parse_cond_attribute;
5use crate::rust::kfunc::parse_fn;
6use crate::{check, parse_visibility, trace};
7
8use super::ast_nodes::TraitToken;
9
10/// helper function that allow to parse an trait definition
11pub fn parse_trait(
12    ast: &mut KTokenStream,
13    tracer: &dyn KParserTracer,
14) -> Result<TraitToken, KParserError> {
15    trace!(tracer, "start parning the trait");
16    let attrs = check_and_parse_cond_attribute(ast, tracer);
17
18    let vist = parse_visibility!(ast);
19    let trait_tok = ast.advance();
20    check!("trait", trait_tok)?;
21    let name = ast.advance();
22    trace!(tracer, "`{name}` checking bounds on `{:?}`", ast.peek());
23    let generics = check_and_parse_bounds(ast, tracer)?;
24    trace!(tracer, "checking the trait block");
25    let raw_block = ast.unwrap_group_as_stream();
26    let mut block = ast.to_ktoken_stream();
27
28    let mut funs = Vec::new();
29    while !block.is_end() {
30        trace!(tracer, "checking body");
31        let fn_tok = parse_fn(&mut block, tracer)?;
32        funs.push(fn_tok);
33    }
34
35    let trait_tok = TraitToken {
36        attrs,
37        visibility: vist,
38        ident: name,
39        generics,
40        inn_attrs: None, // FIXME: parse this
41        associated_items: vec![],
42        raw_block,
43        functions: funs,
44    };
45    trace!(tracer, "trait token result: {:#?}", trait_tok);
46    Ok(trait_tok)
47}