1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format
2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc.  All rights reserved.
3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/
4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without
6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are
7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met:
8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions of source code must retain the above copyright
10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer.
11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions in binary form must reproduce the above
12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer
13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the
14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution.
15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Neither the name of Google Inc. nor the names of its
16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from
17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission.
18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/java/java_map_field.h>
32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/java/java_context.h>
34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/java/java_doc_comment.h>
35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/java/java_helpers.h>
36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/java/java_name_resolver.h>
37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/io/printer.h>
38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace google {
40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace protobuf {
41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace compiler {
42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace java {
43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace {
45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerconst FieldDescriptor* KeyField(const FieldDescriptor* descriptor) {
47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type());
48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const Descriptor* message = descriptor->message_type();
49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  GOOGLE_CHECK(message->options().map_entry());
50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return message->FindFieldByName("key");
51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerconst FieldDescriptor* ValueField(const FieldDescriptor* descriptor) {
54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type());
55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const Descriptor* message = descriptor->message_type();
56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  GOOGLE_CHECK(message->options().map_entry());
57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return message->FindFieldByName("value");
58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring TypeName(const FieldDescriptor* field,
61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                ClassNameResolver* name_resolver,
62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                bool boxed) {
63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (GetJavaType(field) == JAVATYPE_MESSAGE) {
64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return name_resolver->GetImmutableClassName(field->message_type());
65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else if (GetJavaType(field) == JAVATYPE_ENUM) {
66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return name_resolver->GetImmutableClassName(field->enum_type());
67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return boxed ? BoxedPrimitiveTypeName(GetJavaType(field))
69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                 : PrimitiveTypeName(GetJavaType(field));
70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring WireType(const FieldDescriptor* field) {
74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return "com.google.protobuf.WireFormat.FieldType." +
75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      string(FieldTypeName(field->type()));
76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid SetMessageVariables(const FieldDescriptor* descriptor,
79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                         int messageBitIndex,
80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                         int builderBitIndex,
81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                         const FieldGeneratorInfo* info,
82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                         Context* context,
83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                         map<string, string>* variables) {
84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  SetCommonFieldVariables(descriptor, info, variables);
85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ClassNameResolver* name_resolver = context->GetNameResolver();
86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["type"] =
88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      name_resolver->GetImmutableClassName(descriptor->message_type());
89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const FieldDescriptor* key = KeyField(descriptor);
90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const FieldDescriptor* value = ValueField(descriptor);
91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["key_type"] = TypeName(key, name_resolver, false);
92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["boxed_key_type"] = TypeName(key, name_resolver, true);
93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["key_wire_type"] = WireType(key);
94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["key_default_value"] = DefaultValue(key, true, name_resolver);
95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (GetJavaType(value) == JAVATYPE_ENUM) {
96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // We store enums as Integers internally.
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["value_type"] = "int";
98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["boxed_value_type"] = "java.lang.Integer";
99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["value_wire_type"] = WireType(value);
100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["value_default_value"] =
101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        DefaultValue(value, true, name_resolver) + ".getNumber()";
102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["value_enum_type"] = TypeName(value, name_resolver, false);
104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportUnknownEnumValue(descriptor->file())) {
106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Map unknown values to a special UNRECOGNIZED value if supported.
107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      (*variables)["unrecognized_value"] =
108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          (*variables)["value_enum_type"] + ".UNRECOGNIZED";
109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    } else {
110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Map unknown values to the default value if we don't have UNRECOGNIZED.
111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      (*variables)["unrecognized_value"] =
112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          DefaultValue(value, true, name_resolver);
113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["value_type"] = TypeName(value, name_resolver, false);
116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["boxed_value_type"] = TypeName(value, name_resolver, true);
117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["value_wire_type"] = WireType(value);
118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["value_default_value"] =
119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        DefaultValue(value, true, name_resolver);
120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["type_parameters"] =
122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      (*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"];
123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // by the proto compiler
125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["deprecation"] = descriptor->options().deprecated()
126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      ? "@java.lang.Deprecated " : "";
127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["on_changed"] = "onChanged();";
128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // For repeated fields, one bit is used for whether the array is immutable
130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // in the parsing constructor.
131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["get_mutable_bit_parser"] =
132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      GenerateGetBitMutableLocal(builderBitIndex);
133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["set_mutable_bit_parser"] =
134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      GenerateSetBitMutableLocal(builderBitIndex);
135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["default_entry"] = (*variables)["capitalized_name"] +
137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DefaultEntryHolder.defaultEntry";
138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["lite"] = "";
139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["map_field_parameter"] = (*variables)["default_entry"];
140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["descriptor"] =
141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      name_resolver->GetImmutableClassName(descriptor->file()) +
142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      ".internal_" + UniqueFileScopeIdentifier(descriptor->message_type()) +
143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "_descriptor, ";
144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace
147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerImmutableMapFieldGenerator::
149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerImmutableMapFieldGenerator(const FieldDescriptor* descriptor,
150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                       int messageBitIndex,
151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                       int builderBitIndex,
152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                       Context* context)
153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  : descriptor_(descriptor), name_resolver_(context->GetNameResolver())  {
154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                      context->GetFieldGeneratorInfo(descriptor),
156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                      context, &variables_);
157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerImmutableMapFieldGenerator::
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer~ImmutableMapFieldGenerator() {}
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerint ImmutableMapFieldGenerator::GetNumBitsForMessage() const {
163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return 0;
164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerint ImmutableMapFieldGenerator::GetNumBitsForBuilder() const {
167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return 1;
168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInterfaceMembers(io::Printer* printer) const {
172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$deprecation$java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "get$capitalized_name$();\n");
178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportUnknownEnumValue(descriptor_->file())) {
179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      WriteFieldDocComment(printer, descriptor_);
180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(
181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          variables_,
182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "$deprecation$java.util.Map<$type_parameters$>\n"
183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "get$capitalized_name$Value();\n");
184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$deprecation$java.util.Map<$type_parameters$>\n"
190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "get$capitalized_name$();\n");
191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateMembers(io::Printer* printer) const {
196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "private static final class $capitalized_name$DefaultEntryHolder {\n"
199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  static final com.google.protobuf.MapEntry$lite$<\n"
200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      $type_parameters$> defaultEntry =\n"
201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "          com.google.protobuf.MapEntry$lite$\n"
202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "          .<$type_parameters$>newDefaultInstance(\n"
203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "              $descriptor$\n"
204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "              $key_wire_type$,\n"
205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "              $key_default_value$,\n"
206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "              $value_wire_type$,\n"
207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "              $value_default_value$);\n"
208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "private com.google.protobuf.MapField$lite$<\n"
212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $type_parameters$> $name$_;\n"
213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "private com.google.protobuf.MapField$lite$<$type_parameters$>\n"
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "internalGet$capitalized_name$() {\n"
215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$_ == null) {\n"
216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return com.google.protobuf.MapField$lite$.emptyMapField(\n"
217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "        $map_field_parameter$);\n"
218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_;\n"
220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "private static final\n"
225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "com.google.protobuf.Internal.MapAdapter.Converter<\n"
226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    java.lang.Integer, $value_enum_type$> $name$ValueConverter =\n"
227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "        com.google.protobuf.Internal.MapAdapter.newEnumConverter(\n"
228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "            $value_enum_type$.internalGetValueMap(),\n"
229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "            $unrecognized_value$);\n");
230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportUnknownEnumValue(descriptor_->file())) {
231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      WriteFieldDocComment(printer, descriptor_);
232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(
233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          variables_,
234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "$deprecation$\n"
235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "get$capitalized_name$Value() {\n"
237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "  return internalGet$capitalized_name$().getMap();\n"
238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "}\n");
239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$deprecation$\n"
244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "get$capitalized_name$() {\n"
246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  return new com.google.protobuf.Internal.MapAdapter<\n"
247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "          internalGet$capitalized_name$().getMap(),\n"
249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "          $name$ValueConverter);\n"
250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$deprecation$\n"
256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "public java.util.Map<$type_parameters$> get$capitalized_name$() {\n"
257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  return internalGet$capitalized_name$().getMap();\n"
258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateBuilderMembers(io::Printer* printer) const {
264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "private com.google.protobuf.MapField$lite$<\n"
267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $type_parameters$> $name$_;\n"
268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "private com.google.protobuf.MapField$lite$<$type_parameters$>\n"
269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "internalGet$capitalized_name$() {\n"
270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$_ == null) {\n"
271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return com.google.protobuf.MapField$lite$.emptyMapField(\n"
272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "        $map_field_parameter$);\n"
273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_;\n"
275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "private com.google.protobuf.MapField$lite$<$type_parameters$>\n"
277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "internalGetMutable$capitalized_name$() {\n"
278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $on_changed$;\n"
279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$_ == null) {\n"
280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$_ = com.google.protobuf.MapField$lite$.newMapField(\n"
281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "        $map_field_parameter$);\n"
282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if (!$name$_.isMutable()) {\n"
284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$_ = $name$_.copy();\n"
285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_;\n"
287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$deprecation$\n"
293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "get$capitalized_name$() {\n"
295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  return new com.google.protobuf.Internal.MapAdapter<\n"
296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "          internalGet$capitalized_name$().getMap(),\n"
298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "          $name$ValueConverter);\n"
299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$deprecation$\n"
304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "getMutable$capitalized_name$() {\n"
306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  return new com.google.protobuf.Internal.MapAdapter<\n"
307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n"
308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "          internalGetMutable$capitalized_name$().getMutableMap(),\n"
309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "          $name$ValueConverter);\n"
310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$deprecation$public Builder putAll$capitalized_name$(\n"
315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    java.util.Map<$boxed_key_type$, $value_enum_type$> values) {\n"
316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  getMutable$capitalized_name$().putAll(values);\n"
317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  return this;\n"
318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportUnknownEnumValue(descriptor_->file())) {
320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      WriteFieldDocComment(printer, descriptor_);
321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(
322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          variables_,
323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "$deprecation$\n"
324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "get$capitalized_name$Value() {\n"
326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "  return internalGet$capitalized_name$().getMap();\n"
327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "}\n");
328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      WriteFieldDocComment(printer, descriptor_);
329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(
330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          variables_,
331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "$deprecation$\n"
332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n"
333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "getMutable$capitalized_name$Value() {\n"
334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "  return internalGetMutable$capitalized_name$().getMutableMap();\n"
335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "}\n");
336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      WriteFieldDocComment(printer, descriptor_);
337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(
338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          variables_,
339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "$deprecation$public Builder putAll$capitalized_name$Value(\n"
340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "    java.util.Map<$boxed_key_type$, $boxed_value_type$> values) {\n"
341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "  getMutable$capitalized_name$Value().putAll(values);\n"
342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "  return this;\n"
343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "}\n");
344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "public java.util.Map<$type_parameters$> get$capitalized_name$() {\n"
350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  return internalGet$capitalized_name$().getMap();\n"
351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "public java.util.Map<$type_parameters$>\n"
356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "getMutable$capitalized_name$() {\n"
357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  return internalGetMutable$capitalized_name$().getMutableMap();\n"
358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$deprecation$public Builder putAll$capitalized_name$(\n"
363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    java.util.Map<$type_parameters$> values) {\n"
364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  getMutable$capitalized_name$().putAll(values);\n"
365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  return this;\n"
366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Nothing to initialize.
373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInitializationCode(io::Printer* printer) const {
377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Nothing to initialize.
378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateBuilderClearCode(io::Printer* printer) const {
382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "internalGetMutable$capitalized_name$().clear();\n");
385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateMergingCode(io::Printer* printer) const {
389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "internalGetMutable$capitalized_name$().mergeFrom(\n"
392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    other.internalGet$capitalized_name$());\n");
393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateBuildingCode(io::Printer* printer) const {
397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "result.$name$_ = internalGet$capitalized_name$();\n"
400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "result.$name$_.makeImmutable();\n");
401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateParsingCode(io::Printer* printer) const {
405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "if (!$get_mutable_bit_parser$) {\n"
408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = com.google.protobuf.MapField$lite$.newMapField(\n"
409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      $map_field_parameter$);\n"
410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $set_mutable_bit_parser$;\n"
411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!SupportUnknownEnumValue(descriptor_->file()) &&
413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "com.google.protobuf.ByteString bytes = input.readBytes();\n"
417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$name$ = $default_entry$.getParserForType().parseFrom(bytes);\n");
419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "if ($value_enum_type$.forNumber($name$.getValue()) == null) {\n"
422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  unknownFields.mergeLengthDelimitedField($number$, bytes);\n"
423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "} else {\n"
424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "  $name$_.getMutableMap().put($name$.getKey(), $name$.getValue());\n"
425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "}\n");
426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(
428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables_,
429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$name$ = input.readMessage(\n"
431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    $default_entry$.getParserForType(), extensionRegistry);\n"
432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "$name$_.getMutableMap().put($name$.getKey(), $name$.getValue());\n");
433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateParsingDoneCode(io::Printer* printer) const {
438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Nothing to do here.
439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateSerializationCode(io::Printer* printer) const {
443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "for (java.util.Map.Entry<$type_parameters$> entry\n"
446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "     : internalGet$capitalized_name$().getMap().entrySet()) {\n"
447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$ = $default_entry$.newBuilderForType()\n"
449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      .setKey(entry.getKey())\n"
450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      .setValue(entry.getValue())\n"
451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      .build();\n"
452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  output.writeMessage($number$, $name$);\n"
453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateSerializedSizeCode(io::Printer* printer) const {
458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "for (java.util.Map.Entry<$type_parameters$> entry\n"
461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "     : internalGet$capitalized_name$().getMap().entrySet()) {\n"
462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  com.google.protobuf.MapEntry$lite$<$type_parameters$>\n"
463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$ = $default_entry$.newBuilderForType()\n"
464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      .setKey(entry.getKey())\n"
465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      .setValue(entry.getValue())\n"
466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      .build();\n"
467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  size += com.google.protobuf.CodedOutputStream\n"
468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      .computeMessageSize($number$, $name$);\n"
469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateEqualsCode(io::Printer* printer) const {
474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "result = result && internalGet$capitalized_name$().equals(\n"
477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    other.internalGet$capitalized_name$());\n");
478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ImmutableMapFieldGenerator::
481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateHashCode(io::Printer* printer) const {
482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(
483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables_,
484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "if (!internalGet$capitalized_name$().getMap().isEmpty()) {\n"
485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  hash = (37 * hash) + $constant_name$;\n"
486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  hash = (53 * hash) + internalGet$capitalized_name$().hashCode();\n"
487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring ImmutableMapFieldGenerator::GetBoxedType() const {
491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return name_resolver_->GetImmutableClassName(descriptor_->message_type());
492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace java
495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace compiler
496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace protobuf
497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace google
498