java_primitive_field_lite.cc 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  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/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_doc_comment.h>
  39. #include <google/protobuf/compiler/java/java_helpers.h>
  40. #include <google/protobuf/compiler/java/java_name_resolver.h>
  41. #include <google/protobuf/compiler/java/java_primitive_field_lite.h>
  42. #include <google/protobuf/io/printer.h>
  43. #include <google/protobuf/wire_format.h>
  44. #include <google/protobuf/stubs/strutil.h>
  45. namespace google {
  46. namespace protobuf {
  47. namespace compiler {
  48. namespace java {
  49. using internal::WireFormat;
  50. using internal::WireFormatLite;
  51. namespace {
  52. bool EnableExperimentalRuntimeForLite() {
  53. #ifdef PROTOBUF_EXPERIMENT
  54. return PROTOBUF_EXPERIMENT;
  55. #else // PROTOBUF_EXPERIMENT
  56. return false;
  57. #endif // !PROTOBUF_EXPERIMENT
  58. }
  59. void SetPrimitiveVariables(const FieldDescriptor* descriptor,
  60. int messageBitIndex, int builderBitIndex,
  61. const FieldGeneratorInfo* info,
  62. ClassNameResolver* name_resolver,
  63. std::map<std::string, std::string>* variables) {
  64. SetCommonFieldVariables(descriptor, info, variables);
  65. JavaType javaType = GetJavaType(descriptor);
  66. (*variables)["type"] = PrimitiveTypeName(javaType);
  67. (*variables)["boxed_type"] = BoxedPrimitiveTypeName(javaType);
  68. (*variables)["field_type"] = (*variables)["type"];
  69. (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
  70. (*variables)["capitalized_type"] =
  71. GetCapitalizedType(descriptor, /* immutable = */ true);
  72. (*variables)["tag"] =
  73. StrCat(static_cast<int32>(WireFormat::MakeTag(descriptor)));
  74. (*variables)["tag_size"] = StrCat(
  75. WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
  76. (*variables)["required"] = descriptor->is_required() ? "true" : "false";
  77. std::string capitalized_type = UnderscoresToCamelCase(
  78. PrimitiveTypeName(javaType), true /* cap_next_letter */);
  79. switch (javaType) {
  80. case JAVATYPE_INT:
  81. case JAVATYPE_LONG:
  82. case JAVATYPE_FLOAT:
  83. case JAVATYPE_DOUBLE:
  84. case JAVATYPE_BOOLEAN:
  85. (*variables)["field_list_type"] =
  86. "com.google.protobuf.Internal." + capitalized_type + "List";
  87. (*variables)["empty_list"] = "empty" + capitalized_type + "List()";
  88. (*variables)["make_name_unmodifiable"] =
  89. (*variables)["name"] + "_.makeImmutable()";
  90. (*variables)["repeated_get"] =
  91. (*variables)["name"] + "_.get" + capitalized_type;
  92. (*variables)["repeated_add"] =
  93. (*variables)["name"] + "_.add" + capitalized_type;
  94. (*variables)["repeated_set"] =
  95. (*variables)["name"] + "_.set" + capitalized_type;
  96. (*variables)["visit_type"] = capitalized_type;
  97. (*variables)["visit_type_list"] = "visit" + capitalized_type + "List";
  98. break;
  99. default:
  100. (*variables)["field_list_type"] =
  101. "com.google.protobuf.Internal.ProtobufList<" +
  102. (*variables)["boxed_type"] + ">";
  103. (*variables)["empty_list"] = "emptyProtobufList()";
  104. (*variables)["make_name_unmodifiable"] =
  105. (*variables)["name"] + "_.makeImmutable()";
  106. (*variables)["repeated_get"] = (*variables)["name"] + "_.get";
  107. (*variables)["repeated_add"] = (*variables)["name"] + "_.add";
  108. (*variables)["repeated_set"] = (*variables)["name"] + "_.set";
  109. (*variables)["visit_type"] = "ByteString";
  110. (*variables)["visit_type_list"] = "visitList";
  111. }
  112. if (javaType == JAVATYPE_BYTES) {
  113. (*variables)["bytes_default"] =
  114. ToUpper((*variables)["name"]) + "_DEFAULT_VALUE";
  115. }
  116. if (IsReferenceType(javaType)) {
  117. // We use `x.getClass()` as a null check because it generates less bytecode
  118. // than an `if (x == null) { throw ... }` statement.
  119. (*variables)["null_check"] = " value.getClass();\n";
  120. } else {
  121. (*variables)["null_check"] = "";
  122. }
  123. // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
  124. // by the proto compiler
  125. (*variables)["deprecation"] =
  126. descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
  127. int fixed_size = FixedSize(GetType(descriptor));
  128. if (fixed_size != -1) {
  129. (*variables)["fixed_size"] = StrCat(fixed_size);
  130. }
  131. if (SupportFieldPresence(descriptor->file())) {
  132. // For singular messages and builders, one bit is used for the hasField bit.
  133. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
  134. // Note that these have a trailing ";".
  135. (*variables)["set_has_field_bit_message"] =
  136. GenerateSetBit(messageBitIndex) + ";";
  137. (*variables)["clear_has_field_bit_message"] =
  138. GenerateClearBit(messageBitIndex) + ";";
  139. (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex);
  140. } else {
  141. (*variables)["set_has_field_bit_message"] = "";
  142. (*variables)["set_has_field_bit_message"] = "";
  143. (*variables)["clear_has_field_bit_message"] = "";
  144. if (descriptor->type() == FieldDescriptor::TYPE_BYTES) {
  145. (*variables)["is_field_present_message"] =
  146. "!" + (*variables)["name"] + "_.isEmpty()";
  147. } else {
  148. (*variables)["is_field_present_message"] =
  149. (*variables)["name"] + "_ != " + (*variables)["default"];
  150. }
  151. }
  152. // For repeated builders, the underlying list tracks mutability state.
  153. (*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()";
  154. (*variables)["get_has_field_bit_from_local"] =
  155. GenerateGetBitFromLocal(builderBitIndex);
  156. (*variables)["set_has_field_bit_to_local"] =
  157. GenerateSetBitToLocal(messageBitIndex);
  158. }
  159. } // namespace
  160. // ===================================================================
  161. ImmutablePrimitiveFieldLiteGenerator::ImmutablePrimitiveFieldLiteGenerator(
  162. const FieldDescriptor* descriptor, int messageBitIndex, Context* context)
  163. : descriptor_(descriptor),
  164. messageBitIndex_(messageBitIndex),
  165. name_resolver_(context->GetNameResolver()) {
  166. SetPrimitiveVariables(descriptor, messageBitIndex, 0,
  167. context->GetFieldGeneratorInfo(descriptor),
  168. name_resolver_, &variables_);
  169. }
  170. ImmutablePrimitiveFieldLiteGenerator::~ImmutablePrimitiveFieldLiteGenerator() {}
  171. int ImmutablePrimitiveFieldLiteGenerator::GetNumBitsForMessage() const {
  172. return SupportFieldPresence(descriptor_->file()) ? 1 : 0;
  173. }
  174. void ImmutablePrimitiveFieldLiteGenerator::GenerateInterfaceMembers(
  175. io::Printer* printer) const {
  176. if (SupportFieldPresence(descriptor_->file())) {
  177. WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
  178. printer->Print(variables_,
  179. "$deprecation$boolean has$capitalized_name$();\n");
  180. }
  181. WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
  182. printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
  183. }
  184. void ImmutablePrimitiveFieldLiteGenerator::GenerateMembers(
  185. io::Printer* printer) const {
  186. if (IsByteStringWithCustomDefaultValue(descriptor_)) {
  187. // allocate this once statically since we know ByteStrings are immutable
  188. // values that can be reused.
  189. printer->Print(
  190. variables_,
  191. "private static final $field_type$ $bytes_default$ = $default$;\n");
  192. }
  193. printer->Print(variables_, "private $field_type$ $name$_;\n");
  194. PrintExtraFieldInfo(variables_, printer);
  195. if (SupportFieldPresence(descriptor_->file())) {
  196. WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
  197. printer->Print(
  198. variables_,
  199. "@java.lang.Override\n"
  200. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  201. " return $get_has_field_bit_message$;\n"
  202. "}\n");
  203. printer->Annotate("{", "}", descriptor_);
  204. }
  205. WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
  206. printer->Print(variables_,
  207. "@java.lang.Override\n"
  208. "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
  209. " return $name$_;\n"
  210. "}\n");
  211. printer->Annotate("{", "}", descriptor_);
  212. WriteFieldAccessorDocComment(printer, descriptor_, SETTER);
  213. printer->Print(variables_,
  214. "private void set$capitalized_name$($type$ value) {\n"
  215. "$null_check$"
  216. " $set_has_field_bit_message$\n"
  217. " $name$_ = value;\n"
  218. "}\n");
  219. WriteFieldAccessorDocComment(printer, descriptor_, CLEARER);
  220. printer->Print(variables_,
  221. "private void clear$capitalized_name$() {\n"
  222. " $clear_has_field_bit_message$\n");
  223. JavaType type = GetJavaType(descriptor_);
  224. if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) {
  225. // The default value is not a simple literal so we want to avoid executing
  226. // it multiple times. Instead, get the default out of the default instance.
  227. printer->Print(
  228. variables_,
  229. " $name$_ = getDefaultInstance().get$capitalized_name$();\n");
  230. } else {
  231. printer->Print(variables_, " $name$_ = $default$;\n");
  232. }
  233. printer->Print(variables_, "}\n");
  234. }
  235. void ImmutablePrimitiveFieldLiteGenerator::GenerateBuilderMembers(
  236. io::Printer* printer) const {
  237. if (SupportFieldPresence(descriptor_->file())) {
  238. WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
  239. printer->Print(
  240. variables_,
  241. "@java.lang.Override\n"
  242. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  243. " return instance.has$capitalized_name$();\n"
  244. "}\n");
  245. printer->Annotate("{", "}", descriptor_);
  246. }
  247. WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
  248. printer->Print(variables_,
  249. "@java.lang.Override\n"
  250. "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
  251. " return instance.get$capitalized_name$();\n"
  252. "}\n");
  253. printer->Annotate("{", "}", descriptor_);
  254. WriteFieldAccessorDocComment(printer, descriptor_, SETTER,
  255. /* builder */ true);
  256. printer->Print(variables_,
  257. "$deprecation$public Builder "
  258. "${$set$capitalized_name$$}$($type$ value) {\n"
  259. " copyOnWrite();\n"
  260. " instance.set$capitalized_name$(value);\n"
  261. " return this;\n"
  262. "}\n");
  263. printer->Annotate("{", "}", descriptor_);
  264. WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
  265. /* builder */ true);
  266. printer->Print(
  267. variables_,
  268. "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
  269. " copyOnWrite();\n"
  270. " instance.clear$capitalized_name$();\n"
  271. " return this;\n"
  272. "}\n");
  273. printer->Annotate("{", "}", descriptor_);
  274. }
  275. void ImmutablePrimitiveFieldLiteGenerator::GenerateFieldInfo(
  276. io::Printer* printer, std::vector<uint16>* output) const {
  277. WriteIntToUtf16CharSequence(descriptor_->number(), output);
  278. WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
  279. output);
  280. if (SupportFieldPresence(descriptor_->file())) {
  281. WriteIntToUtf16CharSequence(messageBitIndex_, output);
  282. }
  283. printer->Print(variables_, "\"$name$_\",\n");
  284. }
  285. void ImmutablePrimitiveFieldLiteGenerator::GenerateInitializationCode(
  286. io::Printer* printer) const {
  287. if (IsByteStringWithCustomDefaultValue(descriptor_)) {
  288. printer->Print(variables_, "$name$_ = $bytes_default$;\n");
  289. } else if (!IsDefaultValueJavaDefault(descriptor_)) {
  290. printer->Print(variables_, "$name$_ = $default$;\n");
  291. }
  292. }
  293. std::string ImmutablePrimitiveFieldLiteGenerator::GetBoxedType() const {
  294. return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
  295. }
  296. // ===================================================================
  297. ImmutablePrimitiveOneofFieldLiteGenerator::
  298. ImmutablePrimitiveOneofFieldLiteGenerator(const FieldDescriptor* descriptor,
  299. int messageBitIndex,
  300. Context* context)
  301. : ImmutablePrimitiveFieldLiteGenerator(descriptor, messageBitIndex,
  302. context) {
  303. const OneofGeneratorInfo* info =
  304. context->GetOneofGeneratorInfo(descriptor->containing_oneof());
  305. SetCommonOneofVariables(descriptor, info, &variables_);
  306. }
  307. ImmutablePrimitiveOneofFieldLiteGenerator::
  308. ~ImmutablePrimitiveOneofFieldLiteGenerator() {}
  309. void ImmutablePrimitiveOneofFieldLiteGenerator::GenerateMembers(
  310. io::Printer* printer) const {
  311. PrintExtraFieldInfo(variables_, printer);
  312. if (SupportFieldPresence(descriptor_->file())) {
  313. WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
  314. printer->Print(
  315. variables_,
  316. "@java.lang.Override\n"
  317. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  318. " return $has_oneof_case_message$;\n"
  319. "}\n");
  320. printer->Annotate("{", "}", descriptor_);
  321. }
  322. WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
  323. printer->Print(variables_,
  324. "@java.lang.Override\n"
  325. "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
  326. " if ($has_oneof_case_message$) {\n"
  327. " return ($boxed_type$) $oneof_name$_;\n"
  328. " }\n"
  329. " return $default$;\n"
  330. "}\n");
  331. printer->Annotate("{", "}", descriptor_);
  332. WriteFieldAccessorDocComment(printer, descriptor_, SETTER);
  333. printer->Print(variables_,
  334. "private void set$capitalized_name$($type$ value) {\n"
  335. "$null_check$"
  336. " $set_oneof_case_message$;\n"
  337. " $oneof_name$_ = value;\n"
  338. "}\n");
  339. WriteFieldAccessorDocComment(printer, descriptor_, CLEARER);
  340. printer->Print(variables_,
  341. "private void clear$capitalized_name$() {\n"
  342. " if ($has_oneof_case_message$) {\n"
  343. " $clear_oneof_case_message$;\n"
  344. " $oneof_name$_ = null;\n"
  345. " }\n"
  346. "}\n");
  347. }
  348. void ImmutablePrimitiveOneofFieldLiteGenerator::GenerateFieldInfo(
  349. io::Printer* printer, std::vector<uint16>* output) const {
  350. WriteIntToUtf16CharSequence(descriptor_->number(), output);
  351. WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
  352. output);
  353. WriteIntToUtf16CharSequence(descriptor_->containing_oneof()->index(), output);
  354. }
  355. void ImmutablePrimitiveOneofFieldLiteGenerator::GenerateBuilderMembers(
  356. io::Printer* printer) const {
  357. if (SupportFieldPresence(descriptor_->file())) {
  358. WriteFieldAccessorDocComment(printer, descriptor_, HAZZER);
  359. printer->Print(
  360. variables_,
  361. "@java.lang.Override\n"
  362. "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
  363. " return instance.has$capitalized_name$();\n"
  364. "}\n");
  365. printer->Annotate("{", "}", descriptor_);
  366. }
  367. WriteFieldAccessorDocComment(printer, descriptor_, GETTER);
  368. printer->Print(variables_,
  369. "@java.lang.Override\n"
  370. "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
  371. " return instance.get$capitalized_name$();\n"
  372. "}\n");
  373. printer->Annotate("{", "}", descriptor_);
  374. WriteFieldAccessorDocComment(printer, descriptor_, SETTER,
  375. /* builder */ true);
  376. printer->Print(variables_,
  377. "$deprecation$public Builder "
  378. "${$set$capitalized_name$$}$($type$ value) {\n"
  379. " copyOnWrite();\n"
  380. " instance.set$capitalized_name$(value);\n"
  381. " return this;\n"
  382. "}\n");
  383. printer->Annotate("{", "}", descriptor_);
  384. WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
  385. /* builder */ true);
  386. printer->Print(
  387. variables_,
  388. "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
  389. " copyOnWrite();\n"
  390. " instance.clear$capitalized_name$();\n"
  391. " return this;\n"
  392. "}\n");
  393. printer->Annotate("{", "}", descriptor_);
  394. }
  395. // ===================================================================
  396. RepeatedImmutablePrimitiveFieldLiteGenerator::
  397. RepeatedImmutablePrimitiveFieldLiteGenerator(
  398. const FieldDescriptor* descriptor, int messageBitIndex,
  399. Context* context)
  400. : descriptor_(descriptor),
  401. context_(context),
  402. name_resolver_(context->GetNameResolver()) {
  403. SetPrimitiveVariables(descriptor, messageBitIndex, 0,
  404. context->GetFieldGeneratorInfo(descriptor),
  405. name_resolver_, &variables_);
  406. }
  407. RepeatedImmutablePrimitiveFieldLiteGenerator::
  408. ~RepeatedImmutablePrimitiveFieldLiteGenerator() {}
  409. int RepeatedImmutablePrimitiveFieldLiteGenerator::GetNumBitsForMessage() const {
  410. return 0;
  411. }
  412. void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateInterfaceMembers(
  413. io::Printer* printer) const {
  414. WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER);
  415. printer->Print(variables_,
  416. "$deprecation$java.util.List<$boxed_type$> "
  417. "get$capitalized_name$List();\n");
  418. WriteFieldAccessorDocComment(printer, descriptor_, LIST_COUNT);
  419. printer->Print(variables_,
  420. "$deprecation$int get$capitalized_name$Count();\n");
  421. WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_GETTER);
  422. printer->Print(variables_,
  423. "$deprecation$$type$ get$capitalized_name$(int index);\n");
  424. }
  425. void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateMembers(
  426. io::Printer* printer) const {
  427. printer->Print(variables_, "private $field_list_type$ $name$_;\n");
  428. PrintExtraFieldInfo(variables_, printer);
  429. WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER);
  430. printer->Print(variables_,
  431. "@java.lang.Override\n"
  432. "$deprecation$public java.util.List<$boxed_type$>\n"
  433. " ${$get$capitalized_name$List$}$() {\n"
  434. " return $name$_;\n" // note: unmodifiable list
  435. "}\n");
  436. printer->Annotate("{", "}", descriptor_);
  437. WriteFieldAccessorDocComment(printer, descriptor_, LIST_COUNT);
  438. printer->Print(
  439. variables_,
  440. "@java.lang.Override\n"
  441. "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
  442. " return $name$_.size();\n"
  443. "}\n");
  444. printer->Annotate("{", "}", descriptor_);
  445. WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_GETTER);
  446. printer->Print(
  447. variables_,
  448. "@java.lang.Override\n"
  449. "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
  450. " return $repeated_get$(index);\n"
  451. "}\n");
  452. printer->Annotate("{", "}", descriptor_);
  453. if (!EnableExperimentalRuntimeForLite() && descriptor_->is_packed() &&
  454. context_->HasGeneratedMethods(descriptor_->containing_type())) {
  455. printer->Print(variables_,
  456. "private int $name$MemoizedSerializedSize = -1;\n");
  457. }
  458. printer->Print(
  459. variables_,
  460. "private void ensure$capitalized_name$IsMutable() {\n"
  461. " if (!$is_mutable$) {\n"
  462. " $name$_ =\n"
  463. " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
  464. " }\n"
  465. "}\n");
  466. WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_SETTER);
  467. printer->Print(variables_,
  468. "private void set$capitalized_name$(\n"
  469. " int index, $type$ value) {\n"
  470. "$null_check$"
  471. " ensure$capitalized_name$IsMutable();\n"
  472. " $repeated_set$(index, value);\n"
  473. "}\n");
  474. WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER);
  475. printer->Print(variables_,
  476. "private void add$capitalized_name$($type$ value) {\n"
  477. "$null_check$"
  478. " ensure$capitalized_name$IsMutable();\n"
  479. " $repeated_add$(value);\n"
  480. "}\n");
  481. WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER);
  482. printer->Print(variables_,
  483. "private void addAll$capitalized_name$(\n"
  484. " java.lang.Iterable<? extends $boxed_type$> values) {\n"
  485. " ensure$capitalized_name$IsMutable();\n"
  486. " com.google.protobuf.AbstractMessageLite.addAll(\n"
  487. " values, $name$_);\n"
  488. "}\n");
  489. WriteFieldAccessorDocComment(printer, descriptor_, CLEARER);
  490. printer->Print(variables_,
  491. "private void clear$capitalized_name$() {\n"
  492. " $name$_ = $empty_list$;\n"
  493. "}\n");
  494. }
  495. void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateBuilderMembers(
  496. io::Printer* printer) const {
  497. WriteFieldAccessorDocComment(printer, descriptor_, LIST_GETTER);
  498. printer->Print(variables_,
  499. "@java.lang.Override\n"
  500. "$deprecation$public java.util.List<$boxed_type$>\n"
  501. " ${$get$capitalized_name$List$}$() {\n"
  502. " return java.util.Collections.unmodifiableList(\n"
  503. " instance.get$capitalized_name$List());\n"
  504. "}\n");
  505. printer->Annotate("{", "}", descriptor_);
  506. WriteFieldAccessorDocComment(printer, descriptor_, LIST_COUNT);
  507. printer->Print(
  508. variables_,
  509. "@java.lang.Override\n"
  510. "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
  511. " return instance.get$capitalized_name$Count();\n"
  512. "}\n");
  513. printer->Annotate("{", "}", descriptor_);
  514. WriteFieldAccessorDocComment(printer, descriptor_, LIST_INDEXED_GETTER);
  515. printer->Print(
  516. variables_,
  517. "@java.lang.Override\n"
  518. "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
  519. " return instance.get$capitalized_name$(index);\n"
  520. "}\n");
  521. printer->Annotate("{", "}", descriptor_);
  522. WriteFieldAccessorDocComment(printer, descriptor_, SETTER,
  523. /* builder */ true);
  524. printer->Print(variables_,
  525. "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
  526. " int index, $type$ value) {\n"
  527. " copyOnWrite();\n"
  528. " instance.set$capitalized_name$(index, value);\n"
  529. " return this;\n"
  530. "}\n");
  531. printer->Annotate("{", "}", descriptor_);
  532. WriteFieldAccessorDocComment(printer, descriptor_, LIST_ADDER,
  533. /* builder */ true);
  534. printer->Print(variables_,
  535. "$deprecation$public Builder "
  536. "${$add$capitalized_name$$}$($type$ value) {\n"
  537. " copyOnWrite();\n"
  538. " instance.add$capitalized_name$(value);\n"
  539. " return this;\n"
  540. "}\n");
  541. printer->Annotate("{", "}", descriptor_);
  542. WriteFieldAccessorDocComment(printer, descriptor_, LIST_MULTI_ADDER,
  543. /* builder */ true);
  544. printer->Print(variables_,
  545. "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
  546. " java.lang.Iterable<? extends $boxed_type$> values) {\n"
  547. " copyOnWrite();\n"
  548. " instance.addAll$capitalized_name$(values);\n"
  549. " return this;\n"
  550. "}\n");
  551. printer->Annotate("{", "}", descriptor_);
  552. WriteFieldAccessorDocComment(printer, descriptor_, CLEARER,
  553. /* builder */ true);
  554. printer->Print(
  555. variables_,
  556. "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
  557. " copyOnWrite();\n"
  558. " instance.clear$capitalized_name$();\n"
  559. " return this;\n"
  560. "}\n");
  561. printer->Annotate("{", "}", descriptor_);
  562. }
  563. void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateFieldInfo(
  564. io::Printer* printer, std::vector<uint16>* output) const {
  565. WriteIntToUtf16CharSequence(descriptor_->number(), output);
  566. WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
  567. output);
  568. printer->Print(variables_, "\"$name$_\",\n");
  569. }
  570. void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateInitializationCode(
  571. io::Printer* printer) const {
  572. printer->Print(variables_, "$name$_ = $empty_list$;\n");
  573. }
  574. std::string RepeatedImmutablePrimitiveFieldLiteGenerator::GetBoxedType() const {
  575. return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
  576. }
  577. } // namespace java
  578. } // namespace compiler
  579. } // namespace protobuf
  580. } // namespace google