File indexing completed on 2025-01-31 10:11:58
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__
0013 #define GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__
0014
0015 #include <cstdint>
0016 #include <string>
0017
0018 #include "absl/strings/string_view.h"
0019 #include "google/protobuf/compiler/java/names.h"
0020 #include "google/protobuf/compiler/java/options.h"
0021 #include "google/protobuf/descriptor.h"
0022 #include "google/protobuf/descriptor.pb.h"
0023 #include "google/protobuf/io/printer.h"
0024
0025
0026 #include "google/protobuf/port_def.inc"
0027
0028 namespace google {
0029 namespace protobuf {
0030 namespace compiler {
0031 namespace java {
0032
0033
0034
0035 extern const char kThickSeparator[];
0036 extern const char kThinSeparator[];
0037
0038 bool IsForbiddenKotlin(absl::string_view field_name);
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 void PrintGeneratedAnnotation(io::Printer* printer, char delimiter = '$',
0049 absl::string_view annotation_file = "",
0050 Options options = {});
0051
0052
0053
0054 void PrintEnumVerifierLogic(
0055 io::Printer* printer, const FieldDescriptor* descriptor,
0056 const absl::flat_hash_map<absl::string_view, std::string>& variables,
0057 absl::string_view var_name, absl::string_view terminating_string,
0058 bool enforce_lite);
0059
0060
0061
0062 void PrintGencodeVersionValidator(io::Printer* printer, bool oss_runtime,
0063 absl::string_view java_class_name);
0064
0065
0066
0067 std::string ToCamelCase(absl::string_view input, bool lower_first);
0068
0069
0070
0071 std::string CamelCaseFieldName(const FieldDescriptor* field);
0072
0073
0074
0075
0076 std::string UniqueFileScopeIdentifier(const Descriptor* descriptor);
0077
0078
0079
0080
0081 std::string FileClassName(const FileDescriptor* file, bool immutable);
0082
0083
0084 std::string FileJavaPackage(const FileDescriptor* file, bool immutable,
0085 Options options = {});
0086
0087
0088 std::string JavaPackageToDir(std::string package_name);
0089
0090
0091 std::string EscapeKotlinKeywords(std::string name);
0092
0093
0094
0095 std::string ExtraMessageInterfaces(const Descriptor* descriptor);
0096
0097
0098
0099 std::string ExtraMutableMessageInterfaces(const Descriptor* descriptor);
0100
0101
0102 std::string ExtraBuilderInterfaces(const Descriptor* descriptor);
0103
0104
0105
0106 std::string ExtraMessageOrBuilderInterfaces(const Descriptor* descriptor);
0107
0108
0109
0110 inline std::string ShortMutableJavaClassName(const Descriptor* descriptor) {
0111 return std::string(descriptor->name());
0112 }
0113
0114
0115
0116
0117 inline bool IsDescriptorProto(const Descriptor* descriptor) {
0118 return descriptor->file()->name() == "net/proto2/proto/descriptor.proto" ||
0119 descriptor->file()->name() == "google/protobuf/descriptor.proto";
0120 }
0121
0122
0123
0124 std::string GetOneofStoredType(const FieldDescriptor* field);
0125
0126
0127
0128 enum class Proto1EnumRepresentation {
0129 kEnum,
0130 kInteger,
0131 };
0132
0133
0134 inline Proto1EnumRepresentation GetProto1EnumRepresentation(
0135 const EnumDescriptor* descriptor) {
0136 if (descriptor->containing_type() != nullptr) {
0137 return Proto1EnumRepresentation::kEnum;
0138 }
0139 return Proto1EnumRepresentation::kInteger;
0140 }
0141
0142
0143 inline bool MultipleJavaFiles(const FileDescriptor* descriptor,
0144 bool immutable) {
0145 (void)immutable;
0146 return descriptor->options().java_multiple_files();
0147 }
0148
0149
0150
0151
0152 template <typename Descriptor>
0153 bool IsOwnFile(const Descriptor* descriptor, bool immutable) {
0154 return descriptor->containing_type() == nullptr &&
0155 MultipleJavaFiles(descriptor->file(), immutable);
0156 }
0157
0158 template <>
0159 inline bool IsOwnFile(const ServiceDescriptor* descriptor, bool immutable) {
0160 return MultipleJavaFiles(descriptor->file(), immutable);
0161 }
0162
0163
0164
0165
0166
0167 template <typename Descriptor>
0168 std::string AnnotationFileName(const Descriptor* descriptor,
0169 absl::string_view suffix) {
0170 return absl::StrCat(descriptor->name(), suffix, ".java.pb.meta");
0171 }
0172
0173
0174
0175 std::string FieldConstantName(const FieldDescriptor* field);
0176
0177
0178
0179
0180 FieldDescriptor::Type GetType(const FieldDescriptor* field);
0181
0182 enum JavaType {
0183 JAVATYPE_INT,
0184 JAVATYPE_LONG,
0185 JAVATYPE_FLOAT,
0186 JAVATYPE_DOUBLE,
0187 JAVATYPE_BOOLEAN,
0188 JAVATYPE_STRING,
0189 JAVATYPE_BYTES,
0190 JAVATYPE_ENUM,
0191 JAVATYPE_MESSAGE
0192 };
0193
0194 JavaType GetJavaType(const FieldDescriptor* field);
0195
0196 absl::string_view PrimitiveTypeName(JavaType type);
0197
0198
0199
0200
0201 absl::string_view BoxedPrimitiveTypeName(JavaType type);
0202
0203
0204
0205 absl::string_view KotlinTypeName(JavaType type);
0206
0207
0208
0209
0210 absl::string_view FieldTypeName(const FieldDescriptor::Type field_type);
0211
0212 class ClassNameResolver;
0213 std::string DefaultValue(const FieldDescriptor* field, bool immutable,
0214 ClassNameResolver* name_resolver,
0215 Options options = {});
0216 inline std::string ImmutableDefaultValue(const FieldDescriptor* field,
0217 ClassNameResolver* name_resolver,
0218 Options options = {}) {
0219 return DefaultValue(field, true, name_resolver, options);
0220 }
0221 bool IsDefaultValueJavaDefault(const FieldDescriptor* field);
0222 bool IsByteStringWithCustomDefaultValue(const FieldDescriptor* field);
0223
0224
0225 inline bool HasDescriptorMethods(const Descriptor* ,
0226 bool enforce_lite) {
0227 return !enforce_lite;
0228 }
0229 inline bool HasDescriptorMethods(const EnumDescriptor* ,
0230 bool enforce_lite) {
0231 return !enforce_lite;
0232 }
0233 inline bool HasDescriptorMethods(const FileDescriptor* ,
0234 bool enforce_lite) {
0235 return !enforce_lite;
0236 }
0237
0238
0239 inline bool HasGenericServices(const FileDescriptor* file, bool enforce_lite) {
0240 return file->service_count() > 0 &&
0241 HasDescriptorMethods(file, enforce_lite) &&
0242 file->options().java_generic_services();
0243 }
0244
0245
0246
0247
0248 std::string GetBitFieldName(int index);
0249
0250
0251
0252 std::string GetBitFieldNameForBit(int bitIndex);
0253
0254
0255
0256
0257 std::string GenerateGetBit(int bitIndex);
0258
0259
0260
0261
0262 std::string GenerateSetBit(int bitIndex);
0263
0264
0265
0266
0267 std::string GenerateClearBit(int bitIndex);
0268
0269
0270
0271
0272
0273 std::string GenerateGetBitFromLocal(int bitIndex);
0274
0275
0276
0277
0278
0279 std::string GenerateSetBitToLocal(int bitIndex);
0280
0281
0282
0283
0284
0285 std::string GenerateGetBitMutableLocal(int bitIndex);
0286
0287
0288
0289
0290
0291 std::string GenerateSetBitMutableLocal(int bitIndex);
0292
0293
0294 bool IsReferenceType(JavaType type);
0295
0296
0297
0298 absl::string_view GetCapitalizedType(const FieldDescriptor* field,
0299 bool immutable, Options options);
0300
0301
0302
0303 int FixedSize(FieldDescriptor::Type type);
0304
0305
0306 struct FieldOrderingByNumber {
0307 inline bool operator()(const FieldDescriptor* a,
0308 const FieldDescriptor* b) const {
0309 return a->number() < b->number();
0310 }
0311 };
0312
0313 struct ExtensionRangeOrdering {
0314 bool operator()(const Descriptor::ExtensionRange* a,
0315 const Descriptor::ExtensionRange* b) const {
0316 return a->start_number() < b->start_number();
0317 }
0318 };
0319
0320
0321
0322 const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor);
0323
0324
0325 inline bool HasPackedFields(const Descriptor* descriptor) {
0326 for (int i = 0; i < descriptor->field_count(); i++) {
0327 if (descriptor->field(i)->is_packed()) {
0328 return true;
0329 }
0330 }
0331 return false;
0332 }
0333
0334
0335
0336 bool HasRequiredFields(const Descriptor* descriptor);
0337
0338 bool IsRealOneof(const FieldDescriptor* descriptor);
0339
0340 inline bool HasHasbit(const FieldDescriptor* descriptor) {
0341 return internal::cpp::HasHasbit(descriptor);
0342 }
0343
0344
0345 bool HasRepeatedFields(const Descriptor* descriptor);
0346
0347 inline bool IsMapEntry(const Descriptor* descriptor) {
0348 return descriptor->options().map_entry();
0349 }
0350
0351 inline bool IsMapField(const FieldDescriptor* descriptor) {
0352 return descriptor->is_map();
0353 }
0354
0355 inline bool IsAnyMessage(const Descriptor* descriptor) {
0356 return descriptor->full_name() == "google.protobuf.Any";
0357 }
0358
0359 inline bool IsWrappersProtoFile(const FileDescriptor* descriptor) {
0360 return descriptor->name() == "google/protobuf/wrappers.proto";
0361 }
0362
0363 void WriteUInt32ToUtf16CharSequence(uint32_t number,
0364 std::vector<uint16_t>* output);
0365
0366 inline void WriteIntToUtf16CharSequence(int value,
0367 std::vector<uint16_t>* output) {
0368 WriteUInt32ToUtf16CharSequence(static_cast<uint32_t>(value), output);
0369 }
0370
0371
0372 void EscapeUtf16ToString(uint16_t code, std::string* output);
0373
0374
0375
0376 std::pair<int, int> GetTableDrivenNumberOfEntriesAndLookUpStartFieldNumber(
0377 const FieldDescriptor** fields, int count);
0378
0379 const FieldDescriptor* MapKeyField(const FieldDescriptor* descriptor);
0380
0381 const FieldDescriptor* MapValueField(const FieldDescriptor* descriptor);
0382
0383 }
0384 }
0385 }
0386 }
0387
0388 #include "google/protobuf/port_undef.inc"
0389 #endif