kproc_parser/rust/
ktrait.rs1use 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
10pub 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, associated_items: vec![],
42 raw_block,
43 functions: funs,
44 };
45 trace!(tracer, "trait token result: {:#?}", trait_tok);
46 Ok(trait_tok)
47}