1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file or at 6 // https://developers.google.com/open-source/licenses/bsd 7 8 // Author: kenton@google.com (Kenton Varda) 9 // Based on original Protocol Buffers design by 10 // Sanjay Ghemawat, Jeff Dean, and others. 11 12 #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ 13 #define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ 14 15 #include <string> 16 17 #include "absl/container/flat_hash_map.h" 18 #include "google/protobuf/compiler/java/full/field_generator.h" 19 #include "google/protobuf/descriptor.h" 20 #include "google/protobuf/io/printer.h" 21 22 namespace google { 23 namespace protobuf { 24 namespace compiler { 25 namespace java { 26 class Context; // context.h 27 class ClassNameResolver; // name_resolver.h 28 } // namespace java 29 } // namespace compiler 30 } // namespace protobuf 31 } // namespace google 32 33 namespace google { 34 namespace protobuf { 35 namespace compiler { 36 namespace java { 37 38 class ImmutableEnumFieldGenerator : public ImmutableFieldGenerator { 39 public: 40 explicit ImmutableEnumFieldGenerator(const FieldDescriptor* descriptor, 41 int messageBitIndex, int builderBitIndex, 42 Context* context); 43 ImmutableEnumFieldGenerator(const ImmutableEnumFieldGenerator&) = delete; 44 ImmutableEnumFieldGenerator& operator=(const ImmutableEnumFieldGenerator&) = 45 delete; 46 ~ImmutableEnumFieldGenerator() override; 47 48 // implements ImmutableFieldGenerator 49 // --------------------------------------- 50 int GetMessageBitIndex() const override; 51 int GetBuilderBitIndex() const override; 52 int GetNumBitsForMessage() const override; 53 int GetNumBitsForBuilder() const override; 54 void GenerateInterfaceMembers(io::Printer* printer) const override; 55 void GenerateMembers(io::Printer* printer) const override; 56 void GenerateBuilderMembers(io::Printer* printer) const override; 57 void GenerateInitializationCode(io::Printer* printer) const override; 58 void GenerateBuilderClearCode(io::Printer* printer) const override; 59 void GenerateBuilderParsingCode(io::Printer* printer) const override; 60 void GenerateMergingCode(io::Printer* printer) const override; 61 void GenerateBuildingCode(io::Printer* printer) const override; 62 void GenerateSerializationCode(io::Printer* printer) const override; 63 void GenerateSerializedSizeCode(io::Printer* printer) const override; 64 void GenerateFieldBuilderInitializationCode( 65 io::Printer* printer) const override; 66 void GenerateEqualsCode(io::Printer* printer) const override; 67 void GenerateHashCode(io::Printer* printer) const override; 68 void GenerateKotlinDslMembers(io::Printer* printer) const override; 69 70 std::string GetBoxedType() const override; 71 72 protected: 73 const FieldDescriptor* descriptor_; 74 int message_bit_index_; 75 int builder_bit_index_; 76 absl::flat_hash_map<absl::string_view, std::string> variables_; 77 Context* context_; 78 ClassNameResolver* name_resolver_; 79 }; 80 81 class ImmutableEnumOneofFieldGenerator : public ImmutableEnumFieldGenerator { 82 public: 83 ImmutableEnumOneofFieldGenerator(const FieldDescriptor* descriptor, 84 int messageBitIndex, int builderBitIndex, 85 Context* context); 86 ImmutableEnumOneofFieldGenerator(const ImmutableEnumOneofFieldGenerator&) = 87 delete; 88 ImmutableEnumOneofFieldGenerator& operator=( 89 const ImmutableEnumOneofFieldGenerator&) = delete; 90 ~ImmutableEnumOneofFieldGenerator() override; 91 92 void GenerateMembers(io::Printer* printer) const override; 93 void GenerateBuilderMembers(io::Printer* printer) const override; 94 void GenerateBuilderClearCode(io::Printer* printer) const override; 95 void GenerateMergingCode(io::Printer* printer) const override; 96 void GenerateBuildingCode(io::Printer* printer) const override; 97 void GenerateBuilderParsingCode(io::Printer* printer) const override; 98 void GenerateSerializationCode(io::Printer* printer) const override; 99 void GenerateSerializedSizeCode(io::Printer* printer) const override; 100 void GenerateEqualsCode(io::Printer* printer) const override; 101 void GenerateHashCode(io::Printer* printer) const override; 102 }; 103 104 class RepeatedImmutableEnumFieldGenerator : public ImmutableEnumFieldGenerator { 105 public: 106 explicit RepeatedImmutableEnumFieldGenerator( 107 const FieldDescriptor* descriptor, int messageBitIndex, 108 int builderBitIndex, Context* context); 109 RepeatedImmutableEnumFieldGenerator( 110 const RepeatedImmutableEnumFieldGenerator&) = delete; 111 RepeatedImmutableEnumFieldGenerator& operator=( 112 const RepeatedImmutableEnumFieldGenerator&) = delete; 113 ~RepeatedImmutableEnumFieldGenerator() override; 114 115 // implements ImmutableFieldGenerator --------------------------------------- 116 int GetNumBitsForMessage() const override; 117 int GetNumBitsForBuilder() const override; 118 void GenerateInterfaceMembers(io::Printer* printer) const override; 119 void GenerateMembers(io::Printer* printer) const override; 120 void GenerateBuilderMembers(io::Printer* printer) const override; 121 void GenerateInitializationCode(io::Printer* printer) const override; 122 void GenerateBuilderClearCode(io::Printer* printer) const override; 123 void GenerateMergingCode(io::Printer* printer) const override; 124 void GenerateBuildingCode(io::Printer* printer) const override; 125 void GenerateBuilderParsingCode(io::Printer* printer) const override; 126 void GenerateBuilderParsingCodeFromPacked( 127 io::Printer* printer) const override; 128 void GenerateSerializationCode(io::Printer* printer) const override; 129 void GenerateSerializedSizeCode(io::Printer* printer) const override; 130 void GenerateFieldBuilderInitializationCode( 131 io::Printer* printer) const override; 132 void GenerateEqualsCode(io::Printer* printer) const override; 133 void GenerateHashCode(io::Printer* printer) const override; 134 void GenerateKotlinDslMembers(io::Printer* printer) const override; 135 136 std::string GetBoxedType() const override; 137 }; 138 139 } // namespace java 140 } // namespace compiler 141 } // namespace protobuf 142 } // namespace google 143 144 #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ 145