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_MESSAGE_FIELD_H__ 13 #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__ 14 15 #include <string> 16 17 #include "google/protobuf/compiler/java/full/field_generator.h" 18 #include "google/protobuf/descriptor.h" 19 #include "google/protobuf/io/printer.h" 20 21 namespace google { 22 namespace protobuf { 23 namespace compiler { 24 namespace java { 25 class Context; // context.h 26 class ClassNameResolver; // name_resolver.h 27 } // namespace java 28 } // namespace compiler 29 } // namespace protobuf 30 } // namespace google 31 32 namespace google { 33 namespace protobuf { 34 namespace compiler { 35 namespace java { 36 37 class ImmutableMessageFieldGenerator : public ImmutableFieldGenerator { 38 public: 39 explicit ImmutableMessageFieldGenerator(const FieldDescriptor* descriptor, 40 int messageBitIndex, 41 int builderBitIndex, 42 Context* context); 43 ImmutableMessageFieldGenerator(const ImmutableMessageFieldGenerator&) = 44 delete; 45 ImmutableMessageFieldGenerator& operator=( 46 const ImmutableMessageFieldGenerator&) = delete; 47 ~ImmutableMessageFieldGenerator() override; 48 49 // implements ImmutableFieldGenerator 50 // --------------------------------------- 51 int GetMessageBitIndex() const override; 52 int GetBuilderBitIndex() const override; 53 int GetNumBitsForMessage() const override; 54 int GetNumBitsForBuilder() const override; 55 void GenerateInterfaceMembers(io::Printer* printer) const override; 56 void GenerateMembers(io::Printer* printer) const override; 57 void GenerateBuilderMembers(io::Printer* printer) const override; 58 void GenerateInitializationCode(io::Printer* printer) const override; 59 void GenerateBuilderClearCode(io::Printer* printer) const override; 60 void GenerateMergingCode(io::Printer* printer) const override; 61 void GenerateBuildingCode(io::Printer* printer) const override; 62 void GenerateBuilderParsingCode(io::Printer* printer) const override; 63 void GenerateSerializationCode(io::Printer* printer) const override; 64 void GenerateSerializedSizeCode(io::Printer* printer) const override; 65 void GenerateFieldBuilderInitializationCode( 66 io::Printer* printer) const override; 67 void GenerateEqualsCode(io::Printer* printer) const override; 68 void GenerateHashCode(io::Printer* printer) const override; 69 void GenerateKotlinDslMembers(io::Printer* printer) const override; 70 71 std::string GetBoxedType() const override; 72 73 protected: 74 const FieldDescriptor* descriptor_; 75 int message_bit_index_; 76 int builder_bit_index_; 77 absl::flat_hash_map<absl::string_view, std::string> variables_; 78 ClassNameResolver* name_resolver_; 79 Context* context_; 80 81 virtual void PrintNestedBuilderCondition( 82 io::Printer* printer, const char* regular_case, 83 const char* nested_builder_case) const; 84 virtual void PrintNestedBuilderFunction( 85 io::Printer* printer, const char* method_prototype, 86 const char* regular_case, const char* nested_builder_case, 87 const char* trailing_code, 88 absl::optional<io::AnnotationCollector::Semantic> semantic = 89 absl::nullopt) const; 90 91 private: 92 void GenerateKotlinOrNull(io::Printer* printer) const; 93 }; 94 95 class ImmutableMessageOneofFieldGenerator 96 : public ImmutableMessageFieldGenerator { 97 public: 98 ImmutableMessageOneofFieldGenerator(const FieldDescriptor* descriptor, 99 int messageBitIndex, int builderBitIndex, 100 Context* context); 101 ImmutableMessageOneofFieldGenerator( 102 const ImmutableMessageOneofFieldGenerator&) = delete; 103 ImmutableMessageOneofFieldGenerator& operator=( 104 const ImmutableMessageOneofFieldGenerator&) = delete; 105 ~ImmutableMessageOneofFieldGenerator() override; 106 107 void GenerateMembers(io::Printer* printer) const override; 108 void GenerateBuilderMembers(io::Printer* printer) const override; 109 void GenerateBuilderClearCode(io::Printer* printer) const override; 110 void GenerateBuildingCode(io::Printer* printer) const override; 111 void GenerateMergingCode(io::Printer* printer) const override; 112 void GenerateBuilderParsingCode(io::Printer* printer) const override; 113 void GenerateSerializationCode(io::Printer* printer) const override; 114 void GenerateSerializedSizeCode(io::Printer* printer) const override; 115 }; 116 117 class RepeatedImmutableMessageFieldGenerator 118 : public ImmutableMessageFieldGenerator { 119 public: 120 explicit RepeatedImmutableMessageFieldGenerator( 121 const FieldDescriptor* descriptor, int messageBitIndex, 122 int builderBitIndex, Context* context); 123 RepeatedImmutableMessageFieldGenerator( 124 const RepeatedImmutableMessageFieldGenerator&) = delete; 125 RepeatedImmutableMessageFieldGenerator& operator=( 126 const RepeatedImmutableMessageFieldGenerator&) = delete; 127 ~RepeatedImmutableMessageFieldGenerator() override; 128 129 // implements ImmutableFieldGenerator --------------------------------------- 130 int GetNumBitsForMessage() const override; 131 int GetNumBitsForBuilder() const override; 132 void GenerateInterfaceMembers(io::Printer* printer) const override; 133 void GenerateMembers(io::Printer* printer) const override; 134 void GenerateBuilderMembers(io::Printer* printer) const override; 135 void GenerateInitializationCode(io::Printer* printer) const override; 136 void GenerateBuilderClearCode(io::Printer* printer) const override; 137 void GenerateMergingCode(io::Printer* printer) const override; 138 void GenerateBuildingCode(io::Printer* printer) const override; 139 void GenerateBuilderParsingCode(io::Printer* printer) const override; 140 void GenerateSerializationCode(io::Printer* printer) const override; 141 void GenerateSerializedSizeCode(io::Printer* printer) const override; 142 void GenerateFieldBuilderInitializationCode( 143 io::Printer* printer) const override; 144 void GenerateEqualsCode(io::Printer* printer) const override; 145 void GenerateHashCode(io::Printer* printer) const override; 146 void GenerateKotlinDslMembers(io::Printer* printer) const override; 147 148 std::string GetBoxedType() const override; 149 150 protected: 151 void PrintNestedBuilderCondition( 152 io::Printer* printer, const char* regular_case, 153 const char* nested_builder_case) const override; 154 void PrintNestedBuilderFunction( 155 io::Printer* printer, const char* method_prototype, 156 const char* regular_case, const char* nested_builder_case, 157 const char* trailing_code, 158 absl::optional<io::AnnotationCollector::Semantic> semantic = 159 absl::nullopt) const override; 160 }; 161 162 } // namespace java 163 } // namespace compiler 164 } // namespace protobuf 165 } // namespace google 166 167 #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__ 168