java_message_lite.cc 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171
  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: dweis@google.com (Daniel Weis)
  31. // Based on original Protocol Buffers design by
  32. // Sanjay Ghemawat, Jeff Dean, and others.
  33. #include <google/protobuf/compiler/java/java_message_lite.h>
  34. #include <algorithm>
  35. #include <google/protobuf/stubs/hash.h>
  36. #include <map>
  37. #include <memory>
  38. #include <vector>
  39. #include <google/protobuf/compiler/java/java_context.h>
  40. #include <google/protobuf/compiler/java/java_doc_comment.h>
  41. #include <google/protobuf/compiler/java/java_enum_lite.h>
  42. #include <google/protobuf/compiler/java/java_extension_lite.h>
  43. #include <google/protobuf/compiler/java/java_generator_factory.h>
  44. #include <google/protobuf/compiler/java/java_helpers.h>
  45. #include <google/protobuf/compiler/java/java_message_builder.h>
  46. #include <google/protobuf/compiler/java/java_message_builder_lite.h>
  47. #include <google/protobuf/compiler/java/java_name_resolver.h>
  48. #include <google/protobuf/descriptor.pb.h>
  49. #include <google/protobuf/io/coded_stream.h>
  50. #include <google/protobuf/io/printer.h>
  51. #include <google/protobuf/wire_format.h>
  52. #include <google/protobuf/stubs/substitute.h>
  53. #include <google/protobuf/stubs/strutil.h>
  54. namespace google {
  55. namespace protobuf {
  56. namespace compiler {
  57. namespace java {
  58. using internal::WireFormat;
  59. using internal::WireFormatLite;
  60. namespace {
  61. bool EnableExperimentalRuntimeForLite() {
  62. #ifdef PROTOBUF_EXPERIMENT
  63. return PROTOBUF_EXPERIMENT;
  64. #else // PROTOBUF_EXPERIMENT
  65. return false;
  66. #endif // !PROTOBUF_EXPERIMENT
  67. }
  68. bool GenerateHasBits(const Descriptor* descriptor) {
  69. return SupportFieldPresence(descriptor->file()) ||
  70. HasRepeatedFields(descriptor);
  71. }
  72. string MapValueImmutableClassdName(const Descriptor* descriptor,
  73. ClassNameResolver* name_resolver) {
  74. const FieldDescriptor* value_field = descriptor->FindFieldByName("value");
  75. GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, value_field->type());
  76. return name_resolver->GetImmutableClassName(value_field->message_type());
  77. }
  78. } // namespace
  79. // ===================================================================
  80. ImmutableMessageLiteGenerator::ImmutableMessageLiteGenerator(
  81. const Descriptor* descriptor, Context* context)
  82. : MessageGenerator(descriptor), context_(context),
  83. name_resolver_(context->GetNameResolver()),
  84. field_generators_(descriptor, context_) {
  85. GOOGLE_CHECK(!HasDescriptorMethods(descriptor->file(), context->EnforceLite()))
  86. << "Generator factory error: A lite message generator is used to "
  87. "generate non-lite messages.";
  88. }
  89. ImmutableMessageLiteGenerator::~ImmutableMessageLiteGenerator() {}
  90. void ImmutableMessageLiteGenerator::GenerateStaticVariables(
  91. io::Printer* printer, int* bytecode_estimate) {
  92. // Generate static members for all nested types.
  93. for (int i = 0; i < descriptor_->nested_type_count(); i++) {
  94. // TODO(kenton): Reuse MessageGenerator objects?
  95. ImmutableMessageLiteGenerator(descriptor_->nested_type(i), context_)
  96. .GenerateStaticVariables(printer, bytecode_estimate);
  97. }
  98. }
  99. int ImmutableMessageLiteGenerator::GenerateStaticVariableInitializers(
  100. io::Printer* printer) {
  101. int bytecode_estimate = 0;
  102. // Generate static member initializers for all nested types.
  103. for (int i = 0; i < descriptor_->nested_type_count(); i++) {
  104. // TODO(kenton): Reuse MessageGenerator objects?
  105. bytecode_estimate +=
  106. ImmutableMessageLiteGenerator(descriptor_->nested_type(i), context_)
  107. .GenerateStaticVariableInitializers(printer);
  108. }
  109. return bytecode_estimate;
  110. }
  111. // ===================================================================
  112. void ImmutableMessageLiteGenerator::GenerateInterface(io::Printer* printer) {
  113. MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
  114. /* immutable = */ true, "OrBuilder");
  115. if (descriptor_->extension_range_count() > 0) {
  116. printer->Print(
  117. "$deprecation$public interface ${$$classname$OrBuilder$}$ extends \n"
  118. " $extra_interfaces$\n"
  119. " com.google.protobuf.GeneratedMessageLite.\n"
  120. " ExtendableMessageOrBuilder<\n"
  121. " $classname$, $classname$.Builder> {\n",
  122. "deprecation", descriptor_->options().deprecated() ?
  123. "@java.lang.Deprecated " : "",
  124. "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
  125. "classname", descriptor_->name(),
  126. "{", "", "}", "");
  127. } else {
  128. printer->Print(
  129. "$deprecation$public interface ${$$classname$OrBuilder$}$ extends\n"
  130. " $extra_interfaces$\n"
  131. " com.google.protobuf.MessageLiteOrBuilder {\n",
  132. "deprecation", descriptor_->options().deprecated() ?
  133. "@java.lang.Deprecated " : "",
  134. "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
  135. "classname", descriptor_->name(),
  136. "{", "", "}", "");
  137. }
  138. printer->Annotate("{", "}", descriptor_);
  139. printer->Indent();
  140. for (int i = 0; i < descriptor_->field_count(); i++) {
  141. printer->Print("\n");
  142. field_generators_.get(descriptor_->field(i))
  143. .GenerateInterfaceMembers(printer);
  144. }
  145. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
  146. printer->Print(
  147. "\n"
  148. "public $classname$.$oneof_capitalized_name$Case "
  149. "get$oneof_capitalized_name$Case();\n",
  150. "oneof_capitalized_name",
  151. context_->GetOneofGeneratorInfo(
  152. descriptor_->oneof_decl(i))->capitalized_name,
  153. "classname",
  154. context_->GetNameResolver()->GetImmutableClassName(descriptor_));
  155. }
  156. printer->Outdent();
  157. printer->Print("}\n");
  158. }
  159. // ===================================================================
  160. void ImmutableMessageLiteGenerator::Generate(io::Printer* printer) {
  161. bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true);
  162. std::map<string, string> variables;
  163. variables["static"] = is_own_file ? " " : " static ";
  164. variables["classname"] = descriptor_->name();
  165. variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_);
  166. variables["deprecation"] = descriptor_->options().deprecated()
  167. ? "@java.lang.Deprecated " : "";
  168. WriteMessageDocComment(printer, descriptor_);
  169. MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
  170. /* immutable = */ true);
  171. // The builder_type stores the super type name of the nested Builder class.
  172. string builder_type;
  173. if (descriptor_->extension_range_count() > 0) {
  174. printer->Print(variables,
  175. "$deprecation$public $static$final class $classname$ extends\n"
  176. " com.google.protobuf.GeneratedMessageLite.ExtendableMessage<\n"
  177. " $classname$, $classname$.Builder> implements\n"
  178. " $extra_interfaces$\n"
  179. " $classname$OrBuilder {\n");
  180. builder_type = strings::Substitute(
  181. "com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<$0, ?>",
  182. name_resolver_->GetImmutableClassName(descriptor_));
  183. } else {
  184. printer->Print(variables,
  185. "$deprecation$public $static$final class $classname$ extends\n"
  186. " com.google.protobuf.GeneratedMessageLite<\n"
  187. " $classname$, $classname$.Builder> implements\n"
  188. " $extra_interfaces$\n"
  189. " $classname$OrBuilder {\n");
  190. builder_type = "com.google.protobuf.GeneratedMessageLite.Builder";
  191. }
  192. printer->Indent();
  193. GenerateConstructor(printer);
  194. // Nested types
  195. for (int i = 0; i < descriptor_->enum_type_count(); i++) {
  196. EnumLiteGenerator(descriptor_->enum_type(i), true, context_)
  197. .Generate(printer);
  198. }
  199. for (int i = 0; i < descriptor_->nested_type_count(); i++) {
  200. // Don't generate Java classes for map entry messages.
  201. if (IsMapEntry(descriptor_->nested_type(i))) continue;
  202. ImmutableMessageLiteGenerator messageGenerator(
  203. descriptor_->nested_type(i), context_);
  204. messageGenerator.GenerateInterface(printer);
  205. messageGenerator.Generate(printer);
  206. }
  207. if (GenerateHasBits(descriptor_)) {
  208. // Integers for bit fields.
  209. int totalBits = 0;
  210. for (int i = 0; i < descriptor_->field_count(); i++) {
  211. totalBits += field_generators_.get(descriptor_->field(i))
  212. .GetNumBitsForMessage();
  213. }
  214. int totalInts = (totalBits + 31) / 32;
  215. for (int i = 0; i < totalInts; i++) {
  216. printer->Print("private int $bit_field_name$;\n",
  217. "bit_field_name", GetBitFieldName(i));
  218. }
  219. }
  220. // oneof
  221. std::map<string, string> vars;
  222. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
  223. const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
  224. vars["oneof_name"] = context_->GetOneofGeneratorInfo(oneof)->name;
  225. vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo(
  226. oneof)->capitalized_name;
  227. vars["oneof_index"] = SimpleItoa(oneof->index());
  228. // oneofCase_ and oneof_
  229. printer->Print(vars,
  230. "private int $oneof_name$Case_ = 0;\n"
  231. "private java.lang.Object $oneof_name$_;\n");
  232. // OneofCase enum
  233. printer->Print(vars,
  234. "public enum $oneof_capitalized_name$Case\n"
  235. " implements com.google.protobuf.Internal.EnumLite {\n");
  236. printer->Indent();
  237. for (int j = 0; j < oneof->field_count(); j++) {
  238. const FieldDescriptor* field = oneof->field(j);
  239. printer->Print(
  240. "$field_name$($field_number$),\n",
  241. "field_name",
  242. ToUpper(field->name()),
  243. "field_number",
  244. SimpleItoa(field->number()));
  245. }
  246. printer->Print(
  247. "$cap_oneof_name$_NOT_SET(0);\n",
  248. "cap_oneof_name",
  249. ToUpper(vars["oneof_name"]));
  250. printer->Print(vars,
  251. "private final int value;\n"
  252. "private $oneof_capitalized_name$Case(int value) {\n"
  253. " this.value = value;\n"
  254. "}\n");
  255. printer->Print(vars,
  256. "/**\n"
  257. " * @deprecated Use {@link #forNumber(int)} instead.\n"
  258. " */\n"
  259. "@java.lang.Deprecated\n"
  260. "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
  261. " return forNumber(value);\n"
  262. "}\n"
  263. "\n"
  264. "public static $oneof_capitalized_name$Case forNumber(int value) {\n"
  265. " switch (value) {\n");
  266. for (int j = 0; j < oneof->field_count(); j++) {
  267. const FieldDescriptor* field = oneof->field(j);
  268. printer->Print(
  269. " case $field_number$: return $field_name$;\n",
  270. "field_number",
  271. SimpleItoa(field->number()),
  272. "field_name",
  273. ToUpper(field->name()));
  274. }
  275. printer->Print(
  276. " case 0: return $cap_oneof_name$_NOT_SET;\n"
  277. " default: return null;\n"
  278. " }\n"
  279. "}\n"
  280. "@java.lang.Override\n"
  281. "public int getNumber() {\n"
  282. " return this.value;\n"
  283. "}\n",
  284. "cap_oneof_name", ToUpper(vars["oneof_name"]));
  285. printer->Outdent();
  286. printer->Print("};\n\n");
  287. // oneofCase()
  288. printer->Print(vars,
  289. "@java.lang.Override\n"
  290. "public $oneof_capitalized_name$Case\n"
  291. "get$oneof_capitalized_name$Case() {\n"
  292. " return $oneof_capitalized_name$Case.forNumber(\n"
  293. " $oneof_name$Case_);\n"
  294. "}\n"
  295. "\n"
  296. "private void clear$oneof_capitalized_name$() {\n"
  297. " $oneof_name$Case_ = 0;\n"
  298. " $oneof_name$_ = null;\n"
  299. "}\n"
  300. "\n");
  301. }
  302. // Fields
  303. for (int i = 0; i < descriptor_->field_count(); i++) {
  304. printer->Print("public static final int $constant_name$ = $number$;\n",
  305. "constant_name", FieldConstantName(descriptor_->field(i)),
  306. "number", SimpleItoa(descriptor_->field(i)->number()));
  307. field_generators_.get(descriptor_->field(i)).GenerateMembers(printer);
  308. printer->Print("\n");
  309. }
  310. if (!EnableExperimentalRuntime(context_)) {
  311. GenerateMessageSerializationMethods(printer);
  312. }
  313. GenerateParseFromMethods(printer);
  314. GenerateBuilder(printer);
  315. if (HasRequiredFields(descriptor_)) {
  316. // Memoizes whether the protocol buffer is fully initialized (has all
  317. // required fields). 0 means false, 1 means true, and all other values
  318. // mean not yet computed.
  319. printer->Print(
  320. "private byte memoizedIsInitialized = 2;\n");
  321. }
  322. printer->Print(
  323. "@java.lang.Override\n"
  324. "@java.lang.SuppressWarnings({\"unchecked\", \"fallthrough\"})\n"
  325. "protected final java.lang.Object dynamicMethod(\n"
  326. " com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,\n"
  327. " java.lang.Object arg0, java.lang.Object arg1) {\n"
  328. " switch (method) {\n"
  329. " case NEW_MUTABLE_INSTANCE: {\n"
  330. " return new $classname$();\n"
  331. " }\n",
  332. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  333. printer->Indent();
  334. printer->Indent();
  335. printer->Print(
  336. "case NEW_BUILDER: {\n");
  337. printer->Indent();
  338. GenerateDynamicMethodNewBuilder(printer);
  339. printer->Outdent();
  340. if (!EnableExperimentalRuntimeForLite()) {
  341. printer->Print(
  342. "}\n"
  343. "case IS_INITIALIZED: {\n");
  344. printer->Indent();
  345. GenerateDynamicMethodIsInitialized(printer);
  346. printer->Outdent();
  347. printer->Print("}\n");
  348. printer->Print(
  349. "case MAKE_IMMUTABLE: {\n");
  350. printer->Indent();
  351. GenerateDynamicMethodMakeImmutable(printer);
  352. printer->Outdent();
  353. printer->Print(
  354. "}\n"
  355. "case VISIT: {\n");
  356. printer->Indent();
  357. GenerateDynamicMethodVisit(printer);
  358. printer->Outdent();
  359. printer->Print(
  360. "}\n"
  361. "case MERGE_FROM_STREAM: {\n");
  362. printer->Indent();
  363. GenerateDynamicMethodMergeFromStream(printer);
  364. printer->Outdent();
  365. }
  366. printer->Print(
  367. "}\n"
  368. "// fall through\n"
  369. "case GET_DEFAULT_INSTANCE: {\n"
  370. " return DEFAULT_INSTANCE;\n"
  371. "}\n"
  372. "case GET_PARSER: {\n"
  373. // Generally one would use the lazy initialization holder pattern for
  374. // manipulating static fields but that has exceptional cost on Android as
  375. // it will generate an extra class for every message. Instead, use the
  376. // double-check locking pattern which works just as well.
  377. //
  378. // The "parser" temporary mirrors the "PARSER" field to eliminate a read
  379. // at the final return statement.
  380. " com.google.protobuf.Parser<$classname$> parser = PARSER;\n"
  381. " if (parser == null) {\n"
  382. " synchronized ($classname$.class) {\n"
  383. " parser = PARSER;\n"
  384. " if (parser == null) {\n"
  385. " parser = new DefaultInstanceBasedParser(DEFAULT_INSTANCE);\n"
  386. " PARSER = parser;\n"
  387. " }\n"
  388. " }\n"
  389. " }\n"
  390. " return parser;\n",
  391. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  392. printer->Outdent();
  393. if (HasRequiredFields(descriptor_)) {
  394. printer->Print(
  395. "}\n"
  396. "case GET_MEMOIZED_IS_INITIALIZED: {\n"
  397. " return memoizedIsInitialized;\n"
  398. "}\n"
  399. "case SET_MEMOIZED_IS_INITIALIZED: {\n"
  400. " memoizedIsInitialized = (byte) (arg0 == null ? 0 : 1);\n"
  401. " return null;\n"
  402. "}\n");
  403. } else {
  404. printer->Print(
  405. "}\n"
  406. "case GET_MEMOIZED_IS_INITIALIZED: {\n"
  407. " return (byte) 1;\n"
  408. "}\n"
  409. "case SET_MEMOIZED_IS_INITIALIZED: {\n"
  410. " return null;\n"
  411. "}\n");
  412. }
  413. printer->Outdent();
  414. printer->Print(
  415. " }\n"
  416. " throw new UnsupportedOperationException();\n"
  417. "}\n"
  418. "\n",
  419. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  420. printer->Print(
  421. "\n"
  422. "// @@protoc_insertion_point(class_scope:$full_name$)\n",
  423. "full_name", descriptor_->full_name());
  424. // Carefully initialize the default instance in such a way that it doesn't
  425. // conflict with other initialization.
  426. printer->Print(
  427. "private static final $classname$ DEFAULT_INSTANCE;\n",
  428. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  429. printer->Print(
  430. "static {\n"
  431. " // New instances are implicitly immutable so no need to make\n"
  432. " // immutable.\n"
  433. " DEFAULT_INSTANCE = new $classname$();\n"
  434. "}\n"
  435. "\n",
  436. "classname", descriptor_->name());
  437. if (EnableExperimentalRuntimeForLite()) {
  438. // Register the default instance in a map. This map will be used by
  439. // experimental runtime to lookup default instance given a class instance
  440. // without using Java reflection.
  441. printer->Print(
  442. "static {\n"
  443. " com.google.protobuf.GeneratedMessageLite.registerDefaultInstance(\n"
  444. " $classname$.class, DEFAULT_INSTANCE);\n"
  445. "}\n",
  446. "classname", descriptor_->name());
  447. }
  448. printer->Print(
  449. "public static $classname$ getDefaultInstance() {\n"
  450. " return DEFAULT_INSTANCE;\n"
  451. "}\n"
  452. "\n",
  453. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  454. // 'of' method for Wrappers
  455. if (IsWrappersProtoFile(descriptor_->file())) {
  456. printer->Print(
  457. "public static $classname$ of($field_type$ value) {\n"
  458. " return newBuilder().setValue(value).build();\n"
  459. "}\n"
  460. "\n",
  461. "classname", name_resolver_->GetImmutableClassName(descriptor_),
  462. "field_type", PrimitiveTypeName(GetJavaType(descriptor_->field(0))));
  463. }
  464. GenerateParser(printer);
  465. // Extensions must be declared after the DEFAULT_INSTANCE is initialized
  466. // because the DEFAULT_INSTANCE is used by the extension to lazily retrieve
  467. // the outer class's FileDescriptor.
  468. for (int i = 0; i < descriptor_->extension_count(); i++) {
  469. ImmutableExtensionLiteGenerator(descriptor_->extension(i), context_)
  470. .Generate(printer);
  471. }
  472. printer->Outdent();
  473. printer->Print("}\n\n");
  474. }
  475. // ===================================================================
  476. void ImmutableMessageLiteGenerator::
  477. GenerateMessageSerializationMethods(io::Printer* printer) {
  478. if (EnableExperimentalRuntimeForLite()) {
  479. return;
  480. }
  481. std::unique_ptr<const FieldDescriptor * []> sorted_fields(
  482. SortFieldsByNumber(descriptor_));
  483. std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
  484. for (int i = 0; i < descriptor_->extension_range_count(); ++i) {
  485. sorted_extensions.push_back(descriptor_->extension_range(i));
  486. }
  487. std::sort(sorted_extensions.begin(), sorted_extensions.end(),
  488. ExtensionRangeOrdering());
  489. printer->Print(
  490. "@java.lang.Override\n"
  491. "public void writeTo(com.google.protobuf.CodedOutputStream output)\n"
  492. " throws java.io.IOException {\n");
  493. printer->Indent();
  494. if (HasPackedFields(descriptor_)) {
  495. // writeTo(CodedOutputStream output) might be invoked without
  496. // getSerializedSize() ever being called, but we need the memoized
  497. // sizes in case this message has packed fields. Rather than emit checks
  498. // for each packed field, just call getSerializedSize() up front. In most
  499. // cases, getSerializedSize() will have already been called anyway by one
  500. // of the wrapper writeTo() methods, making this call cheap.
  501. printer->Print("getSerializedSize();\n");
  502. }
  503. if (descriptor_->extension_range_count() > 0) {
  504. if (descriptor_->options().message_set_wire_format()) {
  505. printer->Print(
  506. "com.google.protobuf.GeneratedMessageLite\n"
  507. " .ExtendableMessage<$classname$, $classname$.Builder>\n"
  508. " .ExtensionWriter extensionWriter =\n"
  509. " newMessageSetExtensionWriter();\n",
  510. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  511. } else {
  512. printer->Print(
  513. "com.google.protobuf.GeneratedMessageLite\n"
  514. " .ExtendableMessage<$classname$, $classname$.Builder>\n"
  515. " .ExtensionWriter extensionWriter =\n"
  516. " newExtensionWriter();\n",
  517. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  518. }
  519. }
  520. // Merge the fields and the extension ranges, both sorted by field number.
  521. for (int i = 0, j = 0;
  522. i < descriptor_->field_count() || j < sorted_extensions.size();) {
  523. if (i == descriptor_->field_count()) {
  524. GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
  525. } else if (j == sorted_extensions.size()) {
  526. GenerateSerializeOneField(printer, sorted_fields[i++]);
  527. } else if (sorted_fields[i]->number() < sorted_extensions[j]->start) {
  528. GenerateSerializeOneField(printer, sorted_fields[i++]);
  529. } else {
  530. GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
  531. }
  532. }
  533. if (descriptor_->options().message_set_wire_format()) {
  534. printer->Print("unknownFields.writeAsMessageSetTo(output);\n");
  535. } else {
  536. printer->Print("unknownFields.writeTo(output);\n");
  537. }
  538. printer->Outdent();
  539. printer->Print(
  540. "}\n"
  541. "\n"
  542. "@java.lang.Override\n"
  543. "public int getSerializedSize() {\n"
  544. " int size = memoizedSerializedSize;\n"
  545. " if (size != -1) return size;\n"
  546. "\n");
  547. printer->Indent();
  548. printer->Print(
  549. "size = 0;\n");
  550. for (int i = 0; i < descriptor_->field_count(); i++) {
  551. field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer);
  552. }
  553. if (descriptor_->extension_range_count() > 0) {
  554. if (descriptor_->options().message_set_wire_format()) {
  555. printer->Print("size += extensionsSerializedSizeAsMessageSet();\n");
  556. } else {
  557. printer->Print("size += extensionsSerializedSize();\n");
  558. }
  559. }
  560. if (descriptor_->options().message_set_wire_format()) {
  561. printer->Print("size += unknownFields.getSerializedSizeAsMessageSet();\n");
  562. } else {
  563. printer->Print("size += unknownFields.getSerializedSize();\n");
  564. }
  565. printer->Print(
  566. "memoizedSerializedSize = size;\n"
  567. "return size;\n");
  568. printer->Outdent();
  569. printer->Print(
  570. "}\n"
  571. "\n");
  572. }
  573. void ImmutableMessageLiteGenerator::
  574. GenerateParseFromMethods(io::Printer* printer) {
  575. // Note: These are separate from GenerateMessageSerializationMethods()
  576. // because they need to be generated even for messages that are optimized
  577. // for code size.
  578. printer->Print(
  579. "public static $classname$ parseFrom(\n"
  580. " java.nio.ByteBuffer data)\n"
  581. " throws com.google.protobuf.InvalidProtocolBufferException {\n"
  582. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  583. " DEFAULT_INSTANCE, data);\n"
  584. "}\n"
  585. "public static $classname$ parseFrom(\n"
  586. " java.nio.ByteBuffer data,\n"
  587. " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
  588. " throws com.google.protobuf.InvalidProtocolBufferException {\n"
  589. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  590. " DEFAULT_INSTANCE, data, extensionRegistry);\n"
  591. "}\n"
  592. "public static $classname$ parseFrom(\n"
  593. " com.google.protobuf.ByteString data)\n"
  594. " throws com.google.protobuf.InvalidProtocolBufferException {\n"
  595. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  596. " DEFAULT_INSTANCE, data);\n"
  597. "}\n"
  598. "public static $classname$ parseFrom(\n"
  599. " com.google.protobuf.ByteString data,\n"
  600. " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
  601. " throws com.google.protobuf.InvalidProtocolBufferException {\n"
  602. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  603. " DEFAULT_INSTANCE, data, extensionRegistry);\n"
  604. "}\n"
  605. "public static $classname$ parseFrom(byte[] data)\n"
  606. " throws com.google.protobuf.InvalidProtocolBufferException {\n"
  607. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  608. " DEFAULT_INSTANCE, data);\n"
  609. "}\n"
  610. "public static $classname$ parseFrom(\n"
  611. " byte[] data,\n"
  612. " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
  613. " throws com.google.protobuf.InvalidProtocolBufferException {\n"
  614. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  615. " DEFAULT_INSTANCE, data, extensionRegistry);\n"
  616. "}\n"
  617. "public static $classname$ parseFrom(java.io.InputStream input)\n"
  618. " throws java.io.IOException {\n"
  619. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  620. " DEFAULT_INSTANCE, input);\n"
  621. "}\n"
  622. "public static $classname$ parseFrom(\n"
  623. " java.io.InputStream input,\n"
  624. " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
  625. " throws java.io.IOException {\n"
  626. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  627. " DEFAULT_INSTANCE, input, extensionRegistry);\n"
  628. "}\n"
  629. "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n"
  630. " throws java.io.IOException {\n"
  631. " return parseDelimitedFrom(DEFAULT_INSTANCE, input);\n"
  632. "}\n"
  633. "public static $classname$ parseDelimitedFrom(\n"
  634. " java.io.InputStream input,\n"
  635. " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
  636. " throws java.io.IOException {\n"
  637. " return parseDelimitedFrom(DEFAULT_INSTANCE, input, extensionRegistry);\n"
  638. "}\n"
  639. "public static $classname$ parseFrom(\n"
  640. " com.google.protobuf.CodedInputStream input)\n"
  641. " throws java.io.IOException {\n"
  642. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  643. " DEFAULT_INSTANCE, input);\n"
  644. "}\n"
  645. "public static $classname$ parseFrom(\n"
  646. " com.google.protobuf.CodedInputStream input,\n"
  647. " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
  648. " throws java.io.IOException {\n"
  649. " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
  650. " DEFAULT_INSTANCE, input, extensionRegistry);\n"
  651. "}\n"
  652. "\n",
  653. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  654. }
  655. void ImmutableMessageLiteGenerator::GenerateSerializeOneField(
  656. io::Printer* printer, const FieldDescriptor* field) {
  657. field_generators_.get(field).GenerateSerializationCode(printer);
  658. }
  659. void ImmutableMessageLiteGenerator::GenerateSerializeOneExtensionRange(
  660. io::Printer* printer, const Descriptor::ExtensionRange* range) {
  661. printer->Print(
  662. "extensionWriter.writeUntil($end$, output);\n",
  663. "end", SimpleItoa(range->end));
  664. }
  665. // ===================================================================
  666. void ImmutableMessageLiteGenerator::GenerateBuilder(io::Printer* printer) {
  667. printer->Print(
  668. "public static Builder newBuilder() {\n"
  669. " return (Builder) DEFAULT_INSTANCE.createBuilder();\n"
  670. "}\n"
  671. "public static Builder newBuilder($classname$ prototype) {\n"
  672. " return (Builder) DEFAULT_INSTANCE.createBuilder(prototype);\n"
  673. "}\n"
  674. "\n",
  675. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  676. MessageBuilderLiteGenerator builderGenerator(descriptor_, context_);
  677. builderGenerator.Generate(printer);
  678. }
  679. // ===================================================================
  680. void ImmutableMessageLiteGenerator::GenerateDynamicMethodIsInitialized(
  681. io::Printer* printer) {
  682. // Returns null for false, DEFAULT_INSTANCE for true.
  683. if (!HasRequiredFields(descriptor_)) {
  684. printer->Print("return DEFAULT_INSTANCE;\n");
  685. return;
  686. }
  687. // TODO(xiaofeng): Remove this when b/64445758 is fixed. We don't need to
  688. // check memoizedIsInitialized here because the caller does that already,
  689. // but right now proguard proto shrinker asserts on the bytecode layout of
  690. // this code so it can't be removed until proguard is updated.
  691. printer->Print(
  692. "byte isInitialized = memoizedIsInitialized;\n"
  693. "if (isInitialized == 1) return DEFAULT_INSTANCE;\n"
  694. "if (isInitialized == 0) return null;\n"
  695. "\n"
  696. "boolean shouldMemoize = ((Boolean) arg0).booleanValue();\n");
  697. // Check that all required fields in this message are set.
  698. // TODO(kenton): We can optimize this when we switch to putting all the
  699. // "has" fields into a single bitfield.
  700. for (int i = 0; i < descriptor_->field_count(); i++) {
  701. const FieldDescriptor* field = descriptor_->field(i);
  702. const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
  703. if (field->is_required()) {
  704. printer->Print(
  705. "if (!has$name$()) {\n"
  706. " return null;\n"
  707. "}\n",
  708. "name", info->capitalized_name);
  709. }
  710. }
  711. // Now check that all embedded messages are initialized.
  712. for (int i = 0; i < descriptor_->field_count(); i++) {
  713. const FieldDescriptor* field = descriptor_->field(i);
  714. const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
  715. if (GetJavaType(field) == JAVATYPE_MESSAGE &&
  716. HasRequiredFields(field->message_type())) {
  717. switch (field->label()) {
  718. case FieldDescriptor::LABEL_REQUIRED:
  719. printer->Print(
  720. "if (!get$name$().isInitialized()) {\n"
  721. " return null;\n"
  722. "}\n",
  723. "type", name_resolver_->GetImmutableClassName(
  724. field->message_type()),
  725. "name", info->capitalized_name);
  726. break;
  727. case FieldDescriptor::LABEL_OPTIONAL:
  728. if (!SupportFieldPresence(descriptor_->file()) &&
  729. field->containing_oneof() != NULL) {
  730. const OneofDescriptor* oneof = field->containing_oneof();
  731. const OneofGeneratorInfo* oneof_info =
  732. context_->GetOneofGeneratorInfo(oneof);
  733. printer->Print(
  734. "if ($oneof_name$Case_ == $field_number$) {\n",
  735. "oneof_name", oneof_info->name,
  736. "field_number", SimpleItoa(field->number()));
  737. } else {
  738. printer->Print(
  739. "if (has$name$()) {\n",
  740. "name", info->capitalized_name);
  741. }
  742. printer->Print(
  743. " if (!get$name$().isInitialized()) {\n"
  744. " return null;\n"
  745. " }\n"
  746. "}\n",
  747. "name", info->capitalized_name);
  748. break;
  749. case FieldDescriptor::LABEL_REPEATED:
  750. if (IsMapEntry(field->message_type())) {
  751. printer->Print(
  752. "for ($type$ item : get$name$Map().values()) {\n"
  753. " if (!item.isInitialized()) {\n"
  754. " return null;\n"
  755. " }\n"
  756. "}\n",
  757. "type", MapValueImmutableClassdName(field->message_type(),
  758. name_resolver_),
  759. "name", info->capitalized_name);
  760. } else {
  761. printer->Print(
  762. "for (int i = 0; i < get$name$Count(); i++) {\n"
  763. " if (!get$name$(i).isInitialized()) {\n"
  764. " return null;\n"
  765. " }\n"
  766. "}\n",
  767. "type", name_resolver_->GetImmutableClassName(
  768. field->message_type()),
  769. "name", info->capitalized_name);
  770. }
  771. break;
  772. }
  773. }
  774. }
  775. if (descriptor_->extension_range_count() > 0) {
  776. printer->Print(
  777. "if (!extensionsAreInitialized()) {\n"
  778. " return null;\n"
  779. "}\n");
  780. }
  781. printer->Print(
  782. "return DEFAULT_INSTANCE;\n"
  783. "\n");
  784. }
  785. // ===================================================================
  786. void ImmutableMessageLiteGenerator::GenerateDynamicMethodMakeImmutable(
  787. io::Printer* printer) {
  788. // Output generation code for each field.
  789. for (int i = 0; i < descriptor_->field_count(); i++) {
  790. field_generators_.get(descriptor_->field(i))
  791. .GenerateDynamicMethodMakeImmutableCode(printer);
  792. }
  793. printer->Print(
  794. "return null;\n");
  795. }
  796. // ===================================================================
  797. void ImmutableMessageLiteGenerator::GenerateDynamicMethodNewBuilder(
  798. io::Printer* printer) {
  799. printer->Print(
  800. "return new Builder();\n");
  801. }
  802. // ===================================================================
  803. void ImmutableMessageLiteGenerator::GenerateDynamicMethodVisit(
  804. io::Printer* printer) {
  805. printer->Print(
  806. "Visitor visitor = (Visitor) arg0;\n"
  807. "$classname$ other = ($classname$) arg1;\n",
  808. "classname", name_resolver_->GetImmutableClassName(descriptor_));
  809. for (int i = 0; i < descriptor_->field_count(); i++) {
  810. if (!descriptor_->field(i)->containing_oneof()) {
  811. field_generators_.get(
  812. descriptor_->field(i)).GenerateVisitCode(printer);
  813. }
  814. }
  815. // Merge oneof fields.
  816. for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) {
  817. printer->Print(
  818. "switch (other.get$oneof_capitalized_name$Case()) {\n",
  819. "oneof_capitalized_name",
  820. context_->GetOneofGeneratorInfo(
  821. descriptor_->oneof_decl(i))->capitalized_name);
  822. printer->Indent();
  823. for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
  824. const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
  825. printer->Print(
  826. "case $field_name$: {\n",
  827. "field_name",
  828. ToUpper(field->name()));
  829. printer->Indent();
  830. field_generators_.get(field).GenerateVisitCode(printer);
  831. printer->Print(
  832. "break;\n");
  833. printer->Outdent();
  834. printer->Print(
  835. "}\n");
  836. }
  837. printer->Print(
  838. "case $cap_oneof_name$_NOT_SET: {\n"
  839. " visitor.visitOneofNotSet($oneof_name$Case_ != 0);\n"
  840. " break;\n"
  841. "}\n",
  842. "cap_oneof_name",
  843. ToUpper(context_->GetOneofGeneratorInfo(
  844. descriptor_->oneof_decl(i))->name),
  845. "oneof_name",
  846. context_->GetOneofGeneratorInfo(
  847. descriptor_->oneof_decl(i))->name);
  848. printer->Outdent();
  849. printer->Print(
  850. "}\n");
  851. }
  852. printer->Print(
  853. "if (visitor == com.google.protobuf.GeneratedMessageLite.MergeFromVisitor\n"
  854. " .INSTANCE) {\n");
  855. printer->Indent();
  856. for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) {
  857. const OneofDescriptor* field = descriptor_->oneof_decl(i);
  858. printer->Print(
  859. "if (other.$oneof_name$Case_ != 0) {\n"
  860. " $oneof_name$Case_ = other.$oneof_name$Case_;\n"
  861. "}\n",
  862. "oneof_name", context_->GetOneofGeneratorInfo(field)->name);
  863. }
  864. if (GenerateHasBits(descriptor_)) {
  865. // Integers for bit fields.
  866. int totalBits = 0;
  867. for (int i = 0; i < descriptor_->field_count(); i++) {
  868. totalBits += field_generators_.get(descriptor_->field(i))
  869. .GetNumBitsForMessage();
  870. }
  871. int totalInts = (totalBits + 31) / 32;
  872. for (int i = 0; i < totalInts; i++) {
  873. printer->Print(
  874. "$bit_field_name$ |= other.$bit_field_name$;\n",
  875. "bit_field_name", GetBitFieldName(i));
  876. }
  877. }
  878. printer->Outdent();
  879. printer->Print(
  880. "}\n");
  881. printer->Print(
  882. "return this;\n");
  883. }
  884. // ===================================================================
  885. void ImmutableMessageLiteGenerator::GenerateDynamicMethodMergeFromStream(
  886. io::Printer* printer) {
  887. printer->Print(
  888. "com.google.protobuf.CodedInputStream input =\n"
  889. " (com.google.protobuf.CodedInputStream) arg0;\n"
  890. "com.google.protobuf.ExtensionRegistryLite extensionRegistry =\n"
  891. " (com.google.protobuf.ExtensionRegistryLite) arg1;\n"
  892. "if (extensionRegistry == null) {\n"
  893. " throw new java.lang.NullPointerException();\n"
  894. "}\n");
  895. printer->Print(
  896. "try {\n");
  897. printer->Indent();
  898. if (EnableExperimentalRuntime(context_)) {
  899. printer->Print(
  900. "mergeFromInternal(input, extensionRegistry);\n"
  901. "return DEFAULT_INSTANCE;\n");
  902. } else {
  903. printer->Print(
  904. "boolean done = false;\n"
  905. "while (!done) {\n");
  906. printer->Indent();
  907. printer->Print(
  908. "int tag = input.readTag();\n"
  909. "switch (tag) {\n");
  910. printer->Indent();
  911. printer->Print(
  912. "case 0:\n" // zero signals EOF / limit reached
  913. " done = true;\n"
  914. " break;\n");
  915. std::unique_ptr<const FieldDescriptor* []> sorted_fields(
  916. SortFieldsByNumber(descriptor_));
  917. for (int i = 0; i < descriptor_->field_count(); i++) {
  918. const FieldDescriptor* field = sorted_fields[i];
  919. uint32 tag = WireFormatLite::MakeTag(
  920. field->number(), WireFormat::WireTypeForFieldType(field->type()));
  921. printer->Print("case $tag$: {\n", "tag",
  922. SimpleItoa(static_cast<int32>(tag)));
  923. printer->Indent();
  924. field_generators_.get(field).GenerateParsingCode(printer);
  925. printer->Outdent();
  926. printer->Print(
  927. " break;\n"
  928. "}\n");
  929. if (field->is_packable()) {
  930. // To make packed = true wire compatible, we generate parsing code from
  931. // a packed version of this field regardless of
  932. // field->options().packed().
  933. uint32 packed_tag = WireFormatLite::MakeTag(
  934. field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
  935. printer->Print("case $tag$: {\n", "tag",
  936. SimpleItoa(static_cast<int32>(packed_tag)));
  937. printer->Indent();
  938. field_generators_.get(field).GenerateParsingCodeFromPacked(printer);
  939. printer->Outdent();
  940. printer->Print(
  941. " break;\n"
  942. "}\n");
  943. }
  944. }
  945. if (descriptor_->extension_range_count() > 0) {
  946. if (descriptor_->options().message_set_wire_format()) {
  947. printer->Print(
  948. "default: {\n"
  949. " if (!parseUnknownFieldAsMessageSet(\n"
  950. " getDefaultInstanceForType(), input, extensionRegistry,\n"
  951. " tag)) {\n"
  952. " done = true;\n" // it's an endgroup tag
  953. " }\n"
  954. " break;\n"
  955. "}\n");
  956. } else {
  957. printer->Print(
  958. "default: {\n"
  959. " if (!parseUnknownField(getDefaultInstanceForType(),\n"
  960. " input, extensionRegistry, tag)) {\n"
  961. " done = true;\n" // it's an endgroup tag
  962. " }\n"
  963. " break;\n"
  964. "}\n");
  965. }
  966. } else {
  967. printer->Print(
  968. "default: {\n"
  969. " if (!parseUnknownField(tag, input)) {\n"
  970. " done = true;\n" // it's an endgroup tag
  971. " }\n"
  972. " break;\n"
  973. "}\n");
  974. }
  975. printer->Outdent();
  976. printer->Outdent();
  977. printer->Print(
  978. " }\n" // switch (tag)
  979. "}\n"); // while (!done)
  980. }
  981. printer->Outdent();
  982. printer->Print(
  983. "} catch (com.google.protobuf.InvalidProtocolBufferException e) {\n"
  984. " throw new RuntimeException(e.setUnfinishedMessage(this));\n"
  985. "} catch (java.io.IOException e) {\n"
  986. " throw new RuntimeException(\n"
  987. " new com.google.protobuf.InvalidProtocolBufferException(\n"
  988. " e.getMessage()).setUnfinishedMessage(this));\n"
  989. "} finally {\n");
  990. printer->Indent();
  991. printer->Outdent();
  992. printer->Print(
  993. "}\n"); // finally
  994. }
  995. // ===================================================================
  996. void ImmutableMessageLiteGenerator::
  997. GenerateExtensionRegistrationCode(io::Printer* printer) {
  998. for (int i = 0; i < descriptor_->extension_count(); i++) {
  999. ImmutableExtensionLiteGenerator(descriptor_->extension(i), context_)
  1000. .GenerateRegistrationCode(printer);
  1001. }
  1002. for (int i = 0; i < descriptor_->nested_type_count(); i++) {
  1003. ImmutableMessageLiteGenerator(descriptor_->nested_type(i), context_)
  1004. .GenerateExtensionRegistrationCode(printer);
  1005. }
  1006. }
  1007. // ===================================================================
  1008. void ImmutableMessageLiteGenerator::
  1009. GenerateConstructor(io::Printer* printer) {
  1010. printer->Print(
  1011. "private $classname$() {\n",
  1012. "classname", descriptor_->name());
  1013. printer->Indent();
  1014. // Initialize all fields to default.
  1015. GenerateInitializers(printer);
  1016. printer->Outdent();
  1017. printer->Print(
  1018. "}\n");
  1019. }
  1020. // ===================================================================
  1021. void ImmutableMessageLiteGenerator::GenerateParser(io::Printer* printer) {
  1022. printer->Print(
  1023. "private static volatile com.google.protobuf.Parser<$classname$> PARSER;\n"
  1024. "\n"
  1025. "public static com.google.protobuf.Parser<$classname$> parser() {\n"
  1026. " return DEFAULT_INSTANCE.getParserForType();\n"
  1027. "}\n",
  1028. "classname", descriptor_->name());
  1029. }
  1030. // ===================================================================
  1031. void ImmutableMessageLiteGenerator::GenerateInitializers(io::Printer* printer) {
  1032. for (int i = 0; i < descriptor_->field_count(); i++) {
  1033. if (!descriptor_->field(i)->containing_oneof()) {
  1034. field_generators_.get(descriptor_->field(i))
  1035. .GenerateInitializationCode(printer);
  1036. }
  1037. }
  1038. }
  1039. } // namespace java
  1040. } // namespace compiler
  1041. } // namespace protobuf
  1042. } // namespace google