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