blob: d26948a9b1b842a91efeba6983bf30efd75e5e64 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file contains the implementations of the Accept methods for the AST
// nodes. Generally, all they do is invoke the appropriate TreeVisitor method
// for each field of the node.
#include "banjo/raw_ast.h"
#include "banjo/tree_visitor.h"
namespace banjo {
namespace raw {
SourceElementMark::SourceElementMark(TreeVisitor& tv,
const SourceElement& element)
: tv_(tv), element_(element) {
tv_.OnSourceElementStart(element_);
}
SourceElementMark::~SourceElementMark() {
tv_.OnSourceElementEnd(element_);
}
void CompoundIdentifier::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
for (auto i = components.begin(); i != components.end(); ++i) {
visitor.OnIdentifier(*i);
}
}
void StringLiteral::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
}
void NumericLiteral::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
}
void TrueLiteral::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
}
void FalseLiteral::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
}
void IdentifierConstant::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnCompoundIdentifier(identifier);
}
void LiteralConstant::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnLiteral(literal);
}
void Attribute::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
}
void AttributeList::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
for (auto i = attributes_->attributes_.begin(); i != attributes_->attributes_.end(); ++i) {
visitor.OnAttribute(*i);
}
}
void ArrayType::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnType(element_type);
visitor.OnConstant(element_count);
}
void VectorType::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnType(element_type);
if (maybe_element_count != nullptr) {
visitor.OnConstant(maybe_element_count);
}
visitor.OnNullability(nullability);
}
void StringType::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (maybe_element_count != nullptr) {
visitor.OnConstant(maybe_element_count);
}
visitor.OnNullability(nullability);
}
void HandleType::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnHandleSubtype(subtype);
visitor.OnNullability(nullability);
}
void RequestHandleType::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnCompoundIdentifier(identifier);
visitor.OnNullability(nullability);
}
void PrimitiveType::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnPrimitiveSubtype(subtype);
}
void IdentifierType::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnCompoundIdentifier(identifier);
visitor.OnNullability(nullability);
}
void Using::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnCompoundIdentifier(using_path);
if (maybe_alias != nullptr) {
visitor.OnIdentifier(maybe_alias);
}
if (maybe_primitive != nullptr) {
visitor.OnPrimitiveType(maybe_primitive);
}
}
void ConstDeclaration::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnType(type);
visitor.OnIdentifier(identifier);
visitor.OnConstant(constant);
}
void EnumMember::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnIdentifier(identifier);
visitor.OnConstant(value);
}
void EnumDeclaration::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnIdentifier(identifier);
if (maybe_subtype != nullptr) {
visitor.OnPrimitiveType(maybe_subtype);
}
for (auto member = members.begin(); member != members.end(); ++member) {
visitor.OnEnumMember(*member);
}
}
void Parameter::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnType(type);
visitor.OnIdentifier(identifier);
}
void ParameterList::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
for (auto parameter = parameter_list.begin(); parameter != parameter_list.end(); ++parameter) {
visitor.OnParameter(*parameter);
}
}
void InterfaceMethod::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnIdentifier(identifier);
if (maybe_request != nullptr) {
visitor.OnParameterList(maybe_request);
}
if (maybe_response != nullptr) {
visitor.OnParameterList(maybe_response);
}
}
void InterfaceDeclaration::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnIdentifier(identifier);
for (auto superinterface = superinterfaces.begin();
superinterface != superinterfaces.end();
++superinterface) {
visitor.OnCompoundIdentifier(*superinterface);
}
for (auto method = methods.begin();
method != methods.end();
++method) {
visitor.OnInterfaceMethod(*method);
}
}
void StructMember::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnType(type);
visitor.OnIdentifier(identifier);
if (maybe_default_value != nullptr) {
visitor.OnConstant(maybe_default_value);
}
}
void StructDeclaration::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnIdentifier(identifier);
for (auto member = members.begin();
member != members.end();
++member) {
visitor.OnStructMember(*member);
}
}
void UnionMember::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnType(type);
visitor.OnIdentifier(identifier);
}
void UnionDeclaration::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
if (attributes != nullptr) {
visitor.OnAttributeList(attributes);
}
visitor.OnIdentifier(identifier);
for (auto member = members.begin();
member != members.end();
++member) {
visitor.OnUnionMember(*member);
}
}
void File::Accept(TreeVisitor& visitor) {
SourceElementMark sem(visitor, *this);
visitor.OnCompoundIdentifier(library_name);
for (auto i = using_list.begin();
i != using_list.end();
++i) {
visitor.OnUsing(*i);
}
for (auto i = const_declaration_list.begin();
i != const_declaration_list.end();
++i) {
visitor.OnConstDeclaration(*i);
}
for (auto i = enum_declaration_list.begin();
i != enum_declaration_list.end();
++i) {
visitor.OnEnumDeclaration(*i);
}
for (auto i = interface_declaration_list.begin();
i != interface_declaration_list.end();
++i) {
visitor.OnInterfaceDeclaration(*i);
}
for (auto i = struct_declaration_list.begin();
i != struct_declaration_list.end();
++i) {
visitor.OnStructDeclaration(*i);
}
for (auto i = union_declaration_list.begin();
i != union_declaration_list.end();
++i) {
visitor.OnUnionDeclaration(*i);
}
}
} // namespace raw
} // namespace banjo