blob: f32a7cbd1d242d6c1d5f6b88ded4842568ca18fd [file] [log] [blame]
// Copyright 2020 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.
#include "tools/fidlcat/lib/code_generator/cpp_visitor.h"
namespace fidl_codec {
void CppVariableVector::GenerateInitialization(PrettyPrinter& printer, const char* suffix) const {
const Type* component_type = for_type()->GetComponentType();
std::string separator;
int i = 0;
std::vector<std::shared_ptr<CppVariable>> elems = {};
for (const auto& value : value()->AsVectorValue()->values()) {
CppVisitor visitor(name() + "_elem_" + std::to_string(i++));
value->Visit(&visitor, component_type);
auto elem = visitor.result();
elems.emplace_back(elem);
elem->GenerateInitialization(printer);
}
printer << separator;
GenerateTypeAndName(printer);
printer << " = { ";
separator = "";
for (const auto& elem : elems) {
printer << separator;
elem->GenerateName(printer);
separator = ", ";
}
printer << " };\n";
}
void CppVariableStruct::GenerateInitialization(PrettyPrinter& printer, const char* suffix) const {
/*
* Given the following FIDL definition:
*
* struct Color {
* uint32 id;
* string:MAX_STRING_LENGTH name = "red";
* };
*
* We are interested in generating the following HLCPP code:
*
* fuchsia::examples::Color blue = {1, "blue"};
*
* (See https://fuchsia.dev/fuchsia-src/reference/fidl/bindings/hlcpp-bindings#structs)
*/
std::vector<std::shared_ptr<CppVariable>> struct_members;
for (const std::unique_ptr<fidl_codec::StructMember>& struct_member :
value()->AsStructValue()->struct_definition().members()) {
std::pair<const fidl_codec::Type*, const fidl_codec::Value*> member_value =
value()->AsStructValue()->GetFieldValue(struct_member->name());
CppVisitor visitor(name() + "_" + struct_member->name());
member_value.second->Visit(&visitor, struct_member->type());
auto member = visitor.result();
member->GenerateInitialization(printer);
struct_members.emplace_back(member);
}
GenerateTypeAndName(printer);
printer << " = { ";
std::string separator;
for (const auto& member : struct_members) {
printer << separator;
separator = ", ";
member->GenerateName(printer);
}
printer << " };\n";
}
} // namespace fidl_codec