static_graph/resolver/
rir.rs

1use std::sync::Arc;
2
3use crate::{
4    codegen::ty::{Adt, CodegenTy},
5    symbol::{DefId, Ident, TagId},
6};
7
8#[derive(Debug, PartialEq, Eq, Clone)]
9pub struct Graph {
10    pub name: Ident,
11    pub entry_node: DefId,
12}
13
14#[derive(Debug, PartialEq, Eq, Clone)]
15pub struct Node {
16    pub name: Ident,
17    pub to_nodes: Vec<DefId>,
18    pub fields: Vec<Arc<Field>>,
19}
20
21#[derive(Debug, PartialEq, Eq, Clone)]
22pub struct Field {
23    pub name: Ident,
24    pub ty: Type,
25    pub tag_id: TagId,
26}
27
28#[derive(Debug, PartialEq, Eq, Clone)]
29pub struct Path {
30    pub segments: Arc<[Ident]>,
31}
32
33#[derive(Debug, PartialEq, Eq, Clone)]
34pub enum Type {
35    String,
36    Void,
37    U8,
38    Bool,
39    Bytes,
40    I8,
41    I16,
42    I32,
43    I64,
44    F64,
45    Vec(Arc<Type>),
46    Set(Arc<Type>),
47    Map(Arc<Type>, Arc<Type>),
48    ArcSwap(Arc<Type>),
49    Path(Path),
50}
51
52impl Type {
53    pub fn to_codegen_ty(&self) -> CodegenTy {
54        match self {
55            Type::String => CodegenTy::String,
56            Type::Void => CodegenTy::Void,
57            Type::U8 => CodegenTy::U8,
58            Type::Bool => CodegenTy::Bool,
59            Type::Bytes => CodegenTy::Bytes,
60            Type::I8 => CodegenTy::I8,
61            Type::I16 => CodegenTy::I16,
62            Type::I32 => CodegenTy::I32,
63            Type::I64 => CodegenTy::I64,
64            Type::F64 => CodegenTy::F64,
65            Type::Vec(ty) => CodegenTy::Vec(Arc::from(ty.to_codegen_ty())),
66            Type::Set(ty) => CodegenTy::Set(Arc::from(ty.to_codegen_ty())),
67            Type::Map(k, v) => {
68                CodegenTy::Map(Arc::from(k.to_codegen_ty()), Arc::from(v.to_codegen_ty()))
69            }
70            Type::ArcSwap(ty) => CodegenTy::ArcSwap(Arc::from(ty.to_codegen_ty())),
71            Type::Path(p) => CodegenTy::Adt(Adt {
72                segments: p.segments.clone(),
73            }),
74        }
75    }
76}