kproc_parser/rust/
kparser.rs

1use super::ast_nodes::{ImplToken, MethodDeclToken, TopLevelNode, TraitToken};
2use super::kfunc::parse_fn;
3use super::kimpl::parse_impl;
4use super::ktrait::parse_trait;
5use super::{ast_nodes::StructToken, kstruct::parse_struct};
6use crate::kparser::KParserError;
7use crate::proc_macro::TokenStream;
8use crate::{build_error, trace};
9use crate::{
10    kparser::{DummyTracer, KParserTracer},
11    kproc_macros::KTokenStream,
12};
13
14macro_rules! unwrap {
15    ($res: expr, $def: expr) => {
16        $res.unwrap_or_else(|err| {
17            err.emit();
18            $def
19        })
20    };
21}
22
23/// generic struct to implement the rust parser
24pub struct RustParser<'tcx> {
25    pub tracer: &'tcx dyn KParserTracer,
26}
27
28impl<'tcx> RustParser<'tcx> {
29    pub fn new() -> Self {
30        RustParser {
31            tracer: &DummyTracer {},
32        }
33    }
34
35    pub fn with_tracer(tracer: &'tcx dyn KParserTracer) -> Self {
36        RustParser { tracer }
37    }
38
39    pub fn parse(&self, stream: &TokenStream) -> Result<TopLevelNode, KParserError> {
40        let mut ast = KTokenStream::new(stream);
41        let first = ast.peek().clone();
42        if let Ok(tok) = parse_struct(&mut ast, self.tracer) {
43            return Ok(tok.into());
44        } else {
45            trace!(self.tracer, "error fom `parse_struct`");
46        }
47
48        let mut ast = KTokenStream::new(stream);
49        if let Ok(tok) = parse_impl(&mut ast, self.tracer) {
50            return Ok(tok.into());
51        } else {
52            trace!(self.tracer, "error fro `parse_impl`");
53        }
54
55        let mut ast = KTokenStream::new(stream);
56        if let Ok(tok) = parse_trait(&mut ast, self.tracer) {
57            return Ok(tok.into());
58        }
59
60        let mut ast = KTokenStream::new(stream);
61        if let Ok(tok) = parse_fn(&mut ast, self.tracer) {
62            return Ok(tok.into());
63        }
64        let err = build_error!(first, "Token Stream sequence not known");
65        Err(err)
66    }
67
68    pub fn parse_struct(&self, stream: &TokenStream) -> StructToken {
69        let mut stream = KTokenStream::from(stream);
70        let result = parse_struct(&mut stream, self.tracer);
71        unwrap!(result, StructToken::default())
72    }
73
74    pub fn parse_impl(&self, stream: &TokenStream) -> ImplToken {
75        let mut stream = KTokenStream::from(stream);
76        let result = parse_impl(&mut stream, self.tracer);
77        unwrap!(result, ImplToken::default())
78    }
79
80    pub fn parse_trait(&self, stream: &TokenStream) -> TraitToken {
81        let mut stram = KTokenStream::from(stream);
82        let result = parse_trait(&mut stram, self.tracer);
83        unwrap!(result, TraitToken::default())
84    }
85
86    pub fn parse_fn(&self, stream: &TokenStream) -> MethodDeclToken {
87        let mut stream = KTokenStream::from(stream);
88        let result = parse_fn(&mut stream, self.tracer);
89        unwrap!(result, MethodDeclToken::default())
90    }
91}