lwb_parser/parser/ast/
generate_ast.rs1use 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}