lwb_parser/parser/ast/
generate_ast.rs

1use crate::codegen_prelude::{AstInfo, GenerateAstInfo, ParsePairSort};
2use crate::parser::ast::{AstNode, NodeId, SpannedAstInfo};
3use crate::sources::span::Span;
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize, Debug)]
7pub struct BasicAstInfo {
8    span: Span,
9    node_id: NodeId,
10}
11
12impl AstInfo for BasicAstInfo {
13    fn node_id(&self) -> NodeId {
14        self.node_id
15    }
16}
17
18impl PartialEq for BasicAstInfo {
19    fn eq(&self, _other: &Self) -> bool {
20        true
21    }
22}
23
24impl SpannedAstInfo for BasicAstInfo {
25    fn span(&self) -> &Span {
26        &self.span
27    }
28}
29
30pub trait BasicAstNode: AstNode<BasicAstInfo> {}
31
32impl<T> BasicAstNode for T where T: AstNode<BasicAstInfo> {}
33
34#[derive(Default)]
35struct AstInfoGenerator {
36    curr_id: u64,
37}
38
39impl GenerateAstInfo for AstInfoGenerator {
40    type Result = BasicAstInfo;
41
42    fn generate(&mut self, pair: &ParsePairSort) -> Self::Result {
43        let res = BasicAstInfo {
44            span: pair.span(),
45            node_id: NodeId::new(self.curr_id),
46        };
47        self.curr_id += 1;
48        res
49    }
50}
51
52pub fn generate_ast<AST>(pairs: &ParsePairSort) -> AST
53where
54    AST: AstNode<BasicAstInfo>,
55{
56    AST::from_pairs(pairs, &mut AstInfoGenerator::default())
57}