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