codeviz_python/
imports.rs

1use super::*;
2
3pub trait ImportReceiver {
4    fn receive(&mut self, name: &ImportedName);
5
6    fn import_all<T>(&mut self, sources: &Vec<T>)
7    where
8        T: Imports,
9        Self: Sized,
10    {
11        for source in sources {
12            source.imports(self);
13        }
14    }
15}
16
17pub trait Imports {
18    fn imports<I>(&self, receiver: &mut I)
19    where
20        I: ImportReceiver;
21}
22
23impl Imports for Name {
24    fn imports<I>(&self, receiver: &mut I)
25    where
26        I: ImportReceiver,
27    {
28        match *self {
29            Name::Imported(ref imported) => receiver.receive(imported),
30            _ => {}
31        };
32    }
33}
34
35impl Imports for Variable {
36    fn imports<I>(&self, receiver: &mut I)
37    where
38        I: ImportReceiver,
39    {
40        match *self {
41            Variable::Statement(ref stmt) => {
42                stmt.imports(receiver);
43            }
44            Variable::Name(ref name) => {
45                name.imports(receiver);
46            }
47            _ => {}
48        }
49    }
50}
51
52impl Imports for Statement {
53    fn imports<I>(&self, receiver: &mut I)
54    where
55        I: ImportReceiver,
56    {
57        receiver.import_all(&self.parts);
58    }
59}
60
61impl Imports for Element {
62    fn imports<I>(&self, receiver: &mut I)
63    where
64        I: ImportReceiver,
65    {
66        match *self {
67            Push(ref statement) => {
68                statement.imports(receiver);
69            }
70            Inner(ref elements) => {
71                receiver.import_all(elements);
72            }
73            Nested(ref element) => {
74                element.imports(receiver);
75            }
76            _ => {}
77        };
78    }
79}
80
81impl Imports for ClassSpec {
82    fn imports<I>(&self, receiver: &mut I)
83    where
84        I: ImportReceiver,
85    {
86        self.elements.imports(receiver);
87    }
88}
89
90impl Imports for Elements {
91    fn imports<I>(&self, receiver: &mut I)
92    where
93        I: ImportReceiver,
94    {
95        receiver.import_all(&self.elements);
96    }
97}