java_message_field.cc 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329
  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 <map>
  34. #include <string>
  35. #include <google/protobuf/compiler/java/java_context.h>
  36. #include <google/protobuf/compiler/java/java_message_field.h>
  37. #include <google/protobuf/compiler/java/java_doc_comment.h>
  38. #include <google/protobuf/compiler/java/java_helpers.h>
  39. #include <google/protobuf/compiler/java/java_name_resolver.h>
  40. #include <google/protobuf/io/printer.h>
  41. #include <google/protobuf/wire_format.h>
  42. #include <google/protobuf/stubs/strutil.h>
  43. namespace google {
  44. namespace protobuf {
  45. namespace compiler {
  46. namespace java {
  47. namespace {
  48. void SetMessageVariables(const FieldDescriptor* descriptor,
  49. int messageBitIndex,
  50. int builderBitIndex,
  51. const FieldGeneratorInfo* info,
  52. ClassNameResolver* name_resolver,
  53. std::map<string, string>* variables) {
  54. SetCommonFieldVariables(descriptor, info, variables);
  55. (*variables)["type"] =
  56. name_resolver->GetImmutableClassName(descriptor->message_type());
  57. (*variables)["mutable_type"] =
  58. name_resolver->GetMutableClassName(descriptor->message_type());
  59. (*variables)["group_or_message"] =
  60. (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ?
  61. "Group" : "Message";
  62. // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
  63. // by the proto compiler
  64. (*variables)["deprecation"] = descriptor->options().deprecated()
  65. ? "@java.lang.Deprecated " : "";
  66. (*variables)["on_changed"] = "onChanged();";
  67. (*variables)["ver"] = GeneratedCodeVersionSuffix();
  68. (*variables)["get_parser"] =
  69. ExposePublicParser(descriptor->message_type()->file())
  70. ? "PARSER" : "parser()";
  71. if (SupportFieldPresence(descriptor->file())) {
  72. // For singular messages and builders, one bit is used for the hasField bit.
  73. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
  74. (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex);
  75. // Note that these have a trailing ";".
  76. (*variables)["set_has_field_bit_message"] =
  77. GenerateSetBit(messageBitIndex) + ";";
  78. (*variables)["set_has_field_bit_builder"] =
  79. GenerateSetBit(builderBitIndex) + ";";
  80. (*variables)["clear_has_field_bit_builder"] =
  81. GenerateClearBit(builderBitIndex) + ";";
  82. (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex);
  83. } else {
  84. (*variables)["set_has_field_bit_message"] = "";
  85. (*variables)["set_has_field_bit_builder"] = "";
  86. (*variables)["clear_has_field_bit_builder"] = "";
  87. (*variables)["is_field_present_message"] =
  88. (*variables)["name"] + "_ != null";
  89. }
  90. // For repated builders, one bit is used for whether the array is immutable.
  91. (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex);
  92. (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex);
  93. (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex);
  94. // For repeated fields, one bit is used for whether the array is immutable
  95. // in the parsing constructor.
  96. (*variables)["get_mutable_bit_parser"] =
  97. GenerateGetBitMutableLocal(builderBitIndex);
  98. (*variables)["set_mutable_bit_parser"] =
  99. GenerateSetBitMutableLocal(builderBitIndex);
  100. (*variables)["get_has_field_bit_from_local"] =
  101. GenerateGetBitFromLocal(builderBitIndex);
  102. (*variables)["set_has_field_bit_to_local"] =
  103. GenerateSetBitToLocal(messageBitIndex);
  104. }
  105. } // namespace
  106. // ===================================================================
  107. ImmutableMessageFieldGenerator::
  108. ImmutableMessageFieldGenerator(const FieldDescriptor* descriptor,
  109. int messageBitIndex,
  110. int builderBitIndex,
  111. Context* context)
  112. : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
  113. builderBitIndex_(builderBitIndex), context_(context),
  114. name_resolver_(context->GetNameResolver()) {
  115. SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
  116. context->GetFieldGeneratorInfo(descriptor),
  117. name_resolver_, &variables_);
  118. }
  119. ImmutableMessageFieldGenerator::~ImmutableMessageFieldGenerator() {}
  120. int ImmutableMessageFieldGenerator::GetNumBitsForMessage() const {
  121. return 1;
  122. }
  123. int ImmutableMessageFieldGenerator::GetNumBitsForBuilder() const {
  124. return 1;
  125. }
  126. void ImmutableMessageFieldGenerator::
  127. GenerateInterfaceMembers(io::Printer* printer) const {
  128. // TODO(jonp): In the future, consider having a method specific to the
  129. // interface so that builders can choose dynamically to either return a
  130. // message or a nested builder, so that asking for the interface doesn't
  131. // cause a message to ever be built.
  132. WriteFieldDocComment(printer, descriptor_);
  133. printer->Print(variables_,
  134. "$deprecation$boolean has$capitalized_name$();\n");
  135. WriteFieldDocComment(printer, descriptor_);
  136. printer->Print(variables_,
  137. "$deprecation$$type$ get$capitalized_name$();\n");
  138. WriteFieldDocComment(printer, descriptor_);
  139. printer->Print(variables_,
  140. "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n");
  141. }
  142. void ImmutableMessageFieldGenerator::
  143. GenerateMembers(io::Printer* printer) const {
  144. printer->Print(variables_,
  145. "private $type$ $name$_;\n");
  146. PrintExtraFieldInfo(variables_, printer);
  147. if (SupportFieldPresence(descriptor_->file())) {
  148. WriteFieldDocComment(printer, descriptor_);
  149. printer->Print(variables_,
  150. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  151. " return $get_has_field_bit_message$;\n"
  152. "}\n");
  153. printer->Annotate("{", "}", descriptor_);
  154. WriteFieldDocComment(printer, descriptor_);
  155. printer->Print(variables_,
  156. "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
  157. " return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
  158. "}\n");
  159. printer->Annotate("{", "}", descriptor_);
  160. WriteFieldDocComment(printer, descriptor_);
  161. printer->Print(variables_,
  162. "$deprecation$public $type$OrBuilder "
  163. "${$get$capitalized_name$OrBuilder$}$() {\n"
  164. " return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
  165. "}\n");
  166. printer->Annotate("{", "}", descriptor_);
  167. } else {
  168. WriteFieldDocComment(printer, descriptor_);
  169. printer->Print(variables_,
  170. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  171. " return $name$_ != null;\n"
  172. "}\n");
  173. printer->Annotate("{", "}", descriptor_);
  174. WriteFieldDocComment(printer, descriptor_);
  175. printer->Print(variables_,
  176. "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
  177. " return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
  178. "}\n");
  179. printer->Annotate("{", "}", descriptor_);
  180. WriteFieldDocComment(printer, descriptor_);
  181. printer->Print(variables_,
  182. "$deprecation$public $type$OrBuilder "
  183. "${$get$capitalized_name$OrBuilder$}$() {\n"
  184. " return get$capitalized_name$();\n"
  185. "}\n");
  186. printer->Annotate("{", "}", descriptor_);
  187. }
  188. }
  189. void ImmutableMessageFieldGenerator::PrintNestedBuilderCondition(
  190. io::Printer* printer,
  191. const char* regular_case,
  192. const char* nested_builder_case) const {
  193. printer->Print(variables_, "if ($name$Builder_ == null) {\n");
  194. printer->Indent();
  195. printer->Print(variables_, regular_case);
  196. printer->Outdent();
  197. printer->Print("} else {\n");
  198. printer->Indent();
  199. printer->Print(variables_, nested_builder_case);
  200. printer->Outdent();
  201. printer->Print("}\n");
  202. }
  203. void ImmutableMessageFieldGenerator::PrintNestedBuilderFunction(
  204. io::Printer* printer,
  205. const char* method_prototype,
  206. const char* regular_case,
  207. const char* nested_builder_case,
  208. const char* trailing_code) const {
  209. printer->Print(variables_, method_prototype);
  210. printer->Annotate("{", "}", descriptor_);
  211. printer->Print(" {\n");
  212. printer->Indent();
  213. PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
  214. if (trailing_code != NULL) {
  215. printer->Print(variables_, trailing_code);
  216. }
  217. printer->Outdent();
  218. printer->Print("}\n");
  219. }
  220. void ImmutableMessageFieldGenerator::
  221. GenerateBuilderMembers(io::Printer* printer) const {
  222. // When using nested-builders, the code initially works just like the
  223. // non-nested builder case. It only creates a nested builder lazily on
  224. // demand and then forever delegates to it after creation.
  225. bool support_field_presence = SupportFieldPresence(descriptor_->file());
  226. printer->Print(variables_,
  227. "private $type$ $name$_ = null;\n");
  228. printer->Print(variables_,
  229. // If this builder is non-null, it is used and the other fields are
  230. // ignored.
  231. "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
  232. " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
  233. "\n");
  234. // The comments above the methods below are based on a hypothetical
  235. // field of type "Field" called "Field".
  236. // boolean hasField()
  237. WriteFieldDocComment(printer, descriptor_);
  238. if (support_field_presence) {
  239. printer->Print(variables_,
  240. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  241. " return $get_has_field_bit_builder$;\n"
  242. "}\n");
  243. printer->Annotate("{", "}", descriptor_);
  244. } else {
  245. printer->Print(variables_,
  246. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  247. " return $name$Builder_ != null || $name$_ != null;\n"
  248. "}\n");
  249. printer->Annotate("{", "}", descriptor_);
  250. }
  251. // Field getField()
  252. WriteFieldDocComment(printer, descriptor_);
  253. PrintNestedBuilderFunction(printer,
  254. "$deprecation$public $type$ ${$get$capitalized_name$$}$()",
  255. "return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n",
  256. "return $name$Builder_.getMessage();\n",
  257. NULL);
  258. // Field.Builder setField(Field value)
  259. WriteFieldDocComment(printer, descriptor_);
  260. PrintNestedBuilderFunction(printer,
  261. "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)",
  262. "if (value == null) {\n"
  263. " throw new NullPointerException();\n"
  264. "}\n"
  265. "$name$_ = value;\n"
  266. "$on_changed$\n",
  267. "$name$Builder_.setMessage(value);\n",
  268. "$set_has_field_bit_builder$\n"
  269. "return this;\n");
  270. // Field.Builder setField(Field.Builder builderForValue)
  271. WriteFieldDocComment(printer, descriptor_);
  272. PrintNestedBuilderFunction(printer,
  273. "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
  274. " $type$.Builder builderForValue)",
  275. "$name$_ = builderForValue.build();\n"
  276. "$on_changed$\n",
  277. "$name$Builder_.setMessage(builderForValue.build());\n",
  278. "$set_has_field_bit_builder$\n"
  279. "return this;\n");
  280. // Field.Builder mergeField(Field value)
  281. WriteFieldDocComment(printer, descriptor_);
  282. PrintNestedBuilderFunction(printer,
  283. "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
  284. support_field_presence
  285. ? "if ($get_has_field_bit_builder$ &&\n"
  286. " $name$_ != null &&\n"
  287. " $name$_ != $type$.getDefaultInstance()) {\n"
  288. " $name$_ =\n"
  289. " $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
  290. "} else {\n"
  291. " $name$_ = value;\n"
  292. "}\n"
  293. "$on_changed$\n"
  294. : "if ($name$_ != null) {\n"
  295. " $name$_ =\n"
  296. " $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
  297. "} else {\n"
  298. " $name$_ = value;\n"
  299. "}\n"
  300. "$on_changed$\n",
  301. "$name$Builder_.mergeFrom(value);\n",
  302. "$set_has_field_bit_builder$\n"
  303. "return this;\n");
  304. // Field.Builder clearField()
  305. WriteFieldDocComment(printer, descriptor_);
  306. PrintNestedBuilderFunction(printer,
  307. "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
  308. "$name$_ = null;\n"
  309. "$on_changed$\n",
  310. support_field_presence
  311. ? "$name$Builder_.clear();\n"
  312. : "$name$_ = null;\n"
  313. "$name$Builder_ = null;\n",
  314. "$clear_has_field_bit_builder$\n"
  315. "return this;\n");
  316. WriteFieldDocComment(printer, descriptor_);
  317. printer->Print(variables_,
  318. "$deprecation$public $type$.Builder "
  319. "${$get$capitalized_name$Builder$}$() {\n"
  320. " $set_has_field_bit_builder$\n"
  321. " $on_changed$\n"
  322. " return get$capitalized_name$FieldBuilder().getBuilder();\n"
  323. "}\n");
  324. printer->Annotate("{", "}", descriptor_);
  325. WriteFieldDocComment(printer, descriptor_);
  326. printer->Print(variables_,
  327. "$deprecation$public $type$OrBuilder "
  328. "${$get$capitalized_name$OrBuilder$}$() {\n"
  329. " if ($name$Builder_ != null) {\n"
  330. " return $name$Builder_.getMessageOrBuilder();\n"
  331. " } else {\n"
  332. " return $name$_ == null ?\n"
  333. " $type$.getDefaultInstance() : $name$_;\n"
  334. " }\n"
  335. "}\n");
  336. printer->Annotate("{", "}", descriptor_);
  337. WriteFieldDocComment(printer, descriptor_);
  338. printer->Print(variables_,
  339. "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
  340. " $type$, $type$.Builder, $type$OrBuilder> \n"
  341. " get$capitalized_name$FieldBuilder() {\n"
  342. " if ($name$Builder_ == null) {\n"
  343. " $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n"
  344. " $type$, $type$.Builder, $type$OrBuilder>(\n"
  345. " get$capitalized_name$(),\n"
  346. " getParentForChildren(),\n"
  347. " isClean());\n"
  348. " $name$_ = null;\n"
  349. " }\n"
  350. " return $name$Builder_;\n"
  351. "}\n");
  352. }
  353. void ImmutableMessageFieldGenerator::
  354. GenerateFieldBuilderInitializationCode(io::Printer* printer) const {
  355. if (SupportFieldPresence(descriptor_->file())) {
  356. printer->Print(variables_,
  357. "get$capitalized_name$FieldBuilder();\n");
  358. }
  359. }
  360. void ImmutableMessageFieldGenerator::
  361. GenerateInitializationCode(io::Printer* printer) const {}
  362. void ImmutableMessageFieldGenerator::
  363. GenerateBuilderClearCode(io::Printer* printer) const {
  364. if (SupportFieldPresence(descriptor_->file())) {
  365. PrintNestedBuilderCondition(printer,
  366. "$name$_ = null;\n",
  367. "$name$Builder_.clear();\n");
  368. printer->Print(variables_, "$clear_has_field_bit_builder$\n");
  369. } else {
  370. PrintNestedBuilderCondition(printer,
  371. "$name$_ = null;\n",
  372. "$name$_ = null;\n"
  373. "$name$Builder_ = null;\n");
  374. }
  375. }
  376. void ImmutableMessageFieldGenerator::
  377. GenerateMergingCode(io::Printer* printer) const {
  378. printer->Print(variables_,
  379. "if (other.has$capitalized_name$()) {\n"
  380. " merge$capitalized_name$(other.get$capitalized_name$());\n"
  381. "}\n");
  382. }
  383. void ImmutableMessageFieldGenerator::
  384. GenerateBuildingCode(io::Printer* printer) const {
  385. if (SupportFieldPresence(descriptor_->file())) {
  386. printer->Print(variables_,
  387. "if ($get_has_field_bit_from_local$) {\n"
  388. " $set_has_field_bit_to_local$;\n"
  389. "}\n");
  390. }
  391. PrintNestedBuilderCondition(printer,
  392. "result.$name$_ = $name$_;\n",
  393. "result.$name$_ = $name$Builder_.build();\n");
  394. }
  395. void ImmutableMessageFieldGenerator::
  396. GenerateParsingCode(io::Printer* printer) const {
  397. printer->Print(variables_,
  398. "$type$.Builder subBuilder = null;\n"
  399. "if ($is_field_present_message$) {\n"
  400. " subBuilder = $name$_.toBuilder();\n"
  401. "}\n");
  402. if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
  403. printer->Print(variables_,
  404. "$name$_ = input.readGroup($number$, $type$.$get_parser$,\n"
  405. " extensionRegistry);\n");
  406. } else {
  407. printer->Print(variables_,
  408. "$name$_ = input.readMessage($type$.$get_parser$, extensionRegistry);\n");
  409. }
  410. printer->Print(variables_,
  411. "if (subBuilder != null) {\n"
  412. " subBuilder.mergeFrom($name$_);\n"
  413. " $name$_ = subBuilder.buildPartial();\n"
  414. "}\n"
  415. "$set_has_field_bit_message$\n");
  416. }
  417. void ImmutableMessageFieldGenerator::
  418. GenerateParsingDoneCode(io::Printer* printer) const {
  419. // noop for messages.
  420. }
  421. void ImmutableMessageFieldGenerator::
  422. GenerateSerializationCode(io::Printer* printer) const {
  423. printer->Print(variables_,
  424. "if ($is_field_present_message$) {\n"
  425. " output.write$group_or_message$($number$, get$capitalized_name$());\n"
  426. "}\n");
  427. }
  428. void ImmutableMessageFieldGenerator::
  429. GenerateSerializedSizeCode(io::Printer* printer) const {
  430. printer->Print(variables_,
  431. "if ($is_field_present_message$) {\n"
  432. " size += com.google.protobuf.CodedOutputStream\n"
  433. " .compute$group_or_message$Size($number$, get$capitalized_name$());\n"
  434. "}\n");
  435. }
  436. void ImmutableMessageFieldGenerator::
  437. GenerateEqualsCode(io::Printer* printer) const {
  438. printer->Print(variables_,
  439. "result = result && get$capitalized_name$()\n"
  440. " .equals(other.get$capitalized_name$());\n");
  441. }
  442. void ImmutableMessageFieldGenerator::
  443. GenerateHashCode(io::Printer* printer) const {
  444. printer->Print(variables_,
  445. "hash = (37 * hash) + $constant_name$;\n"
  446. "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
  447. }
  448. string ImmutableMessageFieldGenerator::GetBoxedType() const {
  449. return name_resolver_->GetImmutableClassName(descriptor_->message_type());
  450. }
  451. // ===================================================================
  452. ImmutableMessageOneofFieldGenerator::
  453. ImmutableMessageOneofFieldGenerator(const FieldDescriptor* descriptor,
  454. int messageBitIndex,
  455. int builderBitIndex,
  456. Context* context)
  457. : ImmutableMessageFieldGenerator(
  458. descriptor, messageBitIndex, builderBitIndex, context) {
  459. const OneofGeneratorInfo* info =
  460. context->GetOneofGeneratorInfo(descriptor->containing_oneof());
  461. SetCommonOneofVariables(descriptor, info, &variables_);
  462. }
  463. ImmutableMessageOneofFieldGenerator::
  464. ~ImmutableMessageOneofFieldGenerator() {}
  465. void ImmutableMessageOneofFieldGenerator::
  466. GenerateMembers(io::Printer* printer) const {
  467. PrintExtraFieldInfo(variables_, printer);
  468. WriteFieldDocComment(printer, descriptor_);
  469. printer->Print(variables_,
  470. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  471. " return $has_oneof_case_message$;\n"
  472. "}\n");
  473. printer->Annotate("{", "}", descriptor_);
  474. WriteFieldDocComment(printer, descriptor_);
  475. printer->Print(variables_,
  476. "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
  477. " if ($has_oneof_case_message$) {\n"
  478. " return ($type$) $oneof_name$_;\n"
  479. " }\n"
  480. " return $type$.getDefaultInstance();\n"
  481. "}\n");
  482. printer->Annotate("{", "}", descriptor_);
  483. WriteFieldDocComment(printer, descriptor_);
  484. printer->Print(variables_,
  485. "$deprecation$public $type$OrBuilder "
  486. "${$get$capitalized_name$OrBuilder$}$() {\n"
  487. " if ($has_oneof_case_message$) {\n"
  488. " return ($type$) $oneof_name$_;\n"
  489. " }\n"
  490. " return $type$.getDefaultInstance();\n"
  491. "}\n");
  492. printer->Annotate("{", "}", descriptor_);
  493. }
  494. void ImmutableMessageOneofFieldGenerator::
  495. GenerateBuilderMembers(io::Printer* printer) const {
  496. // When using nested-builders, the code initially works just like the
  497. // non-nested builder case. It only creates a nested builder lazily on
  498. // demand and then forever delegates to it after creation.
  499. printer->Print(variables_,
  500. // If this builder is non-null, it is used and the other fields are
  501. // ignored.
  502. "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
  503. " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
  504. "\n");
  505. // The comments above the methods below are based on a hypothetical
  506. // field of type "Field" called "Field".
  507. // boolean hasField()
  508. WriteFieldDocComment(printer, descriptor_);
  509. printer->Print(variables_,
  510. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  511. " return $has_oneof_case_message$;\n"
  512. "}\n");
  513. printer->Annotate("{", "}", descriptor_);
  514. // Field getField()
  515. WriteFieldDocComment(printer, descriptor_);
  516. PrintNestedBuilderFunction(printer,
  517. "$deprecation$public $type$ ${$get$capitalized_name$$}$()",
  518. "if ($has_oneof_case_message$) {\n"
  519. " return ($type$) $oneof_name$_;\n"
  520. "}\n"
  521. "return $type$.getDefaultInstance();\n",
  522. "if ($has_oneof_case_message$) {\n"
  523. " return $name$Builder_.getMessage();\n"
  524. "}\n"
  525. "return $type$.getDefaultInstance();\n",
  526. NULL);
  527. // Field.Builder setField(Field value)
  528. WriteFieldDocComment(printer, descriptor_);
  529. PrintNestedBuilderFunction(printer,
  530. "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)",
  531. "if (value == null) {\n"
  532. " throw new NullPointerException();\n"
  533. "}\n"
  534. "$oneof_name$_ = value;\n"
  535. "$on_changed$\n",
  536. "$name$Builder_.setMessage(value);\n",
  537. "$set_oneof_case_message$;\n"
  538. "return this;\n");
  539. // Field.Builder setField(Field.Builder builderForValue)
  540. WriteFieldDocComment(printer, descriptor_);
  541. PrintNestedBuilderFunction(printer,
  542. "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
  543. " $type$.Builder builderForValue)",
  544. "$oneof_name$_ = builderForValue.build();\n"
  545. "$on_changed$\n",
  546. "$name$Builder_.setMessage(builderForValue.build());\n",
  547. "$set_oneof_case_message$;\n"
  548. "return this;\n");
  549. // Field.Builder mergeField(Field value)
  550. WriteFieldDocComment(printer, descriptor_);
  551. PrintNestedBuilderFunction(printer,
  552. "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
  553. "if ($has_oneof_case_message$ &&\n"
  554. " $oneof_name$_ != $type$.getDefaultInstance()) {\n"
  555. " $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n"
  556. " .mergeFrom(value).buildPartial();\n"
  557. "} else {\n"
  558. " $oneof_name$_ = value;\n"
  559. "}\n"
  560. "$on_changed$\n",
  561. "if ($has_oneof_case_message$) {\n"
  562. " $name$Builder_.mergeFrom(value);\n"
  563. "}\n"
  564. "$name$Builder_.setMessage(value);\n",
  565. "$set_oneof_case_message$;\n"
  566. "return this;\n");
  567. // Field.Builder clearField()
  568. WriteFieldDocComment(printer, descriptor_);
  569. PrintNestedBuilderFunction(printer,
  570. "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
  571. "if ($has_oneof_case_message$) {\n"
  572. " $clear_oneof_case_message$;\n"
  573. " $oneof_name$_ = null;\n"
  574. " $on_changed$\n"
  575. "}\n",
  576. "if ($has_oneof_case_message$) {\n"
  577. " $clear_oneof_case_message$;\n"
  578. " $oneof_name$_ = null;\n"
  579. "}\n"
  580. "$name$Builder_.clear();\n",
  581. "return this;\n");
  582. WriteFieldDocComment(printer, descriptor_);
  583. printer->Print(variables_,
  584. "$deprecation$public $type$.Builder "
  585. "${$get$capitalized_name$Builder$}$() {\n"
  586. " return get$capitalized_name$FieldBuilder().getBuilder();\n"
  587. "}\n");
  588. printer->Annotate("{", "}", descriptor_);
  589. WriteFieldDocComment(printer, descriptor_);
  590. printer->Print(variables_,
  591. "$deprecation$public $type$OrBuilder "
  592. "${$get$capitalized_name$OrBuilder$}$() {\n"
  593. " if (($has_oneof_case_message$) && ($name$Builder_ != null)) {\n"
  594. " return $name$Builder_.getMessageOrBuilder();\n"
  595. " } else {\n"
  596. " if ($has_oneof_case_message$) {\n"
  597. " return ($type$) $oneof_name$_;\n"
  598. " }\n"
  599. " return $type$.getDefaultInstance();\n"
  600. " }\n"
  601. "}\n");
  602. printer->Annotate("{", "}", descriptor_);
  603. WriteFieldDocComment(printer, descriptor_);
  604. printer->Print(variables_,
  605. "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
  606. " $type$, $type$.Builder, $type$OrBuilder> \n"
  607. " ${$get$capitalized_name$FieldBuilder$}$() {\n"
  608. " if ($name$Builder_ == null) {\n"
  609. " if (!($has_oneof_case_message$)) {\n"
  610. " $oneof_name$_ = $type$.getDefaultInstance();\n"
  611. " }\n"
  612. " $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n"
  613. " $type$, $type$.Builder, $type$OrBuilder>(\n"
  614. " ($type$) $oneof_name$_,\n"
  615. " getParentForChildren(),\n"
  616. " isClean());\n"
  617. " $oneof_name$_ = null;\n"
  618. " }\n"
  619. " $set_oneof_case_message$;\n"
  620. " $on_changed$;\n"
  621. " return $name$Builder_;\n"
  622. "}\n");
  623. printer->Annotate("{", "}", descriptor_);
  624. }
  625. void ImmutableMessageOneofFieldGenerator::
  626. GenerateBuildingCode(io::Printer* printer) const {
  627. printer->Print(variables_,
  628. "if ($has_oneof_case_message$) {\n");
  629. printer->Indent();
  630. PrintNestedBuilderCondition(printer,
  631. "result.$oneof_name$_ = $oneof_name$_;\n",
  632. "result.$oneof_name$_ = $name$Builder_.build();\n");
  633. printer->Outdent();
  634. printer->Print("}\n");
  635. }
  636. void ImmutableMessageOneofFieldGenerator::
  637. GenerateMergingCode(io::Printer* printer) const {
  638. printer->Print(variables_,
  639. "merge$capitalized_name$(other.get$capitalized_name$());\n");
  640. }
  641. void ImmutableMessageOneofFieldGenerator::
  642. GenerateParsingCode(io::Printer* printer) const {
  643. printer->Print(variables_,
  644. "$type$.Builder subBuilder = null;\n"
  645. "if ($has_oneof_case_message$) {\n"
  646. " subBuilder = (($type$) $oneof_name$_).toBuilder();\n"
  647. "}\n");
  648. if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
  649. printer->Print(variables_,
  650. "$oneof_name$_ = input.readGroup($number$, $type$.$get_parser$,\n"
  651. " extensionRegistry);\n");
  652. } else {
  653. printer->Print(variables_,
  654. "$oneof_name$_ =\n"
  655. " input.readMessage($type$.$get_parser$, extensionRegistry);\n");
  656. }
  657. printer->Print(variables_,
  658. "if (subBuilder != null) {\n"
  659. " subBuilder.mergeFrom(($type$) $oneof_name$_);\n"
  660. " $oneof_name$_ = subBuilder.buildPartial();\n"
  661. "}\n");
  662. printer->Print(variables_,
  663. "$set_oneof_case_message$;\n");
  664. }
  665. void ImmutableMessageOneofFieldGenerator::
  666. GenerateSerializationCode(io::Printer* printer) const {
  667. printer->Print(variables_,
  668. "if ($has_oneof_case_message$) {\n"
  669. " output.write$group_or_message$($number$, ($type$) $oneof_name$_);\n"
  670. "}\n");
  671. }
  672. void ImmutableMessageOneofFieldGenerator::
  673. GenerateSerializedSizeCode(io::Printer* printer) const {
  674. printer->Print(variables_,
  675. "if ($has_oneof_case_message$) {\n"
  676. " size += com.google.protobuf.CodedOutputStream\n"
  677. " .compute$group_or_message$Size($number$, ($type$) $oneof_name$_);\n"
  678. "}\n");
  679. }
  680. // ===================================================================
  681. RepeatedImmutableMessageFieldGenerator::
  682. RepeatedImmutableMessageFieldGenerator(const FieldDescriptor* descriptor,
  683. int messageBitIndex,
  684. int builderBitIndex,
  685. Context* context)
  686. : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
  687. builderBitIndex_(builderBitIndex), context_(context),
  688. name_resolver_(context->GetNameResolver()) {
  689. SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
  690. context->GetFieldGeneratorInfo(descriptor),
  691. name_resolver_, &variables_);
  692. }
  693. RepeatedImmutableMessageFieldGenerator::
  694. ~RepeatedImmutableMessageFieldGenerator() {}
  695. int RepeatedImmutableMessageFieldGenerator::GetNumBitsForMessage() const {
  696. return 0;
  697. }
  698. int RepeatedImmutableMessageFieldGenerator::GetNumBitsForBuilder() const {
  699. return 1;
  700. }
  701. void RepeatedImmutableMessageFieldGenerator::
  702. GenerateInterfaceMembers(io::Printer* printer) const {
  703. // TODO(jonp): In the future, consider having methods specific to the
  704. // interface so that builders can choose dynamically to either return a
  705. // message or a nested builder, so that asking for the interface doesn't
  706. // cause a message to ever be built.
  707. WriteFieldDocComment(printer, descriptor_);
  708. printer->Print(variables_,
  709. "$deprecation$java.util.List<$type$> \n"
  710. " get$capitalized_name$List();\n");
  711. WriteFieldDocComment(printer, descriptor_);
  712. printer->Print(variables_,
  713. "$deprecation$$type$ get$capitalized_name$(int index);\n");
  714. WriteFieldDocComment(printer, descriptor_);
  715. printer->Print(variables_,
  716. "$deprecation$int get$capitalized_name$Count();\n");
  717. WriteFieldDocComment(printer, descriptor_);
  718. printer->Print(variables_,
  719. "$deprecation$java.util.List<? extends $type$OrBuilder> \n"
  720. " get$capitalized_name$OrBuilderList();\n");
  721. WriteFieldDocComment(printer, descriptor_);
  722. printer->Print(variables_,
  723. "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n"
  724. " int index);\n");
  725. }
  726. void RepeatedImmutableMessageFieldGenerator::
  727. GenerateMembers(io::Printer* printer) const {
  728. printer->Print(variables_,
  729. "private java.util.List<$type$> $name$_;\n");
  730. PrintExtraFieldInfo(variables_, printer);
  731. WriteFieldDocComment(printer, descriptor_);
  732. printer->Print(variables_,
  733. "$deprecation$public java.util.List<$type$> "
  734. "${$get$capitalized_name$List$}$() {\n"
  735. " return $name$_;\n" // note: unmodifiable list
  736. "}\n");
  737. printer->Annotate("{", "}", descriptor_);
  738. WriteFieldDocComment(printer, descriptor_);
  739. printer->Print(variables_,
  740. "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
  741. " ${$get$capitalized_name$OrBuilderList$}$() {\n"
  742. " return $name$_;\n"
  743. "}\n");
  744. printer->Annotate("{", "}", descriptor_);
  745. WriteFieldDocComment(printer, descriptor_);
  746. printer->Print(variables_,
  747. "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
  748. " return $name$_.size();\n"
  749. "}\n");
  750. printer->Annotate("{", "}", descriptor_);
  751. WriteFieldDocComment(printer, descriptor_);
  752. printer->Print(variables_,
  753. "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
  754. " return $name$_.get(index);\n"
  755. "}\n");
  756. printer->Annotate("{", "}", descriptor_);
  757. WriteFieldDocComment(printer, descriptor_);
  758. printer->Print(variables_,
  759. "$deprecation$public $type$OrBuilder "
  760. "${$get$capitalized_name$OrBuilder$}$(\n"
  761. " int index) {\n"
  762. " return $name$_.get(index);\n"
  763. "}\n");
  764. printer->Annotate("{", "}", descriptor_);
  765. }
  766. void RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderCondition(
  767. io::Printer* printer,
  768. const char* regular_case,
  769. const char* nested_builder_case) const {
  770. printer->Print(variables_, "if ($name$Builder_ == null) {\n");
  771. printer->Indent();
  772. printer->Print(variables_, regular_case);
  773. printer->Outdent();
  774. printer->Print("} else {\n");
  775. printer->Indent();
  776. printer->Print(variables_, nested_builder_case);
  777. printer->Outdent();
  778. printer->Print("}\n");
  779. }
  780. void RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderFunction(
  781. io::Printer* printer,
  782. const char* method_prototype,
  783. const char* regular_case,
  784. const char* nested_builder_case,
  785. const char* trailing_code) const {
  786. printer->Print(variables_, method_prototype);
  787. printer->Annotate("{", "}", descriptor_);
  788. printer->Print(" {\n");
  789. printer->Indent();
  790. PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
  791. if (trailing_code != NULL) {
  792. printer->Print(variables_, trailing_code);
  793. }
  794. printer->Outdent();
  795. printer->Print("}\n");
  796. }
  797. void RepeatedImmutableMessageFieldGenerator::
  798. GenerateBuilderMembers(io::Printer* printer) const {
  799. // When using nested-builders, the code initially works just like the
  800. // non-nested builder case. It only creates a nested builder lazily on
  801. // demand and then forever delegates to it after creation.
  802. printer->Print(variables_,
  803. // Used when the builder is null.
  804. // One field is the list and the other field keeps track of whether the
  805. // list is immutable. If it's immutable, the invariant is that it must
  806. // either an instance of Collections.emptyList() or it's an ArrayList
  807. // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
  808. // a refererence to the underlying ArrayList. This invariant allows us to
  809. // share instances of lists between protocol buffers avoiding expensive
  810. // memory allocations. Note, immutable is a strong guarantee here -- not
  811. // just that the list cannot be modified via the reference but that the
  812. // list can never be modified.
  813. "private java.util.List<$type$> $name$_ =\n"
  814. " java.util.Collections.emptyList();\n"
  815. "private void ensure$capitalized_name$IsMutable() {\n"
  816. " if (!$get_mutable_bit_builder$) {\n"
  817. " $name$_ = new java.util.ArrayList<$type$>($name$_);\n"
  818. " $set_mutable_bit_builder$;\n"
  819. " }\n"
  820. "}\n"
  821. "\n");
  822. printer->Print(variables_,
  823. // If this builder is non-null, it is used and the other fields are
  824. // ignored.
  825. "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
  826. " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
  827. "\n");
  828. // The comments above the methods below are based on a hypothetical
  829. // repeated field of type "Field" called "RepeatedField".
  830. // List<Field> getRepeatedFieldList()
  831. WriteFieldDocComment(printer, descriptor_);
  832. PrintNestedBuilderFunction(printer,
  833. "$deprecation$public java.util.List<$type$> "
  834. "${$get$capitalized_name$List$}$()",
  835. "return java.util.Collections.unmodifiableList($name$_);\n",
  836. "return $name$Builder_.getMessageList();\n",
  837. NULL);
  838. // int getRepeatedFieldCount()
  839. WriteFieldDocComment(printer, descriptor_);
  840. PrintNestedBuilderFunction(printer,
  841. "$deprecation$public int ${$get$capitalized_name$Count$}$()",
  842. "return $name$_.size();\n",
  843. "return $name$Builder_.getCount();\n",
  844. NULL);
  845. // Field getRepeatedField(int index)
  846. WriteFieldDocComment(printer, descriptor_);
  847. PrintNestedBuilderFunction(printer,
  848. "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index)",
  849. "return $name$_.get(index);\n",
  850. "return $name$Builder_.getMessage(index);\n",
  851. NULL);
  852. // Builder setRepeatedField(int index, Field value)
  853. WriteFieldDocComment(printer, descriptor_);
  854. PrintNestedBuilderFunction(printer,
  855. "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
  856. " int index, $type$ value)",
  857. "if (value == null) {\n"
  858. " throw new NullPointerException();\n"
  859. "}\n"
  860. "ensure$capitalized_name$IsMutable();\n"
  861. "$name$_.set(index, value);\n"
  862. "$on_changed$\n",
  863. "$name$Builder_.setMessage(index, value);\n",
  864. "return this;\n");
  865. // Builder setRepeatedField(int index, Field.Builder builderForValue)
  866. WriteFieldDocComment(printer, descriptor_);
  867. PrintNestedBuilderFunction(printer,
  868. "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
  869. " int index, $type$.Builder builderForValue)",
  870. "ensure$capitalized_name$IsMutable();\n"
  871. "$name$_.set(index, builderForValue.build());\n"
  872. "$on_changed$\n",
  873. "$name$Builder_.setMessage(index, builderForValue.build());\n",
  874. "return this;\n");
  875. // Builder addRepeatedField(Field value)
  876. WriteFieldDocComment(printer, descriptor_);
  877. PrintNestedBuilderFunction(printer,
  878. "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value)",
  879. "if (value == null) {\n"
  880. " throw new NullPointerException();\n"
  881. "}\n"
  882. "ensure$capitalized_name$IsMutable();\n"
  883. "$name$_.add(value);\n"
  884. "$on_changed$\n",
  885. "$name$Builder_.addMessage(value);\n",
  886. "return this;\n");
  887. // Builder addRepeatedField(int index, Field value)
  888. WriteFieldDocComment(printer, descriptor_);
  889. PrintNestedBuilderFunction(printer,
  890. "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
  891. " int index, $type$ value)",
  892. "if (value == null) {\n"
  893. " throw new NullPointerException();\n"
  894. "}\n"
  895. "ensure$capitalized_name$IsMutable();\n"
  896. "$name$_.add(index, value);\n"
  897. "$on_changed$\n",
  898. "$name$Builder_.addMessage(index, value);\n",
  899. "return this;\n");
  900. // Builder addRepeatedField(Field.Builder builderForValue)
  901. WriteFieldDocComment(printer, descriptor_);
  902. PrintNestedBuilderFunction(printer,
  903. "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
  904. " $type$.Builder builderForValue)",
  905. "ensure$capitalized_name$IsMutable();\n"
  906. "$name$_.add(builderForValue.build());\n"
  907. "$on_changed$\n",
  908. "$name$Builder_.addMessage(builderForValue.build());\n",
  909. "return this;\n");
  910. // Builder addRepeatedField(int index, Field.Builder builderForValue)
  911. WriteFieldDocComment(printer, descriptor_);
  912. PrintNestedBuilderFunction(printer,
  913. "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
  914. " int index, $type$.Builder builderForValue)",
  915. "ensure$capitalized_name$IsMutable();\n"
  916. "$name$_.add(index, builderForValue.build());\n"
  917. "$on_changed$\n",
  918. "$name$Builder_.addMessage(index, builderForValue.build());\n",
  919. "return this;\n");
  920. // Builder addAllRepeatedField(Iterable<Field> values)
  921. WriteFieldDocComment(printer, descriptor_);
  922. PrintNestedBuilderFunction(printer,
  923. "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
  924. " java.lang.Iterable<? extends $type$> values)",
  925. "ensure$capitalized_name$IsMutable();\n"
  926. "com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
  927. " values, $name$_);\n"
  928. "$on_changed$\n",
  929. "$name$Builder_.addAllMessages(values);\n",
  930. "return this;\n");
  931. // Builder clearAllRepeatedField()
  932. WriteFieldDocComment(printer, descriptor_);
  933. PrintNestedBuilderFunction(printer,
  934. "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
  935. "$name$_ = java.util.Collections.emptyList();\n"
  936. "$clear_mutable_bit_builder$;\n"
  937. "$on_changed$\n",
  938. "$name$Builder_.clear();\n",
  939. "return this;\n");
  940. // Builder removeRepeatedField(int index)
  941. WriteFieldDocComment(printer, descriptor_);
  942. PrintNestedBuilderFunction(printer,
  943. "$deprecation$public Builder ${$remove$capitalized_name$$}$(int index)",
  944. "ensure$capitalized_name$IsMutable();\n"
  945. "$name$_.remove(index);\n"
  946. "$on_changed$\n",
  947. "$name$Builder_.remove(index);\n",
  948. "return this;\n");
  949. WriteFieldDocComment(printer, descriptor_);
  950. printer->Print(variables_,
  951. "$deprecation$public $type$.Builder ${$get$capitalized_name$Builder$}$(\n"
  952. " int index) {\n"
  953. " return get$capitalized_name$FieldBuilder().getBuilder(index);\n"
  954. "}\n");
  955. printer->Annotate("{", "}", descriptor_);
  956. WriteFieldDocComment(printer, descriptor_);
  957. printer->Print(variables_,
  958. "$deprecation$public $type$OrBuilder "
  959. "${$get$capitalized_name$OrBuilder$}$(\n"
  960. " int index) {\n"
  961. " if ($name$Builder_ == null) {\n"
  962. " return $name$_.get(index);"
  963. " } else {\n"
  964. " return $name$Builder_.getMessageOrBuilder(index);\n"
  965. " }\n"
  966. "}\n");
  967. printer->Annotate("{", "}", descriptor_);
  968. WriteFieldDocComment(printer, descriptor_);
  969. printer->Print(variables_,
  970. "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
  971. " ${$get$capitalized_name$OrBuilderList$}$() {\n"
  972. " if ($name$Builder_ != null) {\n"
  973. " return $name$Builder_.getMessageOrBuilderList();\n"
  974. " } else {\n"
  975. " return java.util.Collections.unmodifiableList($name$_);\n"
  976. " }\n"
  977. "}\n");
  978. printer->Annotate("{", "}", descriptor_);
  979. WriteFieldDocComment(printer, descriptor_);
  980. printer->Print(variables_,
  981. "$deprecation$public $type$.Builder "
  982. "${$add$capitalized_name$Builder$}$() {\n"
  983. " return get$capitalized_name$FieldBuilder().addBuilder(\n"
  984. " $type$.getDefaultInstance());\n"
  985. "}\n");
  986. printer->Annotate("{", "}", descriptor_);
  987. WriteFieldDocComment(printer, descriptor_);
  988. printer->Print(variables_,
  989. "$deprecation$public $type$.Builder ${$add$capitalized_name$Builder$}$(\n"
  990. " int index) {\n"
  991. " return get$capitalized_name$FieldBuilder().addBuilder(\n"
  992. " index, $type$.getDefaultInstance());\n"
  993. "}\n");
  994. printer->Annotate("{", "}", descriptor_);
  995. WriteFieldDocComment(printer, descriptor_);
  996. printer->Print(variables_,
  997. "$deprecation$public java.util.List<$type$.Builder> \n"
  998. " ${$get$capitalized_name$BuilderList$}$() {\n"
  999. " return get$capitalized_name$FieldBuilder().getBuilderList();\n"
  1000. "}\n"
  1001. "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
  1002. " $type$, $type$.Builder, $type$OrBuilder> \n"
  1003. " get$capitalized_name$FieldBuilder() {\n"
  1004. " if ($name$Builder_ == null) {\n"
  1005. " $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
  1006. " $type$, $type$.Builder, $type$OrBuilder>(\n"
  1007. " $name$_,\n"
  1008. " $get_mutable_bit_builder$,\n"
  1009. " getParentForChildren(),\n"
  1010. " isClean());\n"
  1011. " $name$_ = null;\n"
  1012. " }\n"
  1013. " return $name$Builder_;\n"
  1014. "}\n");
  1015. printer->Annotate("{", "}", descriptor_);
  1016. }
  1017. void RepeatedImmutableMessageFieldGenerator::
  1018. GenerateFieldBuilderInitializationCode(io::Printer* printer) const {
  1019. printer->Print(variables_,
  1020. "get$capitalized_name$FieldBuilder();\n");
  1021. }
  1022. void RepeatedImmutableMessageFieldGenerator::
  1023. GenerateInitializationCode(io::Printer* printer) const {
  1024. printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n");
  1025. }
  1026. void RepeatedImmutableMessageFieldGenerator::
  1027. GenerateBuilderClearCode(io::Printer* printer) const {
  1028. PrintNestedBuilderCondition(printer,
  1029. "$name$_ = java.util.Collections.emptyList();\n"
  1030. "$clear_mutable_bit_builder$;\n",
  1031. "$name$Builder_.clear();\n");
  1032. }
  1033. void RepeatedImmutableMessageFieldGenerator::
  1034. GenerateMergingCode(io::Printer* printer) const {
  1035. // The code below does two optimizations (non-nested builder case):
  1036. // 1. If the other list is empty, there's nothing to do. This ensures we
  1037. // don't allocate a new array if we already have an immutable one.
  1038. // 2. If the other list is non-empty and our current list is empty, we can
  1039. // reuse the other list which is guaranteed to be immutable.
  1040. PrintNestedBuilderCondition(printer,
  1041. "if (!other.$name$_.isEmpty()) {\n"
  1042. " if ($name$_.isEmpty()) {\n"
  1043. " $name$_ = other.$name$_;\n"
  1044. " $clear_mutable_bit_builder$;\n"
  1045. " } else {\n"
  1046. " ensure$capitalized_name$IsMutable();\n"
  1047. " $name$_.addAll(other.$name$_);\n"
  1048. " }\n"
  1049. " $on_changed$\n"
  1050. "}\n",
  1051. "if (!other.$name$_.isEmpty()) {\n"
  1052. " if ($name$Builder_.isEmpty()) {\n"
  1053. " $name$Builder_.dispose();\n"
  1054. " $name$Builder_ = null;\n"
  1055. " $name$_ = other.$name$_;\n"
  1056. " $clear_mutable_bit_builder$;\n"
  1057. " $name$Builder_ = \n"
  1058. " com.google.protobuf.GeneratedMessage$ver$.alwaysUseFieldBuilders ?\n"
  1059. " get$capitalized_name$FieldBuilder() : null;\n"
  1060. " } else {\n"
  1061. " $name$Builder_.addAllMessages(other.$name$_);\n"
  1062. " }\n"
  1063. "}\n");
  1064. }
  1065. void RepeatedImmutableMessageFieldGenerator::
  1066. GenerateBuildingCode(io::Printer* printer) const {
  1067. // The code below (non-nested builder case) ensures that the result has an
  1068. // immutable list. If our list is immutable, we can just reuse it. If not,
  1069. // we make it immutable.
  1070. PrintNestedBuilderCondition(printer,
  1071. "if ($get_mutable_bit_builder$) {\n"
  1072. " $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
  1073. " $clear_mutable_bit_builder$;\n"
  1074. "}\n"
  1075. "result.$name$_ = $name$_;\n",
  1076. "result.$name$_ = $name$Builder_.build();\n");
  1077. }
  1078. void RepeatedImmutableMessageFieldGenerator::
  1079. GenerateParsingCode(io::Printer* printer) const {
  1080. printer->Print(variables_,
  1081. "if (!$get_mutable_bit_parser$) {\n"
  1082. " $name$_ = new java.util.ArrayList<$type$>();\n"
  1083. " $set_mutable_bit_parser$;\n"
  1084. "}\n");
  1085. if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
  1086. printer->Print(variables_,
  1087. "$name$_.add(input.readGroup($number$, $type$.$get_parser$,\n"
  1088. " extensionRegistry));\n");
  1089. } else {
  1090. printer->Print(variables_,
  1091. "$name$_.add(\n"
  1092. " input.readMessage($type$.$get_parser$, extensionRegistry));\n");
  1093. }
  1094. }
  1095. void RepeatedImmutableMessageFieldGenerator::
  1096. GenerateParsingDoneCode(io::Printer* printer) const {
  1097. printer->Print(variables_,
  1098. "if ($get_mutable_bit_parser$) {\n"
  1099. " $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
  1100. "}\n");
  1101. }
  1102. void RepeatedImmutableMessageFieldGenerator::
  1103. GenerateSerializationCode(io::Printer* printer) const {
  1104. printer->Print(variables_,
  1105. "for (int i = 0; i < $name$_.size(); i++) {\n"
  1106. " output.write$group_or_message$($number$, $name$_.get(i));\n"
  1107. "}\n");
  1108. }
  1109. void RepeatedImmutableMessageFieldGenerator::
  1110. GenerateSerializedSizeCode(io::Printer* printer) const {
  1111. printer->Print(variables_,
  1112. "for (int i = 0; i < $name$_.size(); i++) {\n"
  1113. " size += com.google.protobuf.CodedOutputStream\n"
  1114. " .compute$group_or_message$Size($number$, $name$_.get(i));\n"
  1115. "}\n");
  1116. }
  1117. void RepeatedImmutableMessageFieldGenerator::
  1118. GenerateEqualsCode(io::Printer* printer) const {
  1119. printer->Print(variables_,
  1120. "result = result && get$capitalized_name$List()\n"
  1121. " .equals(other.get$capitalized_name$List());\n");
  1122. }
  1123. void RepeatedImmutableMessageFieldGenerator::
  1124. GenerateHashCode(io::Printer* printer) const {
  1125. printer->Print(variables_,
  1126. "if (get$capitalized_name$Count() > 0) {\n"
  1127. " hash = (37 * hash) + $constant_name$;\n"
  1128. " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
  1129. "}\n");
  1130. }
  1131. string RepeatedImmutableMessageFieldGenerator::GetBoxedType() const {
  1132. return name_resolver_->GetImmutableClassName(descriptor_->message_type());
  1133. }
  1134. } // namespace java
  1135. } // namespace compiler
  1136. } // namespace protobuf
  1137. } // namespace google