1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <algorithm>
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/hash.h>
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_message.h>
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_enum.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_extension.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_helpers.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/printer.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/coded_stream.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h>
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace java {
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormat;
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormatLite;
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrintFieldComment(io::Printer* printer, const FieldDescriptor* field) {
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Print the field's proto-syntax definition as a comment.  We don't want to
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // print group bodies so we cut off after the first line.
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string def = field->DebugString();
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print("// $def$\n",
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "def", def.substr(0, def.find_first_of('\n')));
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct FieldOrderingByNumber {
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline bool operator()(const FieldDescriptor* a,
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* b) const {
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return a->number() < b->number();
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct ExtensionRangeOrdering {
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator()(const Descriptor::ExtensionRange* a,
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                  const Descriptor::ExtensionRange* b) const {
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return a->start < b->start;
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sort the fields of the given Descriptor by number into a new[]'d array
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and return it.
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) {
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor** fields =
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    new const FieldDescriptor*[descriptor->field_count()];
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor->field_count(); i++) {
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields[i] = descriptor->field(i);
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  sort(fields, fields + descriptor->field_count(),
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       FieldOrderingByNumber());
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return fields;
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Get an identifier that uniquely identifies this type within the file.
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This is used to declare static variables related to this type at the
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// outermost file scope.
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring UniqueFileScopeIdentifier(const Descriptor* descriptor) {
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return "static_" + StringReplace(descriptor->full_name(), ".", "_", true);
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Returns true if the message type has any required fields.  If it doesn't,
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// we can optimize out calls to its isInitialized() method.
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// already_seen is used to avoid checking the same type multiple times
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (and also to protect against recursion).
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic bool HasRequiredFields(
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Descriptor* type,
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    hash_set<const Descriptor*>* already_seen) {
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (already_seen->count(type) > 0) {
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // The type is already in cache.  This means that either:
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // a. The type has no required fields.
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // b. We are in the midst of checking if the type has required fields,
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //    somewhere up the stack.  In this case, we know that if the type
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //    has any required fields, they'll be found when we return to it,
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //    and the whole call to HasRequiredFields() will return true.
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //    Therefore, we don't have to check if this type has required fields
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //    here.
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return false;
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  already_seen->insert(type);
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If the type has extensions, an extension with message type could contain
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // required fields, so we have to be conservative and assume such an
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // extension exists.
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (type->extension_range_count() > 0) return true;
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < type->field_count(); i++) {
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = type->field(i);
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_required()) {
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return true;
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if (GetJavaType(field) == JAVATYPE_MESSAGE) {
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (HasRequiredFields(field->message_type(), already_seen)) {
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return true;
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return false;
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic bool HasRequiredFields(const Descriptor* type) {
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  hash_set<const Descriptor*> already_seen;
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return HasRequiredFields(type, &already_seen);
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageGenerator::MessageGenerator(const Descriptor* descriptor)
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  : descriptor_(descriptor),
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field_generators_(descriptor) {
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageGenerator::~MessageGenerator() {}
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateStaticVariables(io::Printer* printer) {
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasDescriptorMethods(descriptor_)) {
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Because descriptor.proto (com.google.protobuf.DescriptorProtos) is
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // used in the construction of descriptors, we have a tricky bootstrapping
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // problem.  To help control static initialization order, we make sure all
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // descriptors and other static data that depends on them are members of
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // the outermost class in the file.  This way, they will be initialized in
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // a deterministic order.
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    map<string, string> vars;
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vars["index"] = SimpleItoa(descriptor_->index());
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vars["classname"] = ClassName(descriptor_);
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->containing_type() != NULL) {
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      vars["parent"] = UniqueFileScopeIdentifier(
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          descriptor_->containing_type());
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->file()->options().java_multiple_files()) {
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We can only make these package-private since the classes that use them
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // are in separate files.
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      vars["private"] = "";
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      vars["private"] = "private ";
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // The descriptor for this type.
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(vars,
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "$private$static com.google.protobuf.Descriptors.Descriptor\n"
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  internal_$identifier$_descriptor;\n");
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // And the FieldAccessorTable.
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(vars,
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "$private$static\n"
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  com.google.protobuf.GeneratedMessage.FieldAccessorTable\n"
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    internal_$identifier$_fieldAccessorTable;\n");
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate static members for all nested types.
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // TODO(kenton):  Reuse MessageGenerator objects?
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MessageGenerator(descriptor_->nested_type(i))
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      .GenerateStaticVariables(printer);
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateStaticVariableInitializers(
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::Printer* printer) {
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasDescriptorMethods(descriptor_)) {
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    map<string, string> vars;
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vars["index"] = SimpleItoa(descriptor_->index());
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vars["classname"] = ClassName(descriptor_);
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->containing_type() != NULL) {
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      vars["parent"] = UniqueFileScopeIdentifier(
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          descriptor_->containing_type());
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // The descriptor for this type.
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->containing_type() == NULL) {
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(vars,
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "internal_$identifier$_descriptor =\n"
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  getDescriptor().getMessageTypes().get($index$);\n");
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(vars,
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "internal_$identifier$_descriptor =\n"
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  internal_$parent$_descriptor.getNestedTypes().get($index$);\n");
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // And the FieldAccessorTable.
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(vars,
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "internal_$identifier$_fieldAccessorTable = new\n"
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  com.google.protobuf.GeneratedMessage.FieldAccessorTable(\n"
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    internal_$identifier$_descriptor,\n"
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    new java.lang.String[] { ");
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < descriptor_->field_count(); i++) {
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "\"$field_name$\", ",
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "field_name",
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          UnderscoresToCapitalizedCamelCase(descriptor_->field(i)));
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print("},\n"
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    $classname$.class,\n"
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    $classname$.Builder.class);\n",
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "classname", ClassName(descriptor_));
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate static member initializers for all nested types.
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // TODO(kenton):  Reuse MessageGenerator objects?
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MessageGenerator(descriptor_->nested_type(i))
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      .GenerateStaticVariableInitializers(printer);
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->extension_count(); i++) {
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // TODO(kenton):  Reuse ExtensionGenerator objects?
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExtensionGenerator(descriptor_->extension(i))
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      .GenerateInitializationCode(printer);
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::Generate(io::Printer* printer) {
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool is_own_file =
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descriptor_->containing_type() == NULL &&
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descriptor_->file()->options().java_multiple_files();
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->extension_range_count() > 0) {
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (HasDescriptorMethods(descriptor_)) {
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public $static$ final class $classname$ extends\n"
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    com.google.protobuf.GeneratedMessage.ExtendableMessage<\n"
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "      $classname$> {\n",
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "static", is_own_file ? "" : "static",
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", descriptor_->name());
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public $static$ final class $classname$ extends\n"
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    com.google.protobuf.GeneratedMessageLite.ExtendableMessage<\n"
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "      $classname$> {\n",
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "static", is_own_file ? "" : "static",
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", descriptor_->name());
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (HasDescriptorMethods(descriptor_)) {
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public $static$ final class $classname$ extends\n"
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    com.google.protobuf.GeneratedMessage {\n",
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "static", is_own_file ? "" : "static",
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", descriptor_->name());
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public $static$ final class $classname$ extends\n"
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    com.google.protobuf.GeneratedMessageLite {\n",
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "static", is_own_file ? "" : "static",
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", descriptor_->name());
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "// Use $classname$.newBuilder() to construct.\n"
295d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "private $classname$() {\n"
296d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  initFields();\n"
297d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n"
298d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // Used when constructing the default instance, which cannot be initialized
299d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // immediately because it may cyclically refer to other default instances.
300d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "private $classname$(boolean noInit) {}\n"
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
302d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "private static final $classname$ defaultInstance;\n"
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ getDefaultInstance() {\n"
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return defaultInstance;\n"
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public $classname$ getDefaultInstanceForType() {\n"
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return defaultInstance;\n"
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n",
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "classname", descriptor_->name());
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasDescriptorMethods(descriptor_)) {
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "public static final com.google.protobuf.Descriptors.Descriptor\n"
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    getDescriptor() {\n"
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  return $fileclass$.internal_$identifier$_descriptor;\n"
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n"
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "\n"
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n"
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    internalGetFieldAccessorTable() {\n"
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  return $fileclass$.internal_$identifier$_fieldAccessorTable;\n"
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n"
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "\n",
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "fileclass", ClassName(descriptor_->file()),
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "identifier", UniqueFileScopeIdentifier(descriptor_));
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Nested types and extensions
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->enum_type_count(); i++) {
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EnumGenerator(descriptor_->enum_type(i)).Generate(printer);
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MessageGenerator(descriptor_->nested_type(i)).Generate(printer);
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->extension_count(); i++) {
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExtensionGenerator(descriptor_->extension(i)).Generate(printer);
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Fields
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    PrintFieldComment(printer, descriptor_->field(i));
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print("public static final int $constant_name$ = $number$;\n",
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "constant_name", FieldConstantName(descriptor_->field(i)),
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "number", SimpleItoa(descriptor_->field(i)->number()));
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field_generators_.get(descriptor_->field(i)).GenerateMembers(printer);
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print("\n");
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
352d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Called by the constructor, except in the case of the default instance,
353d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // in which case this is called by static init code later on.
354d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print("private void initFields() {\n");
355d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Indent();
356d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
357d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    field_generators_.get(descriptor_->field(i))
358d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                     .GenerateInitializationCode(printer);
359d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
360d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Outdent();
361d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print("}\n");
362d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasGeneratedMethods(descriptor_)) {
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GenerateIsInitialized(printer);
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GenerateMessageSerializationMethods(printer);
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GenerateParseFromMethods(printer);
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GenerateBuilder(printer);
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Force initialization of outer class.  Otherwise, nested extensions may
372d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // not be initialized.  Also carefully initialize the default instance in
373d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // such a way that it doesn't conflict with other initialization.
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "static {\n"
377d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  defaultInstance = new $classname$(true);\n"
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $file$.internalForceInit();\n"
379d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  defaultInstance.initFields();\n"
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
381d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "file", ClassName(descriptor_->file()),
382d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "classname", descriptor_->name());
383d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
384d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(
385d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "\n"
386d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "// @@protoc_insertion_point(class_scope:$full_name$)\n",
387d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "full_name", descriptor_->full_name());
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print("}\n\n");
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMessageSerializationMethods(io::Printer* printer) {
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_array<const FieldDescriptor*> sorted_fields(
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SortFieldsByNumber(descriptor_));
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  vector<const Descriptor::ExtensionRange*> sorted_extensions;
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->extension_range_count(); ++i) {
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    sorted_extensions.push_back(descriptor_->extension_range(i));
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  sort(sorted_extensions.begin(), sorted_extensions.end(),
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       ExtensionRangeOrdering());
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public void writeTo(com.google.protobuf.CodedOutputStream output)\n"
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "                    throws java.io.IOException {\n");
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
411d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // writeTo(CodedOutputStream output) might be invoked without
412d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // getSerializedSize() ever being called, but we need the memoized
413d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // sizes in case this message has packed fields. Rather than emit checks for
414d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // each packed field, just call getSerializedSize() up front for all messages.
415d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // In most cases, getSerializedSize() will have already been called anyway by
416d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // one of the wrapper writeTo() methods, making this call cheap.
417d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(
418d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "getSerializedSize();\n");
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->extension_range_count() > 0) {
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->options().message_set_wire_format()) {
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "com.google.protobuf.GeneratedMessage$lite$.ExtendableMessage\n"
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  .ExtensionWriter extensionWriter =\n"
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    newMessageSetExtensionWriter();\n",
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "lite", HasDescriptorMethods(descriptor_) ? "" : "Lite");
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "com.google.protobuf.GeneratedMessage$lite$.ExtendableMessage\n"
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  .ExtensionWriter extensionWriter = newExtensionWriter();\n",
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "lite", HasDescriptorMethods(descriptor_) ? "" : "Lite");
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Merge the fields and the extension ranges, both sorted by field number.
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0, j = 0;
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       i < descriptor_->field_count() || j < sorted_extensions.size();
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       ) {
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (i == descriptor_->field_count()) {
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else if (j == sorted_extensions.size()) {
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GenerateSerializeOneField(printer, sorted_fields[i++]);
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else if (sorted_fields[i]->number() < sorted_extensions[j]->start) {
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GenerateSerializeOneField(printer, sorted_fields[i++]);
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUnknownFields(descriptor_)) {
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->options().message_set_wire_format()) {
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "getUnknownFields().writeAsMessageSetTo(output);\n");
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "getUnknownFields().writeTo(output);\n");
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "private int memoizedSerializedSize = -1;\n"
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public int getSerializedSize() {\n"
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  int size = memoizedSerializedSize;\n"
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if (size != -1) return size;\n"
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  size = 0;\n");
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer);
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->extension_range_count() > 0) {
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->options().message_set_wire_format()) {
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "size += extensionsSerializedSizeAsMessageSet();\n");
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "size += extensionsSerializedSize();\n");
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUnknownFields(descriptor_)) {
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->options().message_set_wire_format()) {
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "size += getUnknownFields().getSerializedSizeAsMessageSet();\n");
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "size += getUnknownFields().getSerializedSize();\n");
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  memoizedSerializedSize = size;\n"
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return size;\n"
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n");
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateParseFromMethods(io::Printer* printer) {
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Note:  These are separate from GenerateMessageSerializationMethods()
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   because they need to be generated even for messages that are optimized
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   for code size.
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseFrom(\n"
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.ByteString data)\n"
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(data).buildParsed();\n"
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseFrom(\n"
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.ByteString data,\n"
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(data, extensionRegistry)\n"
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "           .buildParsed();\n"
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseFrom(byte[] data)\n"
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(data).buildParsed();\n"
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseFrom(\n"
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    byte[] data,\n"
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(data, extensionRegistry)\n"
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "           .buildParsed();\n"
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseFrom(java.io.InputStream input)\n"
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws java.io.IOException {\n"
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(input).buildParsed();\n"
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseFrom(\n"
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    java.io.InputStream input,\n"
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws java.io.IOException {\n"
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(input, extensionRegistry)\n"
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "           .buildParsed();\n"
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n"
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws java.io.IOException {\n"
546d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  Builder builder = newBuilder();\n"
547d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  if (builder.mergeDelimitedFrom(input)) {\n"
548d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "    return builder.buildParsed();\n"
549d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  } else {\n"
550d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "    return null;\n"
551d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  }\n"
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseDelimitedFrom(\n"
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    java.io.InputStream input,\n"
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws java.io.IOException {\n"
557d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  Builder builder = newBuilder();\n"
558d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  if (builder.mergeDelimitedFrom(input, extensionRegistry)) {\n"
559d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "    return builder.buildParsed();\n"
560d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  } else {\n"
561d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "    return null;\n"
562d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  }\n"
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseFrom(\n"
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.CodedInputStream input)\n"
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws java.io.IOException {\n"
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(input).buildParsed();\n"
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static $classname$ parseFrom(\n"
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.CodedInputStream input,\n"
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws java.io.IOException {\n"
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(input, extensionRegistry)\n"
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "           .buildParsed();\n"
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n",
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "classname", ClassName(descriptor_));
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateSerializeOneField(
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::Printer* printer, const FieldDescriptor* field) {
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  field_generators_.get(field).GenerateSerializationCode(printer);
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateSerializeOneExtensionRange(
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    io::Printer* printer, const Descriptor::ExtensionRange* range) {
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "extensionWriter.writeUntil($end$, output);\n",
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "end", SimpleItoa(range->end));
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateBuilder(io::Printer* printer) {
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static Builder newBuilder() { return Builder.create(); }\n"
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public Builder newBuilderForType() { return newBuilder(); }\n"
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public static Builder newBuilder($classname$ prototype) {\n"
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return newBuilder().mergeFrom(prototype);\n"
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public Builder toBuilder() { return newBuilder(this); }\n"
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n",
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "classname", ClassName(descriptor_));
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->extension_range_count() > 0) {
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (HasDescriptorMethods(descriptor_)) {
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public static final class Builder extends\n"
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    com.google.protobuf.GeneratedMessage.ExtendableBuilder<\n"
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "      $classname$, Builder> {\n",
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", ClassName(descriptor_));
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public static final class Builder extends\n"
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<\n"
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "      $classname$, Builder> {\n",
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", ClassName(descriptor_));
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (HasDescriptorMethods(descriptor_)) {
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public static final class Builder extends\n"
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    com.google.protobuf.GeneratedMessage.Builder<Builder> {\n",
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", ClassName(descriptor_));
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public static final class Builder extends\n"
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    com.google.protobuf.GeneratedMessageLite.Builder<\n"
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "      $classname$, Builder> {\n",
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", ClassName(descriptor_));
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GenerateCommonBuilderMethods(printer);
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasGeneratedMethods(descriptor_)) {
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GenerateBuilderParsingMethods(printer);
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print("\n");
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    PrintFieldComment(printer, descriptor_->field(i));
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field_generators_.get(descriptor_->field(i))
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     .GenerateBuilderMembers(printer);
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
648d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(
649d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "\n"
650d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "// @@protoc_insertion_point(builder_scope:$full_name$)\n",
651d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "full_name", descriptor_->full_name());
652d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print("}\n");
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateCommonBuilderMethods(io::Printer* printer) {
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "private $classname$ result;\n"
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "// Construct using $classname$.newBuilder()\n"
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "private Builder() {}\n"
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "private static Builder create() {\n"
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Builder builder = new Builder();\n"
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  builder.result = new $classname$();\n"
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return builder;\n"
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "protected $classname$ internalGetResult() {\n"
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return result;\n"
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public Builder clear() {\n"
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if (result == null) {\n"
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throw new IllegalStateException(\n"
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      \"Cannot call clear() after build().\");\n"
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  result = new $classname$();\n"
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return this;\n"
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public Builder clone() {\n"
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return create().mergeFrom(result);\n"
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n",
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "classname", ClassName(descriptor_));
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasDescriptorMethods(descriptor_)) {
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "public com.google.protobuf.Descriptors.Descriptor\n"
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    getDescriptorForType() {\n"
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  return $classname$.getDescriptor();\n"
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n"
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "\n",
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "classname", ClassName(descriptor_));
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public $classname$ getDefaultInstanceForType() {\n"
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $classname$.getDefaultInstance();\n"
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public boolean isInitialized() {\n"
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return result.isInitialized();\n"
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n",
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "classname", ClassName(descriptor_));
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // -----------------------------------------------------------------
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public $classname$ build() {\n"
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // If result == null, we'll throw an appropriate exception later.
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if (result != null && !isInitialized()) {\n"
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throw newUninitializedMessageException(result);\n"
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return buildPartial();\n"
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "private $classname$ buildParsed()\n"
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if (!isInitialized()) {\n"
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throw newUninitializedMessageException(\n"
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      result).asInvalidProtocolBufferException();\n"
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return buildPartial();\n"
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n"
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public $classname$ buildPartial() {\n"
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if (result == null) {\n"
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throw new IllegalStateException(\n"
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      \"build() has already been called on this Builder.\");\n"
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n",
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "classname", ClassName(descriptor_));
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field_generators_.get(descriptor_->field(i)).GenerateBuildingCode(printer);
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $classname$ returnMe = result;\n"
744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  result = null;\n"
745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return returnMe;\n"
746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n",
748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "classname", ClassName(descriptor_));
749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // -----------------------------------------------------------------
751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasGeneratedMethods(descriptor_)) {
753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // MergeFrom(Message other) requires the ability to distinguish the other
754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // messages type by its descriptor.
755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (HasDescriptorMethods(descriptor_)) {
756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "public Builder mergeFrom(com.google.protobuf.Message other) {\n"
758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  if (other instanceof $classname$) {\n"
759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    return mergeFrom(($classname$)other);\n"
760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  } else {\n"
761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    super.mergeFrom(other);\n"
762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    return this;\n"
763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  }\n"
764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "}\n"
765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "\n",
766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "classname", ClassName(descriptor_));
767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "public Builder mergeFrom($classname$ other) {\n"
771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Optimization:  If other is the default instance, we know none of its
772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      //   fields are set so we can skip the merge.
773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  if (other == $classname$.getDefaultInstance()) return this;\n",
774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "classname", ClassName(descriptor_));
775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Indent();
776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < descriptor_->field_count(); i++) {
778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field_generators_.get(descriptor_->field(i)).GenerateMergingCode(printer);
779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Outdent();
782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // if message type has extensions
784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (descriptor_->extension_range_count() > 0) {
785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  this.mergeExtensionFields(other);\n");
787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (HasUnknownFields(descriptor_)) {
790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  this.mergeUnknownFields(other.getUnknownFields());\n");
792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  return this;\n"
796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n"
797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "\n");
798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateBuilderParsingMethods(io::Printer* printer) {
804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_array<const FieldDescriptor*> sorted_fields(
805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SortFieldsByNumber(descriptor_));
806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public Builder mergeFrom(\n"
809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.CodedInputStream input,\n"
810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    throws java.io.IOException {\n");
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUnknownFields(descriptor_)) {
815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "com.google.protobuf.UnknownFieldSet.Builder unknownFields =\n"
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  com.google.protobuf.UnknownFieldSet.newBuilder(\n"
818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    this.getUnknownFields());\n");
819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "while (true) {\n");
823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "int tag = input.readTag();\n"
827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "switch (tag) {\n");
828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasUnknownFields(descriptor_)) {
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "case 0:\n"          // zero signals EOF / limit reached
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  this.setUnknownFields(unknownFields.build());\n"
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  return this;\n"
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "default: {\n"
836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  if (!parseUnknownField(input, unknownFields,\n"
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "                         extensionRegistry, tag)) {\n"
838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    this.setUnknownFields(unknownFields.build());\n"
839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    return this;\n"   // it's an endgroup tag
840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  }\n"
841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  break;\n"
842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "case 0:\n"          // zero signals EOF / limit reached
846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  return this;\n"
847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "default: {\n"
848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  if (!parseUnknownField(input, extensionRegistry, tag)) {\n"
849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    return this;\n"   // it's an endgroup tag
850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  }\n"
851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  break;\n"
852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = sorted_fields[i];
857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint32 tag = WireFormatLite::MakeTag(field->number(),
858d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      WireFormat::WireTypeForFieldType(field->type()));
859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "case $tag$: {\n",
862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "tag", SimpleItoa(tag));
863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Indent();
864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field_generators_.get(field).GenerateParsingCode(printer);
866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Outdent();
868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  break;\n"
870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
871d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
872d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if (field->is_packable()) {
873d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      // To make packed = true wire compatible, we generate parsing code from a
874d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      // packed version of this field regardless of field->options().packed().
875d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      uint32 packed_tag = WireFormatLite::MakeTag(field->number(),
876d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
877d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      printer->Print(
878d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        "case $tag$: {\n",
879d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        "tag", SimpleItoa(packed_tag));
880d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      printer->Indent();
881d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
882d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      field_generators_.get(field).GenerateParsingCodeFromPacked(printer);
883d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
884d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      printer->Outdent();
885d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      printer->Print(
886d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        "  break;\n"
887d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        "}\n");
888d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    }\n"     // switch (tag)
896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"       // while (true)
897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n");
899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateIsInitialized(io::Printer* printer) {
904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "public final boolean isInitialized() {\n");
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Check that all required fields in this message are set.
909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // TODO(kenton):  We can optimize this when we switch to putting all the
910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   "has" fields into a single bitfield.
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = descriptor_->field(i);
913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_required()) {
915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      printer->Print(
916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "if (!has$name$) return false;\n",
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "name", UnderscoresToCapitalizedCamelCase(field));
918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Now check that all embedded messages are initialized.
922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = descriptor_->field(i);
924d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if (GetJavaType(field) == JAVATYPE_MESSAGE &&
925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HasRequiredFields(field->message_type())) {
926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (field->label()) {
927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::LABEL_REQUIRED:
928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          printer->Print(
929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "if (!get$name$().isInitialized()) return false;\n",
930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "type", ClassName(field->message_type()),
931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "name", UnderscoresToCapitalizedCamelCase(field));
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::LABEL_OPTIONAL:
934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          printer->Print(
935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "if (has$name$()) {\n"
936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "  if (!get$name$().isInitialized()) return false;\n"
937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "}\n",
938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "type", ClassName(field->message_type()),
939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "name", UnderscoresToCapitalizedCamelCase(field));
940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::LABEL_REPEATED:
942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          printer->Print(
943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "for ($type$ element : get$name$List()) {\n"
944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "  if (!element.isInitialized()) return false;\n"
945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "}\n",
946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "type", ClassName(field->message_type()),
947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "name", UnderscoresToCapitalizedCamelCase(field));
948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->extension_range_count() > 0) {
954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(
955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "if (!extensionsAreInitialized()) return false;\n");
956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return true;\n"
961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "\n");
963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageGenerator::GenerateExtensionRegistrationCode(io::Printer* printer) {
968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->extension_count(); i++) {
969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ExtensionGenerator(descriptor_->extension(i))
970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      .GenerateRegistrationCode(printer);
971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->nested_type_count(); i++) {
974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MessageGenerator(descriptor_->nested_type(i))
975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      .GenerateExtensionRegistrationCode(printer);
976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace java
980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
983