Go to the documentation of this file.
35 #include <google/protobuf/compiler/cpp/cpp_helpers.h>
42 #include <unordered_set>
45 #include <google/protobuf/stubs/common.h>
46 #include <google/protobuf/stubs/logging.h>
47 #include <google/protobuf/compiler/cpp/cpp_options.h>
49 #include <google/protobuf/descriptor.pb.h>
50 #include <google/protobuf/descriptor.h>
51 #include <google/protobuf/compiler/scc.h>
52 #include <google/protobuf/io/printer.h>
53 #include <google/protobuf/io/zero_copy_stream.h>
54 #include <google/protobuf/dynamic_message.h>
55 #include <google/protobuf/wire_format.h>
56 #include <google/protobuf/wire_format_lite.h>
57 #include <google/protobuf/stubs/strutil.h>
58 #include <google/protobuf/stubs/substitute.h>
59 #include <google/protobuf/stubs/hash.h>
62 #include <google/protobuf/port_def.inc>
71 static const char kAnyMessageName[] =
"Any";
72 static const char kAnyProtoFile[] =
"google/protobuf/any.proto";
78 static const char*
const kKeywordList[] = {
163 static std::unordered_set<std::string>* MakeKeywordsMap() {
164 auto*
result =
new std::unordered_set<std::string>();
165 for (
const auto keyword : kKeywordList) {
171 static std::unordered_set<std::string>& kKeywords = *MakeKeywordsMap();
178 std::map<std::string, std::string>* variables) {
183 MessageSCCAnalyzer* scc_analyzer) {
192 IsEagerlyVerifiedLazyImpl(
field,
options, scc_analyzer);
196 std::map<std::string, std::string>* variables) {
203 if (
options.opensource_runtime) {
204 (*variables)[
"GOOGLE_PROTOBUF"] =
"GOOGLE_PROTOBUF";
205 (*variables)[
"CHK"] =
"GOOGLE_CHECK";
206 (*variables)[
"DCHK"] =
"GOOGLE_DCHECK";
212 (*variables)[
"GOOGLE_PROTOBUF"] =
215 (*variables)[
"CHK"] =
218 (*variables)[
"DCHK"] =
223 SetIntVar(
options,
"int8", variables);
224 SetIntVar(
options,
"uint8", variables);
225 SetIntVar(
options,
"uint32", variables);
226 SetIntVar(
options,
"uint64", variables);
227 SetIntVar(
options,
"int32", variables);
228 SetIntVar(
options,
"int64", variables);
229 (*variables)[
"string"] =
"std::string";
234 std::map<std::string, std::string>* variables) {
238 unknown_fields_type =
"::" + proto_ns +
"::UnknownFieldSet";
239 (*variables)[
"unknown_fields"] =
240 "_internal_metadata_.unknown_fields<" + unknown_fields_type +
">(" +
241 unknown_fields_type +
"::default_instance)";
243 unknown_fields_type =
245 (*variables)[
"unknown_fields"] =
"_internal_metadata_.unknown_fields<" +
246 unknown_fields_type +
">(::" + proto_ns +
247 "::internal::GetEmptyString)";
249 (*variables)[
"unknown_fields_type"] = unknown_fields_type;
250 (*variables)[
"have_unknown_fields"] =
251 "_internal_metadata_.have_unknown_fields()";
252 (*variables)[
"mutable_unknown_fields"] =
253 "_internal_metadata_.mutable_unknown_fields<" + unknown_fields_type +
258 bool cap_next_letter) {
261 for (
int i = 0;
i <
input.size();
i++) {
263 if (cap_next_letter) {
268 cap_next_letter =
false;
269 }
else if (
'A' <=
input[i] &&
input[i] <=
'Z') {
272 cap_next_letter =
false;
273 }
else if (
'0' <=
input[i] &&
input[i] <=
'9') {
275 cap_next_letter =
true;
277 cap_next_letter =
true;
284 "// ===================================================================\n";
286 "// -------------------------------------------------------------------\n";
289 if (
field->is_repeated() ||
field->is_extension())
return false;
290 switch (
field->cpp_type()) {
292 return field->default_value_enum()->number() == 0;
294 return field->default_value_int32() == 0;
296 return field->default_value_int64() == 0;
298 return field->default_value_uint32() == 0;
300 return field->default_value_uint64() == 0;
302 return field->default_value_float() == 0;
304 return field->default_value_double() == 0;
306 return field->default_value_bool() ==
false;
315 if (parent) res +=
ClassName(parent) +
"_";
348 if (
const Descriptor* scope = d->extension_scope())
364 if (package.empty())
return "";
376 "::PROTOBUF_NAMESPACE_ID",
false);
434 if (simple_base.empty()) {
441 if (kKeywords.count(
name) > 0) {
450 if (kKeywords.count(
result) > 0) {
459 return "k" + field_name;
471 if (kKeywords.count(
result) > 0) {
478 if (
field ==
nullptr)
return 0;
479 if (
field->is_repeated())
return 8;
480 switch (
field->cpp_type()) {
505 if (!
field->is_extension() &&
506 field->containing_type()->FindFieldByCamelcaseName(
551 return "std::string";
567 return IntTypeName(
options,
"int32");
569 return IntTypeName(
options,
"int64");
571 return IntTypeName(
options,
"uint32");
573 return IntTypeName(
options,
"uint64");
583 return "std::string";
671 switch (
field->cpp_type()) {
675 return StrCat(
field->default_value_uint32()) +
"u";
682 if (
value == std::numeric_limits<double>::infinity()) {
683 return "std::numeric_limits<double>::infinity()";
684 }
else if (
value == -std::numeric_limits<double>::infinity()) {
685 return "-std::numeric_limits<double>::infinity()";
687 return "std::numeric_limits<double>::quiet_NaN()";
694 if (
value == std::numeric_limits<float>::infinity()) {
695 return "std::numeric_limits<float>::infinity()";
696 }
else if (
value == -std::numeric_limits<float>::infinity()) {
697 return "-std::numeric_limits<float>::infinity()";
699 return "std::numeric_limits<float>::quiet_NaN()";
705 if (float_value.find_first_of(
".eE") != std::string::npos) {
706 float_value.push_back(
'f');
712 return field->default_value_bool() ?
"true" :
"false";
725 "::internal_default_instance()";
759 if (
file->package().empty()) {
778 if (
descriptor->FindFieldByName(function_name)) {
781 function_name.append(
"__");
782 }
else if (kKeywords.count(
name) > 0) {
785 function_name.append(
"_");
787 return function_name;
799 for (
int field_idx = 0; field_idx <
descriptor->field_count(); field_idx++) {
820 for (
int i = 0;
i <
file->message_type_count();
i++) {
826 for (
int field_idx = 0; field_idx <
file->extension_count(); field_idx++) {
847 for (
int i = 0;
i <
file->message_type_count(); ++
i) {
871 for (
int i = 0;
i <
file->message_type_count(); ++
i) {
894 for (
int i = 0;
i <
file->message_type_count(); ++
i) {
901 if (
descriptor->extension_range_count() > 0)
return true;
902 if (
descriptor->extension_count() > 0)
return true;
912 if (
file->extension_count() > 0)
return true;
913 for (
int i = 0;
i <
file->message_type_count(); ++
i) {
932 for (
int i = 0;
i <
file->message_type_count(); ++
i) {
947 if (
file->enum_type_count() > 0)
return true;
948 for (
int i = 0;
i <
file->message_type_count(); ++
i) {
971 switch (
field->cpp_type()) {
993 if (
options.opensource_runtime) {
998 return field->options().ctype();
1007 return descriptor->name() == kAnyMessageName &&
1012 static const std::unordered_set<std::string> well_known_files{
1013 "google/protobuf/any.proto",
1014 "google/protobuf/api.proto",
1015 "google/protobuf/compiler/plugin.proto",
1016 "google/protobuf/descriptor.proto",
1017 "google/protobuf/duration.proto",
1018 "google/protobuf/empty.proto",
1019 "google/protobuf/field_mask.proto",
1020 "google/protobuf/source_context.proto",
1021 "google/protobuf/struct.proto",
1022 "google/protobuf/timestamp.proto",
1023 "google/protobuf/type.proto",
1024 "google/protobuf/wrappers.proto",
1026 return well_known_files.find(
file->
name()) != well_known_files.end();
1057 const char* strict_function,
1058 const char* verify_function,
1065 format(
"::$proto_ns$::internal::WireFormatLite::$1$(\n", strict_function);
1069 format(
"::$proto_ns$::internal::WireFormatLite::PARSE,\n");
1071 format(
"::$proto_ns$::internal::WireFormatLite::SERIALIZE,\n");
1082 format(
"::$proto_ns$::internal::WireFormat::$1$(\n", verify_function);
1086 format(
"::$proto_ns$::internal::WireFormat::PARSE,\n");
1088 format(
"::$proto_ns$::internal::WireFormat::SERIALIZE,\n");
1100 const Options&
options,
bool for_parse,
1104 "VerifyUtf8String",
"VerifyUTF8StringNamedField",
1109 const Options&
options,
bool for_parse,
1113 "VerifyUTF8CordNamedField",
format);
1117 std::vector<const Descriptor*>*
result) {
1118 for (
int i = 0;
i <
file->message_type_count();
i++) {
1120 result->push_back(descriptor);
1133 for (
int i = 0;
i <
file->message_type_count(); ++
i) {
1141 return options.lite_implicit_weak_fields &&
1146 MessageSCCAnalyzer* scc_analyzer) {
1149 !
field->is_required() && !
field->is_map() && !
field->is_extension() &&
1150 !
field->real_containing_oneof() &&
1152 field->message_type()->file()->name() !=
1153 "net/proto2/proto/descriptor.proto" &&
1156 scc_analyzer->GetSCC(
field->containing_type()) !=
1157 scc_analyzer->GetSCC(
field->message_type());
1164 result.contains_weak =
true;
1166 for (
int i = 0;
i < scc->descriptors.size();
i++) {
1168 if (
descriptor->extension_range_count() > 0) {
1169 result.contains_extension =
true;
1173 if (
field->is_required()) {
1174 result.contains_required =
true;
1176 if (
field->options().weak()) {
1177 result.contains_weak =
true;
1179 switch (
field->type()) {
1183 result.contains_cord =
true;
1192 result.contains_cord |= analysis.contains_cord;
1193 result.contains_extension |= analysis.contains_extension;
1195 result.contains_required |= analysis.contains_required;
1197 result.contains_weak |= analysis.contains_weak;
1203 result.is_recursive =
true;
1220 std::vector<const FieldDescriptor*>*
fields) {
1222 for (
int i = 0;
i <
d->nested_type_count();
i++) {
1226 for (
int i = 0;
i <
d->extension_count();
i++) {
1227 fields->push_back(
d->extension(i));
1230 for (
int i = 0;
i <
d->field_count();
i++) {
1231 fields->push_back(
d->field(i));
1236 std::vector<const FieldDescriptor*>*
fields) {
1238 for (
int i = 0;
i <
d->message_type_count();
i++) {
1242 for (
int i = 0;
i <
d->extension_count();
i++) {
1243 fields->push_back(
d->extension(i));
1248 std::vector<const Descriptor*>*
types) {
1249 for (
int i = 0;
i < fd->service_count();
i++) {
1251 for (
int j = 0;
j < sd->method_count();
j++) {
1261 if (
options.opensource_runtime) {
1265 std::unordered_map<std::string, std::string> bootstrap_mapping{
1266 {
"net/proto2/proto/descriptor",
1267 "net/proto2/internal/descriptor"},
1268 {
"net/proto2/compiler/proto/plugin",
1269 "net/proto2/compiler/proto/plugin"},
1270 {
"net/proto2/compiler/proto/profile",
1271 "net/proto2/compiler/proto/profile_bootstrap"},
1273 auto iter = bootstrap_mapping.find(basename);
1274 if (
iter == bootstrap_mapping.end()) {
1275 *bootstrap_basename = basename;
1278 *bootstrap_basename =
iter->second;
1295 if (bootstrap_flag) {
1297 *basename = bootstrap_basename;
1300 std::string forward_to_basename = bootstrap_basename;
1304 std::unique_ptr<io::ZeroCopyOutputStream>
output(
1305 generator_context->Open(*basename +
".pb.h"));
1308 "#ifndef PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PB_H\n"
1309 "#define PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PB_H\n"
1310 "#include \"$forward_to_basename$.pb.h\" // IWYU pragma: export\n"
1311 "#endif // PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PB_H\n",
1312 "forward_to_basename", forward_to_basename,
"filename_identifier",
1315 if (!
options.opensource_runtime) {
1318 if (*basename ==
"net/proto/protocoltype") {
1321 "%include \"$forward_to_basename$.pb.h\"\n"
1323 "forward_to_basename", forward_to_basename);
1329 std::unique_ptr<io::ZeroCopyOutputStream>
output(
1330 generator_context->Open(*basename +
".proto.h"));
1333 "#ifndef PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PROTO_H\n"
1334 "#define PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PROTO_H\n"
1335 "#include \"$forward_to_basename$.proto.h\" // IWYU pragma: "
1338 "PROTOBUF_INCLUDED_$filename_identifier$_FORWARD_PROTO_H\n",
1339 "forward_to_basename", forward_to_basename,
"filename_identifier",
1344 std::unique_ptr<io::ZeroCopyOutputStream>
output(
1345 generator_context->Open(*basename +
".pb.cc"));
1347 printer.Print(
"\n");
1351 std::unique_ptr<io::ZeroCopyOutputStream>
output(
1352 generator_context->Open(*basename +
".pb.h.meta"));
1356 std::unique_ptr<io::ZeroCopyOutputStream>
output(
1357 generator_context->Open(*basename +
".proto.h.meta"));
1367 bool* has_opt_codesize_extension) {
1368 std::vector<const FieldDescriptor*>
fields;
1369 auto reflection =
msg.GetReflection();
1372 const auto* field_msg =
field->message_type();
1373 if (field_msg ==
nullptr) {
1380 if (
field->is_extension()) {
1381 const auto* msg_extension_file =
field->message_type()->file();
1382 if (msg_extension_file ==
file)
return true;
1383 if (has_opt_codesize_extension &&
1386 *has_opt_codesize_extension =
true;
1390 if (
field->is_repeated()) {
1391 for (
int i = 0;
i < reflection->FieldSize(
msg,
field);
i++) {
1399 options, has_opt_codesize_extension)) {
1409 bool* has_opt_codesize_extension) {
1410 static auto& cache = *
new std::unordered_map<const FileDescriptor*, bool>;
1411 auto it = cache.find(
file);
1412 if (
it != cache.end())
return it->second;
1417 if (
file->
name() ==
"net/proto2/proto/descriptor.proto" ||
1418 file->
name() ==
"google/protobuf/descriptor.proto") {
1428 pool->FindMessageTypeByName(linkedin_fd_proto.GetTypeName());
1431 if (fd_proto_descriptor ==
nullptr)
return false;
1435 file->CopyTo(&linkedin_fd_proto);
1448 bool& res = cache[
file];
1450 has_opt_codesize_extension);
1457 bool* has_opt_codesize_extension) {
1458 if (has_opt_codesize_extension) *has_opt_codesize_extension =
false;
1459 switch (
options.enforce_mode) {
1476 "cannot honor that because it contains custom option "
1477 "extensions defined in the same proto.";
1481 return file->options().optimize_for();
bool IsBootstrapProto(const Options &options, const FileDescriptor *file)
bool IsAnyMessage(const FileDescriptor *descriptor, const Options &options)
const Descriptor::ReservedRange value
std::string DefaultInstancePtr(const Descriptor *descriptor, const Options &options)
bool IsStringOrMessage(const FieldDescriptor *field)
const grpc_generator::File * file
std::string FieldName(const FieldDescriptor *field)
std::string ProtobufNamespace(const Options &options)
std::string StripProto(const std::string &filename)
def parameters(*testcases)
std::string FieldConstantName(const FieldDescriptor *field)
static void GenerateUtf8CheckCode(const FieldDescriptor *field, const Options &options, bool for_parse, const char *parameters, const char *strict_function, const char *verify_function, const Formatter &format)
void ForEachMessage(const Descriptor *descriptor, F &&func)
static bool HasEnumDefinitions(const Descriptor *message_type)
static bool HasLazyFields(const Descriptor *descriptor, const Options &options)
string CEscape(const string &src)
GRPC_CUSTOM_PRINTER Printer
std::string QualifiedClassName(const Descriptor *d, const Options &options)
bool IsStringInlined(const FieldDescriptor *descriptor, const Options &options)
std::string SuperClassName(const Descriptor *descriptor, const Options &options)
std::string UInt64ToString(const std::string ¯o_prefix, uint64 number)
int EstimateAlignmentSize(const FieldDescriptor *field)
std::string DotsToColons(const std::string &name)
void SetUnknownFieldsVariable(const Descriptor *descriptor, const Options &options, std::map< std::string, std::string > *variables)
std::string EnumValueName(const EnumValueDescriptor *enum_value)
string UniqueName(const std::string &name, const std::string &filename, const Options &options)
FileOptions_OptimizeMode GetOptimizeFor(const FileDescriptor *file, const Options &options)
string StrCat(const AlphaNum &a, const AlphaNum &b)
static bool FileUtf8Verification(const FileDescriptor *file, const Options &options)
const char * DeclaredTypeMethodName(FieldDescriptor::Type type)
static bool FieldEnforceUtf8(const FieldDescriptor *field, const Options &options)
static constexpr CType CORD
static bool HasMapFields(const Descriptor *descriptor)
void FlattenMessagesInFile(const FileDescriptor *file, std::vector< const Descriptor * > *result)
bool IsWeak(const FieldDescriptor *field, const Options &options)
const std::string & name() const
bool HasWeakFields(const Descriptor *descriptor, const Options &options)
void GenerateUtf8CheckCodeForString(const FieldDescriptor *field, const Options &options, bool for_parse, const char *parameters, const Formatter &format)
static bool IsStringPieceField(const FieldDescriptor *field, const Options &options)
GRPC_CUSTOM_GENERATORCONTEXT GeneratorContext
std::string FileDllExport(const FileDescriptor *file, const Options &options)
static bool HasStringPieceFields(const Descriptor *descriptor, const Options &options)
bool UsingImplicitWeakFields(const FileDescriptor *file, const Options &options)
std::string ExtensionName(const FieldDescriptor *d)
std::string SafeFunctionName(const Descriptor *descriptor, const FieldDescriptor *field, const std::string &prefix)
std::string QualifiedDefaultInstancePtr(const Descriptor *descriptor, const Options &options)
FieldOptions::CType EffectiveStringCType(const FieldDescriptor *field, const Options &options)
std::string SimpleBaseClass(const Descriptor *desc, const Options &options)
bool IsLazy(const FieldDescriptor *field, const Options &options)
bool IsLazilyVerifiedLazy(const FieldDescriptor *field, const Options &options)
std::string ResolveKeyword(const string &name)
GRPC_CUSTOM_METHODDESCRIPTOR MethodDescriptor
bool IsImplicitWeakField(const FieldDescriptor *field, const Options &options, MessageSCCAnalyzer *scc_analyzer)
std::string QualifiedFileLevelSymbol(const FileDescriptor *file, const std::string &name, const Options &options)
string SimpleFtoa(float value)
unsigned __int64 uint64_t
bool IsMapEntryMessage(const Descriptor *descriptor)
std::string FieldMessageTypeName(const FieldDescriptor *field, const Options &options)
static constexpr OptimizeMode LITE_RUNTIME
std::string DefaultInstanceType(const Descriptor *descriptor, const Options &options)
static constexpr OptimizeMode SPEED
std::string DescriptorTableName(const FileDescriptor *file, const Options &options)
static constexpr CType STRING_PIECE
std::string DefaultValue(const FieldDescriptor *field)
static const LogLevel WARNING
bool UseUnknownFieldSet(const FileDescriptor *file, const Options &options)
string Substitute(const char *format, const SubstituteArg &arg0, const SubstituteArg &arg1, const SubstituteArg &arg2, const SubstituteArg &arg3, const SubstituteArg &arg4, const SubstituteArg &arg5, const SubstituteArg &arg6, const SubstituteArg &arg7, const SubstituteArg &arg8, const SubstituteArg &arg9)
void SetCommonVars(const Options &options, std::map< std::string, std::string > *variables)
bool GetBootstrapBasename(const Options &options, const std::string &basename, std::string *bootstrap_basename)
std::string QualifiedDefaultInstanceName(const Descriptor *descriptor, const Options &options)
bool HasDescriptorMethods(const FileDescriptor *file, const Options &options)
void ListAllFields(const Descriptor *d, std::vector< const FieldDescriptor * > *fields)
void LowerString(string *s)
static constexpr CType STRING
static bool HasBootstrapProblem(const FileDescriptor *file, const Options &options, bool *has_opt_codesize_extension)
static bool HasCordFields(const Descriptor *descriptor, const Options &options)
const char kThickSeparator[]
std::string Int32ToString(int number)
static bool HasExtensionFromFile(const Message &msg, const FileDescriptor *file, const Options &options, bool *has_opt_codesize_extension)
std::string Namespace(const std::string &package)
bool IsWellKnownMessage(const FileDescriptor *file)
string SimpleDtoa(double value)
const FieldDescriptor * field
std::string OneofCaseConstantName(const FieldDescriptor *field)
void StringReplace(const string &s, const string &oldsub, const string &newsub, bool replace_all, string *res)
bool EnableMessageOwnedArena(const Descriptor *desc)
MessageAnalysis GetSCCAnalysis(const SCC *scc)
std::string FilenameIdentifier(const std::string &filename)
std::string DefaultInstanceName(const Descriptor *descriptor, const Options &options)
UniquePtr< SSL_SESSION > ret
std::string StripProto(const std::string &filename)
void GenerateUtf8CheckCodeForCord(const FieldDescriptor *field, const Options &options, bool for_parse, const char *parameters, const Formatter &format)
static bool HasExtensionsOrExtendableMessage(const Descriptor *descriptor)
std::string EscapeTrigraphs(const std::string &to_escape)
SCCAnalyzer< DepsGenerator > analyzer_
std::string QualifiedExtensionName(const FieldDescriptor *d, const Options &options)
static const char prefix[]
bool ParseFromString(const std::string &data)
std::string ClassName(const Descriptor *descriptor)
static bool HasRepeatedFields(const Descriptor *descriptor)
static const struct nv types[]
std::string UnderscoresToCamelCase(const std::string &input, bool cap_next_letter)
const char * PrimitiveTypeName(FieldDescriptor::CppType type)
Message * New() const override=0
bool ascii_isalnum(char c)
void ListAllTypesForServices(const FileDescriptor *fd, std::vector< const Descriptor * > *types)
InternalDescriptorPool * pool
static bool ShouldIgnoreRequiredFieldCheck(const FieldDescriptor *field, const Options &options)
static Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor *field, const Options &options)
std::map< const SCC *, MessageAnalysis > analysis_cache_
const char kThinSeparator[]
VALUE enum_descriptor(VALUE self)
#define GOOGLE_LOG(LEVEL)
bool ShouldVerify(const Descriptor *descriptor, const Options &options, MessageSCCAnalyzer *scc_analyzer)
static const char descriptor[1336]
GRPC_CUSTOM_SERVICEDESCRIPTOR ServiceDescriptor
bool CanInitializeByZeroing(const FieldDescriptor *field)
std::string Int64ToString(const std::string ¯o_prefix, int64 number)
std::string QualifiedOneofCaseConstantName(const FieldDescriptor *field)
const Message * GetPrototype(const Descriptor *type) override
static constexpr OptimizeMode CODE_SIZE
const Descriptor::ReservedRange const EnumValueDescriptor method
static bool IsCordField(const FieldDescriptor *field, const Options &options)
bool MaybeBootstrap(const Options &options, GeneratorContext *generator_context, bool bootstrap_flag, std::string *basename)
void StrAppend(string *result, const AlphaNum &a)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:05