ferrum_compiler/ir/rust/syntax/
use.rs

1use super::*;
2
3#[derive(Debug, Clone, PartialEq)]
4pub struct RustIRUse {
5    pub use_mod: Option<RustIRUseMod>,
6    pub path: RustIRUseStaticPath,
7}
8
9#[derive(Debug, Clone, PartialEq)]
10pub enum RustIRUseMod {
11    Pub,
12}
13
14#[derive(Debug, Clone, PartialEq)]
15pub struct RustIRUseStaticPath {
16    pub pre: Option<RustIRUseStaticPathPre>,
17    pub name: Arc<str>,
18    pub next: Option<RustIRUseStaticPathNext>,
19}
20
21#[derive(Debug, Clone, PartialEq)]
22pub enum RustIRUseStaticPathPre {
23    DoubleColon,
24    CurrentDir,
25    RootDir,
26}
27
28#[derive(Debug, Clone, PartialEq)]
29pub enum RustIRUseStaticPathNext {
30    Single(RustIRUseStaticPathNextSingle),
31    Many(RustIRUseStaticPathNextMany),
32}
33
34#[derive(Debug, Clone, PartialEq)]
35pub struct RustIRUseStaticPathNextSingle {
36    pub path: Box<RustIRUseStaticPath>,
37}
38
39#[derive(Debug, Clone, PartialEq)]
40pub struct RustIRUseStaticPathNextMany {
41    pub nexts: Vec<RustIRUseStaticPathNextManyItem>,
42}
43
44#[derive(Debug, Clone, PartialEq)]
45pub struct RustIRUseStaticPathNextManyItem {
46    pub path: RustIRUseStaticPath,
47}
48
49// Visitor pattern
50pub trait RustIRUseVisitor<R = ()> {
51    fn visit_use(&mut self, use_decl: &mut RustIRUse) -> R;
52}
53
54pub trait RustIRUseAccept<R, V: RustIRUseVisitor<R>> {
55    fn accept(&mut self, visitor: &mut V) -> R;
56}
57
58impl<R, V: RustIRUseVisitor<R>> RustIRUseAccept<R, V> for RustIRUse {
59    fn accept(&mut self, visitor: &mut V) -> R {
60        return visitor.visit_use(self);
61    }
62}