1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // This file contains the implementations of the Accept methods for the AST
6 // nodes.  Generally, all they do is invoke the appropriate TreeVisitor method
7 // for each field of the node.
8 
9 #include "fidl/raw_ast.h"
10 #include "fidl/tree_visitor.h"
11 
12 namespace fidl {
13 namespace raw {
14 
SourceElementMark(TreeVisitor & tv,const SourceElement & element)15 SourceElementMark::SourceElementMark(TreeVisitor& tv,
16                                      const SourceElement& element)
17     : tv_(tv), element_(element) {
18     tv_.OnSourceElementStart(element_);
19 }
20 
~SourceElementMark()21 SourceElementMark::~SourceElementMark() {
22     tv_.OnSourceElementEnd(element_);
23 }
24 
Accept(TreeVisitor & visitor)25 void CompoundIdentifier::Accept(TreeVisitor& visitor) {
26     SourceElementMark sem(visitor, *this);
27     for (auto i = components.begin(); i != components.end(); ++i) {
28         visitor.OnIdentifier(*i);
29     }
30 }
31 
Accept(TreeVisitor & visitor)32 void StringLiteral::Accept(TreeVisitor& visitor) {
33     SourceElementMark sem(visitor, *this);
34 }
35 
Accept(TreeVisitor & visitor)36 void NumericLiteral::Accept(TreeVisitor& visitor) {
37     SourceElementMark sem(visitor, *this);
38 }
39 
Accept(TreeVisitor & visitor)40 void TrueLiteral::Accept(TreeVisitor& visitor) {
41     SourceElementMark sem(visitor, *this);
42 }
43 
Accept(TreeVisitor & visitor)44 void FalseLiteral::Accept(TreeVisitor& visitor) {
45     SourceElementMark sem(visitor, *this);
46 }
47 
Accept(TreeVisitor & visitor)48 void IdentifierConstant::Accept(TreeVisitor& visitor) {
49     SourceElementMark sem(visitor, *this);
50     visitor.OnCompoundIdentifier(identifier);
51 }
52 
Accept(TreeVisitor & visitor)53 void LiteralConstant::Accept(TreeVisitor& visitor) {
54     SourceElementMark sem(visitor, *this);
55     visitor.OnLiteral(literal);
56 }
57 
Accept(TreeVisitor & visitor)58 void Ordinal::Accept(TreeVisitor& visitor) {
59     SourceElementMark sem(visitor, *this);
60 }
61 
Accept(TreeVisitor & visitor)62 void Attribute::Accept(TreeVisitor& visitor) {
63     SourceElementMark sem(visitor, *this);
64 }
65 
Accept(TreeVisitor & visitor)66 void AttributeList::Accept(TreeVisitor& visitor) {
67     SourceElementMark sem(visitor, *this);
68     for (auto i = attributes.begin(); i != attributes.end(); ++i) {
69         visitor.OnAttribute(*i);
70     }
71 }
72 
Accept(TreeVisitor & visitor)73 void ArrayType::Accept(TreeVisitor& visitor) {
74     SourceElementMark sem(visitor, *this);
75     visitor.OnType(element_type);
76     visitor.OnConstant(element_count);
77 }
78 
Accept(TreeVisitor & visitor)79 void VectorType::Accept(TreeVisitor& visitor) {
80     SourceElementMark sem(visitor, *this);
81     visitor.OnType(element_type);
82     if (maybe_element_count != nullptr) {
83         visitor.OnConstant(maybe_element_count);
84     }
85     visitor.OnNullability(nullability);
86 }
87 
Accept(TreeVisitor & visitor)88 void StringType::Accept(TreeVisitor& visitor) {
89     SourceElementMark sem(visitor, *this);
90     if (maybe_element_count != nullptr) {
91         visitor.OnConstant(maybe_element_count);
92     }
93 
94     visitor.OnNullability(nullability);
95 }
96 
Accept(TreeVisitor & visitor)97 void HandleType::Accept(TreeVisitor& visitor) {
98     SourceElementMark sem(visitor, *this);
99     visitor.OnHandleSubtype(subtype);
100     visitor.OnNullability(nullability);
101 }
102 
Accept(TreeVisitor & visitor)103 void RequestHandleType::Accept(TreeVisitor& visitor) {
104     SourceElementMark sem(visitor, *this);
105     visitor.OnCompoundIdentifier(identifier);
106     visitor.OnNullability(nullability);
107 }
108 
Accept(TreeVisitor & visitor)109 void IdentifierType::Accept(TreeVisitor& visitor) {
110     SourceElementMark sem(visitor, *this);
111     visitor.OnCompoundIdentifier(identifier);
112     visitor.OnNullability(nullability);
113 }
114 
Accept(TreeVisitor & visitor)115 void Using::Accept(TreeVisitor& visitor) {
116     SourceElementMark sem(visitor, *this);
117     visitor.OnCompoundIdentifier(using_path);
118     if (maybe_alias != nullptr) {
119         visitor.OnIdentifier(maybe_alias);
120     }
121     if (maybe_type != nullptr) {
122         visitor.OnIdentifierType(maybe_type);
123     }
124 }
125 
Accept(TreeVisitor & visitor)126 void ConstDeclaration::Accept(TreeVisitor& visitor) {
127     SourceElementMark sem(visitor, *this);
128     if (attributes != nullptr) {
129         visitor.OnAttributeList(attributes);
130     }
131     visitor.OnType(type);
132     visitor.OnIdentifier(identifier);
133     visitor.OnConstant(constant);
134 }
135 
Accept(TreeVisitor & visitor)136 void EnumMember::Accept(TreeVisitor& visitor) {
137     SourceElementMark sem(visitor, *this);
138     if (attributes != nullptr) {
139         visitor.OnAttributeList(attributes);
140     }
141     visitor.OnIdentifier(identifier);
142     visitor.OnConstant(value);
143 }
144 
Accept(TreeVisitor & visitor)145 void EnumDeclaration::Accept(TreeVisitor& visitor) {
146     SourceElementMark sem(visitor, *this);
147     if (attributes != nullptr) {
148         visitor.OnAttributeList(attributes);
149     }
150     visitor.OnIdentifier(identifier);
151     if (maybe_subtype != nullptr) {
152         visitor.OnIdentifierType(maybe_subtype);
153     }
154     for (auto member = members.begin(); member != members.end(); ++member) {
155         visitor.OnEnumMember(*member);
156     }
157 }
158 
Accept(TreeVisitor & visitor)159 void Parameter::Accept(TreeVisitor& visitor) {
160     SourceElementMark sem(visitor, *this);
161     visitor.OnType(type);
162     visitor.OnIdentifier(identifier);
163 }
164 
Accept(TreeVisitor & visitor)165 void ParameterList::Accept(TreeVisitor& visitor) {
166     SourceElementMark sem(visitor, *this);
167     for (auto parameter = parameter_list.begin(); parameter != parameter_list.end(); ++parameter) {
168         visitor.OnParameter(*parameter);
169     }
170 }
171 
Accept(TreeVisitor & visitor)172 void InterfaceMethod::Accept(TreeVisitor& visitor) {
173     SourceElementMark sem(visitor, *this);
174     if (attributes != nullptr) {
175         visitor.OnAttributeList(attributes);
176     }
177     if (ordinal != nullptr) {
178         visitor.OnOrdinal(*ordinal);
179     }
180     visitor.OnIdentifier(identifier);
181     if (maybe_request != nullptr) {
182         visitor.OnParameterList(maybe_request);
183     }
184     if (maybe_response != nullptr) {
185         visitor.OnParameterList(maybe_response);
186     }
187 }
188 
Accept(TreeVisitor & visitor)189 void InterfaceDeclaration::Accept(TreeVisitor& visitor) {
190     SourceElementMark sem(visitor, *this);
191     if (attributes != nullptr) {
192         visitor.OnAttributeList(attributes);
193     }
194     visitor.OnIdentifier(identifier);
195     for (auto superinterface = superinterfaces.begin();
196          superinterface != superinterfaces.end();
197          ++superinterface) {
198         visitor.OnCompoundIdentifier(*superinterface);
199     }
200     for (auto method = methods.begin();
201          method != methods.end();
202          ++method) {
203         visitor.OnInterfaceMethod(*method);
204     }
205 }
206 
Accept(TreeVisitor & visitor)207 void StructMember::Accept(TreeVisitor& visitor) {
208     SourceElementMark sem(visitor, *this);
209     if (attributes != nullptr) {
210         visitor.OnAttributeList(attributes);
211     }
212     visitor.OnType(type);
213     visitor.OnIdentifier(identifier);
214     if (maybe_default_value != nullptr) {
215         visitor.OnConstant(maybe_default_value);
216     }
217 }
218 
Accept(TreeVisitor & visitor)219 void StructDeclaration::Accept(TreeVisitor& visitor) {
220     SourceElementMark sem(visitor, *this);
221     if (attributes != nullptr) {
222         visitor.OnAttributeList(attributes);
223     }
224     visitor.OnIdentifier(identifier);
225     for (auto member = members.begin();
226          member != members.end();
227          ++member) {
228         visitor.OnStructMember(*member);
229     }
230 }
231 
Accept(TreeVisitor & visitor)232 void TableMember::Accept(TreeVisitor& visitor) {
233     SourceElementMark sem(visitor, *this);
234     visitor.OnOrdinal(*ordinal);
235     if (maybe_used != nullptr) {
236         if (maybe_used->attributes != nullptr) {
237             visitor.OnAttributeList(maybe_used->attributes);
238         }
239         visitor.OnType(maybe_used->type);
240         visitor.OnIdentifier(maybe_used->identifier);
241         if (maybe_used->maybe_default_value != nullptr) {
242             visitor.OnConstant(maybe_used->maybe_default_value);
243         }
244     }
245 }
246 
Accept(TreeVisitor & visitor)247 void TableDeclaration::Accept(TreeVisitor& visitor) {
248     SourceElementMark sem(visitor, *this);
249     if (attributes != nullptr) {
250         visitor.OnAttributeList(attributes);
251     }
252     visitor.OnIdentifier(identifier);
253     for (auto member = members.begin();
254          member != members.end();
255          ++member) {
256         visitor.OnTableMember(*member);
257     }
258 }
259 
Accept(TreeVisitor & visitor)260 void UnionMember::Accept(TreeVisitor& visitor) {
261     SourceElementMark sem(visitor, *this);
262     if (attributes != nullptr) {
263         visitor.OnAttributeList(attributes);
264     }
265     visitor.OnType(type);
266     visitor.OnIdentifier(identifier);
267 }
268 
Accept(TreeVisitor & visitor)269 void UnionDeclaration::Accept(TreeVisitor& visitor) {
270     SourceElementMark sem(visitor, *this);
271     if (attributes != nullptr) {
272         visitor.OnAttributeList(attributes);
273     }
274     visitor.OnIdentifier(identifier);
275     for (auto member = members.begin();
276          member != members.end();
277          ++member) {
278         visitor.OnUnionMember(*member);
279     }
280 }
281 
Accept(TreeVisitor & visitor)282 void File::Accept(TreeVisitor& visitor) {
283     SourceElementMark sem(visitor, *this);
284     visitor.OnCompoundIdentifier(library_name);
285     for (auto i = using_list.begin();
286          i != using_list.end();
287          ++i) {
288         visitor.OnUsing(*i);
289     }
290     for (auto i = const_declaration_list.begin();
291          i != const_declaration_list.end();
292          ++i) {
293         visitor.OnConstDeclaration(*i);
294     }
295     for (auto i = enum_declaration_list.begin();
296          i != enum_declaration_list.end();
297          ++i) {
298         visitor.OnEnumDeclaration(*i);
299     }
300     for (auto i = interface_declaration_list.begin();
301          i != interface_declaration_list.end();
302          ++i) {
303         visitor.OnInterfaceDeclaration(*i);
304     }
305     for (auto i = struct_declaration_list.begin();
306          i != struct_declaration_list.end();
307          ++i) {
308         visitor.OnStructDeclaration(*i);
309     }
310     for (auto i = table_declaration_list.begin();
311          i != table_declaration_list.end();
312          ++i) {
313         visitor.OnTableDeclaration(*i);
314     }
315     for (auto i = union_declaration_list.begin();
316          i != union_declaration_list.end();
317          ++i) {
318         visitor.OnUnionDeclaration(*i);
319     }
320 }
321 
322 } // namespace raw
323 } // namespace fidl
324