use crate::kparser::{self, KParserError, KParserTracer};
use crate::kproc_macros::KTokenStream;
use crate::rust::ast_nodes::ImplToken;
use crate::rust::core::check_and_parse_bounds;
use crate::rust::kattr::check_and_parse_cond_attribute;
use crate::rust::kfunc::parse_fn;
use crate::{check, trace};
pub fn parse_impl(
toks: &mut KTokenStream,
tracer: &dyn KParserTracer,
) -> kparser::Result<ImplToken> {
let attr = check_and_parse_cond_attribute(toks, tracer);
let impl_tok = toks.advance();
check!("impl", impl_tok)?;
let generics = check_and_parse_bounds(toks, tracer)?;
let name = toks.advance();
let _for_ty = if toks.match_tok("for") {
let for_tok = toks.advance();
check!("for", for_tok)?;
Some(toks.advance())
} else {
None
};
let raw_impl_block = toks.unwrap_group_as_stream();
let mut impl_block = toks.to_ktoken_stream();
let mut funs = Vec::new();
while !impl_block.is_end() {
let fn_tok = parse_fn(&mut impl_block, tracer)?;
funs.push(fn_tok);
}
let impl_tok = ImplToken {
attributes: attr,
generics,
name,
for_ty: None,
raw_block: raw_impl_block,
functions: funs,
};
trace!(tracer, "impl tok parserd: {:#?}", impl_tok);
Ok(impl_tok)
}