// Protocol Buffers - Google's data interchange format // Copyright 2023 Google LLC. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file or at // https://developers.google.com/open-source/licenses/bsd // Generates foo.upbdefs.h. #include #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "absl/types/span.h" #include "google/protobuf/compiler/code_generator.h" #include "google/protobuf/io/printer.h" #include "upb/reflection/def.hpp" #include "upb_generator/common/names.h" #include "upb_generator/file_layout.h" #include "upb_generator/reflection/context.h" #include "upb_generator/reflection/names.h" namespace upb::generator::reflection { namespace { using Sub = google::protobuf::io::Printer::Sub; void GenerateMessageDefAccessor(upb::MessageDefPtr d, Context& ctx) { ctx.Emit( {{"def_init_symbol", ReflectionFileSymbol(d.file().name())}, {"full_name", d.full_name()}, {"get_message_symbol", ReflectionGetMessageSymbol(d.full_name())}}, R"cc( UPB_INLINE const upb_MessageDef *$get_message_symbol$(upb_DefPool *s) { _upb_DefPool_LoadDefInit(s, &$def_init_symbol$); return upb_DefPool_FindMessageByName(s, "$full_name$"); } )cc"); } void WriteMessages(upb::FileDefPtr file, Context& ctx) { for (auto msg : SortedMessages(file)) { GenerateMessageDefAccessor(msg, ctx); ctx.Emit("\n"); } } void WriteDefHeader(upb::FileDefPtr file, Context& ctx) { ctx.Emit( { {"def_init_symbol", ReflectionFileSymbol(file.name())}, {"dllexport_decl", ctx.options().dllexport_decl}, {"file_warning", FileWarning(file.name())}, {"include_guard", IncludeGuard(file.name())}, Sub("messages", [&] { WriteMessages(file, ctx); }).WithSuffix(";"), }, R"( $file_warning$ #ifndef $include_guard$_UPBDEFS_H_ #define $include_guard$_UPBDEFS_H_ #include "upb/reflection/def.h" #include "upb/reflection/internal/def_pool.h" #include "upb/port/def.inc" #ifdef __cplusplus extern "C" { #endif extern$ dllexport_decl$ _upb_DefPool_Init $def_init_symbol$; $messages$; #ifdef __cplusplus } /* extern "C" */ #endif #include "upb/port/undef.inc" #endif /* $include_guard$_UPBDEFS_H_ */ )"); } } // namespace std::string DefHeaderFilename(upb::FileDefPtr file) { return absl::StrCat(StripExtension(file.name()), ".upbdefs.h"); } void GenerateReflectionHeader(upb::FileDefPtr file, const Options& options, google::protobuf::compiler::GeneratorContext* context) { Context h_context(options, context->Open(DefHeaderFilename(file))); WriteDefHeader(file, h_context); } } // namespace upb::generator::reflection