java_field.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. // Author: kenton@google.com (Kenton Varda)
  31. // Based on original Protocol Buffers design by
  32. // Sanjay Ghemawat, Jeff Dean, and others.
  33. #include <google/protobuf/compiler/java/java_field.h>
  34. #include <memory>
  35. #include <google/protobuf/stubs/logging.h>
  36. #include <google/protobuf/stubs/common.h>
  37. #include <google/protobuf/compiler/java/java_context.h>
  38. #include <google/protobuf/compiler/java/java_enum_field.h>
  39. #include <google/protobuf/compiler/java/java_enum_field_lite.h>
  40. #include <google/protobuf/compiler/java/java_helpers.h>
  41. #include <google/protobuf/compiler/java/java_map_field.h>
  42. #include <google/protobuf/compiler/java/java_map_field_lite.h>
  43. #include <google/protobuf/compiler/java/java_message_field.h>
  44. #include <google/protobuf/compiler/java/java_message_field_lite.h>
  45. #include <google/protobuf/compiler/java/java_primitive_field.h>
  46. #include <google/protobuf/compiler/java/java_primitive_field_lite.h>
  47. #include <google/protobuf/compiler/java/java_string_field.h>
  48. #include <google/protobuf/compiler/java/java_string_field_lite.h>
  49. #include <google/protobuf/io/printer.h>
  50. #include <google/protobuf/stubs/strutil.h>
  51. #include <google/protobuf/stubs/substitute.h>
  52. namespace google {
  53. namespace protobuf {
  54. namespace compiler {
  55. namespace java {
  56. namespace {
  57. ImmutableFieldGenerator* MakeImmutableGenerator(
  58. const FieldDescriptor* field, int messageBitIndex, int builderBitIndex,
  59. Context* context) {
  60. if (field->is_repeated()) {
  61. switch (GetJavaType(field)) {
  62. case JAVATYPE_MESSAGE:
  63. if (IsMapEntry(field->message_type())) {
  64. return new ImmutableMapFieldGenerator(
  65. field, messageBitIndex, builderBitIndex, context);
  66. } else {
  67. return new RepeatedImmutableMessageFieldGenerator(
  68. field, messageBitIndex, builderBitIndex, context);
  69. }
  70. case JAVATYPE_ENUM:
  71. return new RepeatedImmutableEnumFieldGenerator(
  72. field, messageBitIndex, builderBitIndex, context);
  73. case JAVATYPE_STRING:
  74. return new RepeatedImmutableStringFieldGenerator(
  75. field, messageBitIndex, builderBitIndex, context);
  76. default:
  77. return new RepeatedImmutablePrimitiveFieldGenerator(
  78. field, messageBitIndex, builderBitIndex, context);
  79. }
  80. } else {
  81. if (field->containing_oneof()) {
  82. switch (GetJavaType(field)) {
  83. case JAVATYPE_MESSAGE:
  84. return new ImmutableMessageOneofFieldGenerator(
  85. field, messageBitIndex, builderBitIndex, context);
  86. case JAVATYPE_ENUM:
  87. return new ImmutableEnumOneofFieldGenerator(
  88. field, messageBitIndex, builderBitIndex, context);
  89. case JAVATYPE_STRING:
  90. return new ImmutableStringOneofFieldGenerator(
  91. field, messageBitIndex, builderBitIndex, context);
  92. default:
  93. return new ImmutablePrimitiveOneofFieldGenerator(
  94. field, messageBitIndex, builderBitIndex, context);
  95. }
  96. } else {
  97. switch (GetJavaType(field)) {
  98. case JAVATYPE_MESSAGE:
  99. return new ImmutableMessageFieldGenerator(
  100. field, messageBitIndex, builderBitIndex, context);
  101. case JAVATYPE_ENUM:
  102. return new ImmutableEnumFieldGenerator(
  103. field, messageBitIndex, builderBitIndex, context);
  104. case JAVATYPE_STRING:
  105. return new ImmutableStringFieldGenerator(
  106. field, messageBitIndex, builderBitIndex, context);
  107. default:
  108. return new ImmutablePrimitiveFieldGenerator(
  109. field, messageBitIndex, builderBitIndex, context);
  110. }
  111. }
  112. }
  113. }
  114. ImmutableFieldLiteGenerator* MakeImmutableLiteGenerator(
  115. const FieldDescriptor* field, int messageBitIndex, int builderBitIndex,
  116. Context* context) {
  117. if (field->is_repeated()) {
  118. switch (GetJavaType(field)) {
  119. case JAVATYPE_MESSAGE:
  120. if (IsMapEntry(field->message_type())) {
  121. return new ImmutableMapFieldLiteGenerator(
  122. field, messageBitIndex, builderBitIndex, context);
  123. } else {
  124. return new RepeatedImmutableMessageFieldLiteGenerator(
  125. field, messageBitIndex, builderBitIndex, context);
  126. }
  127. case JAVATYPE_ENUM:
  128. return new RepeatedImmutableEnumFieldLiteGenerator(
  129. field, messageBitIndex, builderBitIndex, context);
  130. case JAVATYPE_STRING:
  131. return new RepeatedImmutableStringFieldLiteGenerator(
  132. field, messageBitIndex, builderBitIndex, context);
  133. default:
  134. return new RepeatedImmutablePrimitiveFieldLiteGenerator(
  135. field, messageBitIndex, builderBitIndex, context);
  136. }
  137. } else {
  138. if (field->containing_oneof()) {
  139. switch (GetJavaType(field)) {
  140. case JAVATYPE_MESSAGE:
  141. return new ImmutableMessageOneofFieldLiteGenerator(
  142. field, messageBitIndex, builderBitIndex, context);
  143. case JAVATYPE_ENUM:
  144. return new ImmutableEnumOneofFieldLiteGenerator(
  145. field, messageBitIndex, builderBitIndex, context);
  146. case JAVATYPE_STRING:
  147. return new ImmutableStringOneofFieldLiteGenerator(
  148. field, messageBitIndex, builderBitIndex, context);
  149. default:
  150. return new ImmutablePrimitiveOneofFieldLiteGenerator(
  151. field, messageBitIndex, builderBitIndex, context);
  152. }
  153. } else {
  154. switch (GetJavaType(field)) {
  155. case JAVATYPE_MESSAGE:
  156. return new ImmutableMessageFieldLiteGenerator(
  157. field, messageBitIndex, builderBitIndex, context);
  158. case JAVATYPE_ENUM:
  159. return new ImmutableEnumFieldLiteGenerator(
  160. field, messageBitIndex, builderBitIndex, context);
  161. case JAVATYPE_STRING:
  162. return new ImmutableStringFieldLiteGenerator(
  163. field, messageBitIndex, builderBitIndex, context);
  164. default:
  165. return new ImmutablePrimitiveFieldLiteGenerator(
  166. field, messageBitIndex, builderBitIndex, context);
  167. }
  168. }
  169. }
  170. }
  171. static inline void ReportUnexpectedPackedFieldsCall(io::Printer* printer) {
  172. // Reaching here indicates a bug. Cases are:
  173. // - This FieldGenerator should support packing,
  174. // but this method should be overridden.
  175. // - This FieldGenerator doesn't support packing, and this method
  176. // should never have been called.
  177. GOOGLE_LOG(FATAL) << "GenerateParsingCodeFromPacked() "
  178. << "called on field generator that does not support packing.";
  179. }
  180. } // namespace
  181. ImmutableFieldGenerator::~ImmutableFieldGenerator() {}
  182. void ImmutableFieldGenerator::
  183. GenerateParsingCodeFromPacked(io::Printer* printer) const {
  184. ReportUnexpectedPackedFieldsCall(printer);
  185. }
  186. ImmutableFieldLiteGenerator::~ImmutableFieldLiteGenerator() {}
  187. void ImmutableFieldLiteGenerator::
  188. GenerateParsingCodeFromPacked(io::Printer* printer) const {
  189. ReportUnexpectedPackedFieldsCall(printer);
  190. }
  191. // ===================================================================
  192. template <>
  193. FieldGeneratorMap<ImmutableFieldGenerator>::FieldGeneratorMap(
  194. const Descriptor* descriptor, Context* context)
  195. : descriptor_(descriptor),
  196. field_generators_(descriptor->field_count()) {
  197. // Construct all the FieldGenerators and assign them bit indices for their
  198. // bit fields.
  199. int messageBitIndex = 0;
  200. int builderBitIndex = 0;
  201. for (int i = 0; i < descriptor->field_count(); i++) {
  202. ImmutableFieldGenerator* generator = MakeImmutableGenerator(
  203. descriptor->field(i), messageBitIndex, builderBitIndex, context);
  204. field_generators_[i].reset(generator);
  205. messageBitIndex += generator->GetNumBitsForMessage();
  206. builderBitIndex += generator->GetNumBitsForBuilder();
  207. }
  208. }
  209. template<>
  210. FieldGeneratorMap<ImmutableFieldGenerator>::~FieldGeneratorMap() {}
  211. template <>
  212. FieldGeneratorMap<ImmutableFieldLiteGenerator>::FieldGeneratorMap(
  213. const Descriptor* descriptor, Context* context)
  214. : descriptor_(descriptor),
  215. field_generators_(descriptor->field_count()) {
  216. // Construct all the FieldGenerators and assign them bit indices for their
  217. // bit fields.
  218. int messageBitIndex = 0;
  219. int builderBitIndex = 0;
  220. for (int i = 0; i < descriptor->field_count(); i++) {
  221. ImmutableFieldLiteGenerator* generator = MakeImmutableLiteGenerator(
  222. descriptor->field(i), messageBitIndex, builderBitIndex, context);
  223. field_generators_[i].reset(generator);
  224. messageBitIndex += generator->GetNumBitsForMessage();
  225. builderBitIndex += generator->GetNumBitsForBuilder();
  226. }
  227. }
  228. template<>
  229. FieldGeneratorMap<ImmutableFieldLiteGenerator>::~FieldGeneratorMap() {}
  230. void SetCommonFieldVariables(const FieldDescriptor* descriptor,
  231. const FieldGeneratorInfo* info,
  232. std::map<string, string>* variables) {
  233. (*variables)["field_name"] = descriptor->name();
  234. (*variables)["name"] = info->name;
  235. (*variables)["classname"] = descriptor->containing_type()->name();
  236. (*variables)["capitalized_name"] = info->capitalized_name;
  237. (*variables)["disambiguated_reason"] = info->disambiguated_reason;
  238. (*variables)["constant_name"] = FieldConstantName(descriptor);
  239. (*variables)["number"] = SimpleItoa(descriptor->number());
  240. // These variables are placeholders to pick out the beginning and ends of
  241. // identifiers for annotations (when doing so with existing variables would
  242. // be ambiguous or impossible). They should never be set to anything but the
  243. // empty string.
  244. (*variables)["{"] = "";
  245. (*variables)["}"] = "";
  246. }
  247. void SetCommonOneofVariables(const FieldDescriptor* descriptor,
  248. const OneofGeneratorInfo* info,
  249. std::map<string, string>* variables) {
  250. (*variables)["oneof_name"] = info->name;
  251. (*variables)["oneof_capitalized_name"] = info->capitalized_name;
  252. (*variables)["oneof_index"] =
  253. SimpleItoa(descriptor->containing_oneof()->index());
  254. (*variables)["set_oneof_case_message"] = info->name +
  255. "Case_ = " + SimpleItoa(descriptor->number());
  256. (*variables)["clear_oneof_case_message"] = info->name +
  257. "Case_ = 0";
  258. (*variables)["has_oneof_case_message"] = info->name +
  259. "Case_ == " + SimpleItoa(descriptor->number());
  260. }
  261. void PrintExtraFieldInfo(const std::map<string, string>& variables,
  262. io::Printer* printer) {
  263. const std::map<string, string>::const_iterator it =
  264. variables.find("disambiguated_reason");
  265. if (it != variables.end() && !it->second.empty()) {
  266. printer->Print(
  267. variables,
  268. "// An alternative name is used for field \"$field_name$\" because:\n"
  269. "// $disambiguated_reason$\n");
  270. }
  271. }
  272. } // namespace java
  273. } // namespace compiler
  274. } // namespace protobuf
  275. } // namespace google