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