| // 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 <string> | |
| #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 |