kproc_parser/rust/
kparser.rs1use 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
23pub 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}