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