| // 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. |
| |
| #ifndef TOOLS_FIDL_FIDLC_INCLUDE_FIDL_TABLES_GENERATOR_H_ |
| #define TOOLS_FIDL_FIDLC_INCLUDE_FIDL_TABLES_GENERATOR_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <sstream> |
| #include <string> |
| #include <string_view> |
| #include <unordered_map> |
| #include <vector> |
| |
| #include "coded_ast.h" |
| #include "coded_types_generator.h" |
| #include "flat_ast.h" |
| |
| namespace fidl { |
| |
| // |TablesGenerator| generates metadata about FIDL types useful for encoding or |
| // decoding. The definition of these metadata structures is located in |
| // //zircon/system/ulib/fidl/include/lib/fidl/internal.h |
| // |
| // Methods or functions named "Emit..." are the actual interface to |
| // the tables output. |
| // |
| // Methods named "Generate..." directly generate tables output via the |
| // "Emit" routines. |
| // |
| // Methods named "Produce..." indirectly generate tables output by calling |
| // the Generate methods, and should not call the "Emit" functions |
| // directly. |
| // |
| // Note that this file is specifically emitted as a C file rather than a C++ |
| // file in order to ensure that the definitions of the tables will be in .rodata |
| // or .data, not runtime initialized. This is necessary because there are |
| // consumers of the data that run before main(), and the order of initialization |
| // by ctor is not guaranteed (see fxbug.dev/39978). |
| class TablesGenerator { |
| public: |
| explicit TablesGenerator(const flat::Library* library) : library_(library) {} |
| |
| ~TablesGenerator() = default; |
| |
| std::ostringstream Produce(); |
| |
| private: |
| template <typename Collection> |
| void GenerateArray(const Collection& collection); |
| |
| void Generate(const coded::EnumType& struct_type); |
| void Generate(const coded::BitsType& struct_type); |
| void Generate(const coded::StructType& struct_type); |
| void Generate(const coded::TableType& table_type); |
| void Generate(const coded::XUnionType& xunion_type); |
| void Generate(const coded::StructPointerType& pointer); |
| void Generate(const coded::MessageType& message_type); |
| void Generate(const coded::HandleType& handle_type); |
| void Generate(const coded::ProtocolHandleType& protocol_type); |
| void Generate(const coded::RequestHandleType& request_type); |
| void Generate(const coded::ArrayType& array_type); |
| void Generate(const coded::StringType& string_type); |
| void Generate(const coded::VectorType& vector_type); |
| |
| enum class CastToFidlType { |
| kNoCast = 0, |
| kCast = 1, |
| }; |
| void Generate(const coded::Type* type, CastToFidlType cast_to_fidl_type = CastToFidlType::kCast); |
| void Generate(const coded::StructField& field); |
| void Generate(const coded::StructPadding& padding); |
| void Generate(const coded::StructElement& element); |
| void Generate(const coded::TableField& field); |
| void Generate(const coded::XUnionField& field); |
| |
| void GenerateForward(const coded::EnumType& enum_type); |
| void GenerateForward(const coded::BitsType& bits_type); |
| void GenerateForward(const coded::StructType& struct_type); |
| void GenerateForward(const coded::TableType& table_type); |
| void GenerateForward(const coded::XUnionType& xunion_type); |
| |
| void GenerateTypedef(const coded::EnumType& enum_type); |
| void GenerateTypedef(const coded::BitsType& bits_type); |
| void GenerateTypedef(const coded::StructType& struct_type); |
| void GenerateTypedef(const coded::TableType& table_type); |
| void GenerateTypedef(const coded::XUnionType& xunion_type); |
| |
| void Produce(CodedTypesGenerator* coded_types_generator); |
| |
| const flat::Library* library_; |
| |
| // These will be empty after calling Produce(), since Produce() std::moves |
| // them into the result. |
| std::ostringstream tables_file_; |
| std::ostringstream forward_decls_; |
| |
| size_t indent_level_ = 0u; |
| }; |
| |
| } // namespace fidl |
| |
| #endif // TOOLS_FIDL_FIDLC_INCLUDE_FIDL_TABLES_GENERATOR_H_ |