codeviz_python/
imports.rs1use 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}