Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: third_party/protobuf/src/google/protobuf/compiler/java/java_message.cc

Issue 2600753002: Reverts third_party/protobuf: Update to HEAD (f52e188fe4) (Closed)
Patch Set: Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 103
104 void ImmutableMessageGenerator::GenerateStaticVariables( 104 void ImmutableMessageGenerator::GenerateStaticVariables(
105 io::Printer* printer, int* bytecode_estimate) { 105 io::Printer* printer, int* bytecode_estimate) {
106 // Because descriptor.proto (com.google.protobuf.DescriptorProtos) is 106 // Because descriptor.proto (com.google.protobuf.DescriptorProtos) is
107 // used in the construction of descriptors, we have a tricky bootstrapping 107 // used in the construction of descriptors, we have a tricky bootstrapping
108 // problem. To help control static initialization order, we make sure all 108 // problem. To help control static initialization order, we make sure all
109 // descriptors and other static data that depends on them are members of 109 // descriptors and other static data that depends on them are members of
110 // the outermost class in the file. This way, they will be initialized in 110 // the outermost class in the file. This way, they will be initialized in
111 // a deterministic order. 111 // a deterministic order.
112 112
113 std::map<string, string> vars; 113 map<string, string> vars;
114 vars["identifier"] = UniqueFileScopeIdentifier(descriptor_); 114 vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
115 vars["index"] = SimpleItoa(descriptor_->index()); 115 vars["index"] = SimpleItoa(descriptor_->index());
116 vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_); 116 vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_);
117 if (descriptor_->containing_type() != NULL) { 117 if (descriptor_->containing_type() != NULL) {
118 vars["parent"] = UniqueFileScopeIdentifier( 118 vars["parent"] = UniqueFileScopeIdentifier(
119 descriptor_->containing_type()); 119 descriptor_->containing_type());
120 } 120 }
121 if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) { 121 if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) {
122 // We can only make these package-private since the classes that use them 122 // We can only make these package-private since the classes that use them
123 // are in separate files. 123 // are in separate files.
(...skipping 23 matching lines...) Expand all
147 for (int i = 0; i < descriptor_->nested_type_count(); i++) { 147 for (int i = 0; i < descriptor_->nested_type_count(); i++) {
148 // TODO(kenton): Reuse MessageGenerator objects? 148 // TODO(kenton): Reuse MessageGenerator objects?
149 ImmutableMessageGenerator(descriptor_->nested_type(i), context_) 149 ImmutableMessageGenerator(descriptor_->nested_type(i), context_)
150 .GenerateStaticVariables(printer, bytecode_estimate); 150 .GenerateStaticVariables(printer, bytecode_estimate);
151 } 151 }
152 } 152 }
153 153
154 int ImmutableMessageGenerator::GenerateStaticVariableInitializers( 154 int ImmutableMessageGenerator::GenerateStaticVariableInitializers(
155 io::Printer* printer) { 155 io::Printer* printer) {
156 int bytecode_estimate = 0; 156 int bytecode_estimate = 0;
157 std::map<string, string> vars; 157 map<string, string> vars;
158 vars["identifier"] = UniqueFileScopeIdentifier(descriptor_); 158 vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
159 vars["index"] = SimpleItoa(descriptor_->index()); 159 vars["index"] = SimpleItoa(descriptor_->index());
160 vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_); 160 vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_);
161 if (descriptor_->containing_type() != NULL) { 161 if (descriptor_->containing_type() != NULL) {
162 vars["parent"] = UniqueFileScopeIdentifier( 162 vars["parent"] = UniqueFileScopeIdentifier(
163 descriptor_->containing_type()); 163 descriptor_->containing_type());
164 } 164 }
165 165
166 // The descriptor for this type. 166 // The descriptor for this type.
167 if (descriptor_->containing_type() == NULL) { 167 if (descriptor_->containing_type() == NULL) {
(...skipping 16 matching lines...) Expand all
184 // TODO(kenton): Reuse MessageGenerator objects? 184 // TODO(kenton): Reuse MessageGenerator objects?
185 bytecode_estimate += 185 bytecode_estimate +=
186 ImmutableMessageGenerator(descriptor_->nested_type(i), context_) 186 ImmutableMessageGenerator(descriptor_->nested_type(i), context_)
187 .GenerateStaticVariableInitializers(printer); 187 .GenerateStaticVariableInitializers(printer);
188 } 188 }
189 return bytecode_estimate; 189 return bytecode_estimate;
190 } 190 }
191 191
192 void ImmutableMessageGenerator:: 192 void ImmutableMessageGenerator::
193 GenerateFieldAccessorTable(io::Printer* printer, int* bytecode_estimate) { 193 GenerateFieldAccessorTable(io::Printer* printer, int* bytecode_estimate) {
194 std::map<string, string> vars; 194 map<string, string> vars;
195 vars["identifier"] = UniqueFileScopeIdentifier(descriptor_); 195 vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
196 if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) { 196 if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) {
197 // We can only make these package-private since the classes that use them 197 // We can only make these package-private since the classes that use them
198 // are in separate files. 198 // are in separate files.
199 vars["private"] = ""; 199 vars["private"] = "";
200 } else { 200 } else {
201 vars["private"] = "private "; 201 vars["private"] = "private ";
202 } 202 }
203 if (*bytecode_estimate <= kMaxStaticSize) { 203 if (*bytecode_estimate <= kMaxStaticSize) {
204 vars["final"] = "final "; 204 vars["final"] = "final ";
205 } else { 205 } else {
206 vars["final"] = ""; 206 vars["final"] = "";
207 } 207 }
208 vars["ver"] = GeneratedCodeVersionSuffix();
209 printer->Print(vars, 208 printer->Print(vars,
210 "$private$static $final$\n" 209 "$private$static $final$\n"
211 " com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n" 210 " com.google.protobuf.GeneratedMessage.FieldAccessorTable\n"
212 " internal_$identifier$_fieldAccessorTable;\n"); 211 " internal_$identifier$_fieldAccessorTable;\n");
213 212
214 // 6 bytes per field and oneof 213 // 6 bytes per field and oneof
215 *bytecode_estimate += 10 + 6 * descriptor_->field_count() 214 *bytecode_estimate += 10 + 6 * descriptor_->field_count()
216 + 6 * descriptor_->oneof_decl_count(); 215 + 6 * descriptor_->oneof_decl_count();
217 } 216 }
218 217
219 int ImmutableMessageGenerator:: 218 int ImmutableMessageGenerator::
220 GenerateFieldAccessorTableInitializer(io::Printer* printer) { 219 GenerateFieldAccessorTableInitializer(io::Printer* printer) {
221 int bytecode_estimate = 10; 220 int bytecode_estimate = 10;
222 printer->Print( 221 printer->Print(
223 "internal_$identifier$_fieldAccessorTable = new\n" 222 "internal_$identifier$_fieldAccessorTable = new\n"
224 " com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable(\n" 223 " com.google.protobuf.GeneratedMessage.FieldAccessorTable(\n"
225 " internal_$identifier$_descriptor,\n" 224 " internal_$identifier$_descriptor,\n"
226 " new java.lang.String[] { ", 225 " new java.lang.String[] { ",
227 "identifier", UniqueFileScopeIdentifier(descriptor_), 226 "identifier",
228 "ver", GeneratedCodeVersionSuffix()); 227 UniqueFileScopeIdentifier(descriptor_));
229 for (int i = 0; i < descriptor_->field_count(); i++) { 228 for (int i = 0; i < descriptor_->field_count(); i++) {
230 const FieldDescriptor* field = descriptor_->field(i); 229 const FieldDescriptor* field = descriptor_->field(i);
231 const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); 230 const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
232 bytecode_estimate += 6; 231 bytecode_estimate += 6;
233 printer->Print( 232 printer->Print(
234 "\"$field_name$\", ", 233 "\"$field_name$\", ",
235 "field_name", info->capitalized_name); 234 "field_name", info->capitalized_name);
236 } 235 }
237 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { 236 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
238 const OneofDescriptor* oneof = descriptor_->oneof_decl(i); 237 const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
239 const OneofGeneratorInfo* info = context_->GetOneofGeneratorInfo(oneof); 238 const OneofGeneratorInfo* info = context_->GetOneofGeneratorInfo(oneof);
240 bytecode_estimate += 6; 239 bytecode_estimate += 6;
241 printer->Print( 240 printer->Print(
242 "\"$oneof_name$\", ", 241 "\"$oneof_name$\", ",
243 "oneof_name", info->capitalized_name); 242 "oneof_name", info->capitalized_name);
244 } 243 }
245 printer->Print("});\n"); 244 printer->Print("});\n");
246 return bytecode_estimate; 245 return bytecode_estimate;
247 } 246 }
248 247
249 // =================================================================== 248 // ===================================================================
250 249
251 void ImmutableMessageGenerator::GenerateInterface(io::Printer* printer) { 250 void ImmutableMessageGenerator::GenerateInterface(io::Printer* printer) {
252 MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
253 /* immutable = */ true, "OrBuilder");
254 if (descriptor_->extension_range_count() > 0) { 251 if (descriptor_->extension_range_count() > 0) {
255 printer->Print( 252 printer->Print(
256 "public interface $classname$OrBuilder$idend$ extends\n" 253 "public interface $classname$OrBuilder extends\n"
257 " $extra_interfaces$\n" 254 " $extra_interfaces$\n"
258 " com.google.protobuf.GeneratedMessage$ver$.\n" 255 " com.google.protobuf.GeneratedMessage.\n"
259 " ExtendableMessageOrBuilder<$classname$> {\n", 256 " ExtendableMessageOrBuilder<$classname$> {\n",
260 "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_), 257 "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
261 "classname", descriptor_->name(), 258 "classname", descriptor_->name());
262 "idend", "", "ver", GeneratedCodeVersionSuffix());
263 } else { 259 } else {
264 printer->Print( 260 printer->Print(
265 "public interface $classname$OrBuilder$idend$ extends\n" 261 "public interface $classname$OrBuilder extends\n"
266 " $extra_interfaces$\n" 262 " $extra_interfaces$\n"
267 " com.google.protobuf.MessageOrBuilder {\n", 263 " com.google.protobuf.MessageOrBuilder {\n",
268 "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_), 264 "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
269 "classname", descriptor_->name(), 265 "classname", descriptor_->name());
270 "idend", "");
271 } 266 }
272 printer->Annotate("classname", "idend", descriptor_);
273 267
274 printer->Indent(); 268 printer->Indent();
275 for (int i = 0; i < descriptor_->field_count(); i++) { 269 for (int i = 0; i < descriptor_->field_count(); i++) {
276 printer->Print("\n"); 270 printer->Print("\n");
277 field_generators_.get(descriptor_->field(i)) 271 field_generators_.get(descriptor_->field(i))
278 .GenerateInterfaceMembers(printer); 272 .GenerateInterfaceMembers(printer);
279 } 273 }
280 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { 274 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
281 printer->Print( 275 printer->Print(
282 "\n" 276 "\n"
283 "public $classname$.$oneof_capitalized_name$Case " 277 "public $classname$.$oneof_capitalized_name$Case "
284 "get$oneof_capitalized_name$Case();\n", 278 "get$oneof_capitalized_name$Case();\n",
285 "oneof_capitalized_name", 279 "oneof_capitalized_name",
286 context_->GetOneofGeneratorInfo( 280 context_->GetOneofGeneratorInfo(
287 descriptor_->oneof_decl(i))->capitalized_name, 281 descriptor_->oneof_decl(i))->capitalized_name,
288 "classname", 282 "classname",
289 context_->GetNameResolver()->GetImmutableClassName( 283 context_->GetNameResolver()->GetImmutableClassName(
290 descriptor_)); 284 descriptor_));
291 } 285 }
292 printer->Outdent(); 286 printer->Outdent();
293 287
294 printer->Print("}\n"); 288 printer->Print("}\n");
295 } 289 }
296 290
297 // =================================================================== 291 // ===================================================================
298 292
299 void ImmutableMessageGenerator::Generate(io::Printer* printer) { 293 void ImmutableMessageGenerator::Generate(io::Printer* printer) {
300 bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true); 294 bool is_own_file =
295 descriptor_->containing_type() == NULL &&
296 MultipleJavaFiles(descriptor_->file(), /* immutable = */ true);
301 297
302 std::map<string, string> variables; 298 map<string, string> variables;
303 variables["static"] = is_own_file ? " " : " static "; 299 variables["static"] = is_own_file ? " " : " static ";
304 variables["classname"] = descriptor_->name(); 300 variables["classname"] = descriptor_->name();
305 variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_); 301 variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_);
306 variables["ver"] = GeneratedCodeVersionSuffix();
307 302
308 WriteMessageDocComment(printer, descriptor_); 303 WriteMessageDocComment(printer, descriptor_);
309 MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
310 /* immutable = */ true);
311 304
312 // The builder_type stores the super type name of the nested Builder class. 305 // The builder_type stores the super type name of the nested Builder class.
313 string builder_type; 306 string builder_type;
314 if (descriptor_->extension_range_count() > 0) { 307 if (descriptor_->extension_range_count() > 0) {
315 printer->Print(variables, 308 printer->Print(variables,
316 "public $static$final class $classname$ extends\n"); 309 "public $static$final class $classname$ extends\n"
317 printer->Annotate("classname", descriptor_); 310 " com.google.protobuf.GeneratedMessage.ExtendableMessage<\n"
318 printer->Print( 311 " $classname$> implements\n"
319 variables,
320 " com.google.protobuf.GeneratedMessage$ver$.ExtendableMessage<\n"
321 " $classname$> implements\n"
322 " $extra_interfaces$\n"
323 " $classname$OrBuilder {\n");
324 builder_type = strings::Substitute(
325 "com.google.protobuf.GeneratedMessage$1.ExtendableBuilder<$0, ?>",
326 name_resolver_->GetImmutableClassName(descriptor_),
327 GeneratedCodeVersionSuffix());
328 } else {
329 printer->Print(variables,
330 "public $static$final class $classname$ extends\n");
331 printer->Annotate("classname", descriptor_);
332 printer->Print(variables,
333 " com.google.protobuf.GeneratedMessage$ver$ implements\n"
334 " $extra_interfaces$\n" 312 " $extra_interfaces$\n"
335 " $classname$OrBuilder {\n"); 313 " $classname$OrBuilder {\n");
336 builder_type = strings::Substitute( 314 builder_type = strings::Substitute(
337 "com.google.protobuf.GeneratedMessage$0.Builder<?>", 315 "com.google.protobuf.GeneratedMessage.ExtendableBuilder<$0, ?>",
338 GeneratedCodeVersionSuffix()); 316 name_resolver_->GetImmutableClassName(descriptor_));
317 } else {
318 printer->Print(variables,
319 "public $static$final class $classname$ extends\n"
320 " com.google.protobuf.GeneratedMessage implements\n"
321 " $extra_interfaces$\n"
322 " $classname$OrBuilder {\n");
323 builder_type = "com.google.protobuf.GeneratedMessage.Builder<?>";
339 } 324 }
340 printer->Indent(); 325 printer->Indent();
341 // Using builder_type, instead of Builder, prevents the Builder class from 326 // Using builder_type, instead of Builder, prevents the Builder class from
342 // being loaded into PermGen space when the default instance is created. 327 // being loaded into PermGen space when the default instance is created.
343 // This optimizes the PermGen space usage for clients that do not modify 328 // This optimizes the PermGen space usage for clients that do not modify
344 // messages. 329 // messages.
345 printer->Print( 330 printer->Print(
346 "// Use $classname$.newBuilder() to construct.\n" 331 "// Use $classname$.newBuilder() to construct.\n"
347 "private $classname$($buildertype$ builder) {\n" 332 "private $classname$($buildertype$ builder) {\n"
348 " super(builder);\n" 333 " super(builder);\n"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 .GetNumBitsForMessage(); 387 .GetNumBitsForMessage();
403 } 388 }
404 int totalInts = (totalBits + 31) / 32; 389 int totalInts = (totalBits + 31) / 32;
405 for (int i = 0; i < totalInts; i++) { 390 for (int i = 0; i < totalInts; i++) {
406 printer->Print("private int $bit_field_name$;\n", 391 printer->Print("private int $bit_field_name$;\n",
407 "bit_field_name", GetBitFieldName(i)); 392 "bit_field_name", GetBitFieldName(i));
408 } 393 }
409 } 394 }
410 395
411 // oneof 396 // oneof
412 std::map<string, string> vars; 397 map<string, string> vars;
413 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { 398 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
414 vars["oneof_name"] = context_->GetOneofGeneratorInfo( 399 vars["oneof_name"] = context_->GetOneofGeneratorInfo(
415 descriptor_->oneof_decl(i))->name; 400 descriptor_->oneof_decl(i))->name;
416 vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( 401 vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo(
417 descriptor_->oneof_decl(i))->capitalized_name; 402 descriptor_->oneof_decl(i))->capitalized_name;
418 vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); 403 vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index());
419 // oneofCase_ and oneof_ 404 // oneofCase_ and oneof_
420 printer->Print(vars, 405 printer->Print(vars,
421 "private int $oneof_name$Case_ = 0;\n" 406 "private int $oneof_name$Case_ = 0;\n"
422 "private java.lang.Object $oneof_name$_;\n"); 407 "private java.lang.Object $oneof_name$_;\n");
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 printer->Print("public static final int $constant_name$ = $number$;\n", 478 printer->Print("public static final int $constant_name$ = $number$;\n",
494 "constant_name", FieldConstantName(descriptor_->field(i)), 479 "constant_name", FieldConstantName(descriptor_->field(i)),
495 "number", SimpleItoa(descriptor_->field(i)->number())); 480 "number", SimpleItoa(descriptor_->field(i)->number()));
496 field_generators_.get(descriptor_->field(i)).GenerateMembers(printer); 481 field_generators_.get(descriptor_->field(i)).GenerateMembers(printer);
497 printer->Print("\n"); 482 printer->Print("\n");
498 } 483 }
499 484
500 if (context_->HasGeneratedMethods(descriptor_)) { 485 if (context_->HasGeneratedMethods(descriptor_)) {
501 GenerateIsInitialized(printer); 486 GenerateIsInitialized(printer);
502 GenerateMessageSerializationMethods(printer); 487 GenerateMessageSerializationMethods(printer);
488 }
489
490 if (HasEqualsAndHashCode(descriptor_)) {
503 GenerateEqualsAndHashCode(printer); 491 GenerateEqualsAndHashCode(printer);
504 } 492 }
505 493
506 494
507 GenerateParseFromMethods(printer); 495 GenerateParseFromMethods(printer);
508 GenerateBuilder(printer); 496 GenerateBuilder(printer);
509 497
510 printer->Print( 498 printer->Print(
511 "\n" 499 "\n"
512 "// @@protoc_insertion_point(class_scope:$full_name$)\n", 500 "// @@protoc_insertion_point(class_scope:$full_name$)\n",
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 } 542 }
555 543
556 544
557 // =================================================================== 545 // ===================================================================
558 546
559 void ImmutableMessageGenerator:: 547 void ImmutableMessageGenerator::
560 GenerateMessageSerializationMethods(io::Printer* printer) { 548 GenerateMessageSerializationMethods(io::Printer* printer) {
561 google::protobuf::scoped_array<const FieldDescriptor * > sorted_fields( 549 google::protobuf::scoped_array<const FieldDescriptor * > sorted_fields(
562 SortFieldsByNumber(descriptor_)); 550 SortFieldsByNumber(descriptor_));
563 551
564 std::vector<const Descriptor::ExtensionRange*> sorted_extensions; 552 vector<const Descriptor::ExtensionRange*> sorted_extensions;
565 for (int i = 0; i < descriptor_->extension_range_count(); ++i) { 553 for (int i = 0; i < descriptor_->extension_range_count(); ++i) {
566 sorted_extensions.push_back(descriptor_->extension_range(i)); 554 sorted_extensions.push_back(descriptor_->extension_range(i));
567 } 555 }
568 std::sort(sorted_extensions.begin(), sorted_extensions.end(), 556 std::sort(sorted_extensions.begin(), sorted_extensions.end(),
569 ExtensionRangeOrdering()); 557 ExtensionRangeOrdering());
558
570 printer->Print( 559 printer->Print(
571 "public void writeTo(com.google.protobuf.CodedOutputStream output)\n" 560 "public void writeTo(com.google.protobuf.CodedOutputStream output)\n"
572 " throws java.io.IOException {\n"); 561 " throws java.io.IOException {\n");
573 printer->Indent(); 562 printer->Indent();
574 if (HasPackedFields(descriptor_)) { 563 if (HasPackedFields(descriptor_)) {
575 // writeTo(CodedOutputStream output) might be invoked without 564 // writeTo(CodedOutputStream output) might be invoked without
576 // getSerializedSize() ever being called, but we need the memoized 565 // getSerializedSize() ever being called, but we need the memoized
577 // sizes in case this message has packed fields. Rather than emit checks for 566 // sizes in case this message has packed fields. Rather than emit checks for
578 // each packed field, just call getSerializedSize() up front. 567 // each packed field, just call getSerializedSize() up front.
579 // In most cases, getSerializedSize() will have already been called anyway 568 // In most cases, getSerializedSize() will have already been called anyway
580 // by one of the wrapper writeTo() methods, making this call cheap. 569 // by one of the wrapper writeTo() methods, making this call cheap.
581 printer->Print( 570 printer->Print(
582 "getSerializedSize();\n"); 571 "getSerializedSize();\n");
583 } 572 }
584 573
585 if (descriptor_->extension_range_count() > 0) { 574 if (descriptor_->extension_range_count() > 0) {
586 if (descriptor_->options().message_set_wire_format()) { 575 if (descriptor_->options().message_set_wire_format()) {
587 printer->Print( 576 printer->Print(
588 "com.google.protobuf.GeneratedMessage$ver$\n" 577 "com.google.protobuf.GeneratedMessage\n"
589 " .ExtendableMessage<$classname$>.ExtensionWriter\n" 578 " .ExtendableMessage<$classname$>.ExtensionWriter\n"
590 " extensionWriter = newMessageSetExtensionWriter();\n", 579 " extensionWriter = newMessageSetExtensionWriter();\n",
591 "classname", name_resolver_->GetImmutableClassName(descriptor_), 580 "classname", name_resolver_->GetImmutableClassName(descriptor_));
592 "ver", GeneratedCodeVersionSuffix());
593 } else { 581 } else {
594 printer->Print( 582 printer->Print(
595 "com.google.protobuf.GeneratedMessage$ver$\n" 583 "com.google.protobuf.GeneratedMessage\n"
596 " .ExtendableMessage<$classname$>.ExtensionWriter\n" 584 " .ExtendableMessage<$classname$>.ExtensionWriter\n"
597 " extensionWriter = newExtensionWriter();\n", 585 " extensionWriter = newExtensionWriter();\n",
598 "classname", name_resolver_->GetImmutableClassName(descriptor_), 586 "classname", name_resolver_->GetImmutableClassName(descriptor_));
599 "ver", GeneratedCodeVersionSuffix());
600 } 587 }
601 } 588 }
602 589
603 // Merge the fields and the extension ranges, both sorted by field number. 590 // Merge the fields and the extension ranges, both sorted by field number.
604 for (int i = 0, j = 0; 591 for (int i = 0, j = 0;
605 i < descriptor_->field_count() || j < sorted_extensions.size(); 592 i < descriptor_->field_count() || j < sorted_extensions.size();
606 ) { 593 ) {
607 if (i == descriptor_->field_count()) { 594 if (i == descriptor_->field_count()) {
608 GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]); 595 GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
609 } else if (j == sorted_extensions.size()) { 596 } else if (j == sorted_extensions.size()) {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 " return PARSER.parseFrom(data);\n" 680 " return PARSER.parseFrom(data);\n"
694 "}\n" 681 "}\n"
695 "public static $classname$ parseFrom(\n" 682 "public static $classname$ parseFrom(\n"
696 " byte[] data,\n" 683 " byte[] data,\n"
697 " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" 684 " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
698 " throws com.google.protobuf.InvalidProtocolBufferException {\n" 685 " throws com.google.protobuf.InvalidProtocolBufferException {\n"
699 " return PARSER.parseFrom(data, extensionRegistry);\n" 686 " return PARSER.parseFrom(data, extensionRegistry);\n"
700 "}\n" 687 "}\n"
701 "public static $classname$ parseFrom(java.io.InputStream input)\n" 688 "public static $classname$ parseFrom(java.io.InputStream input)\n"
702 " throws java.io.IOException {\n" 689 " throws java.io.IOException {\n"
703 " return com.google.protobuf.GeneratedMessage$ver$\n" 690 " return com.google.protobuf.GeneratedMessage\n"
704 " .parseWithIOException(PARSER, input);\n" 691 " .parseWithIOException(PARSER, input);\n"
705 "}\n" 692 "}\n"
706 "public static $classname$ parseFrom(\n" 693 "public static $classname$ parseFrom(\n"
707 " java.io.InputStream input,\n" 694 " java.io.InputStream input,\n"
708 " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" 695 " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
709 " throws java.io.IOException {\n" 696 " throws java.io.IOException {\n"
710 " return com.google.protobuf.GeneratedMessage$ver$\n" 697 " return com.google.protobuf.GeneratedMessage\n"
711 " .parseWithIOException(PARSER, input, extensionRegistry);\n" 698 " .parseWithIOException(PARSER, input, extensionRegistry);\n"
712 "}\n" 699 "}\n"
713 "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n" 700 "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n"
714 " throws java.io.IOException {\n" 701 " throws java.io.IOException {\n"
715 " return com.google.protobuf.GeneratedMessage$ver$\n" 702 " return com.google.protobuf.GeneratedMessage\n"
716 " .parseDelimitedWithIOException(PARSER, input);\n" 703 " .parseDelimitedWithIOException(PARSER, input);\n"
717 "}\n" 704 "}\n"
718 "public static $classname$ parseDelimitedFrom(\n" 705 "public static $classname$ parseDelimitedFrom(\n"
719 " java.io.InputStream input,\n" 706 " java.io.InputStream input,\n"
720 " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" 707 " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
721 " throws java.io.IOException {\n" 708 " throws java.io.IOException {\n"
722 " return com.google.protobuf.GeneratedMessage$ver$\n" 709 " return com.google.protobuf.GeneratedMessage\n"
723 " .parseDelimitedWithIOException(PARSER, input, extensionRegistry);\n" 710 " .parseDelimitedWithIOException(PARSER, input, extensionRegistry);\n"
724 "}\n" 711 "}\n"
725 "public static $classname$ parseFrom(\n" 712 "public static $classname$ parseFrom(\n"
726 " com.google.protobuf.CodedInputStream input)\n" 713 " com.google.protobuf.CodedInputStream input)\n"
727 " throws java.io.IOException {\n" 714 " throws java.io.IOException {\n"
728 " return com.google.protobuf.GeneratedMessage$ver$\n" 715 " return com.google.protobuf.GeneratedMessage\n"
729 " .parseWithIOException(PARSER, input);\n" 716 " .parseWithIOException(PARSER, input);\n"
730 "}\n" 717 "}\n"
731 "public static $classname$ parseFrom(\n" 718 "public static $classname$ parseFrom(\n"
732 " com.google.protobuf.CodedInputStream input,\n" 719 " com.google.protobuf.CodedInputStream input,\n"
733 " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" 720 " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
734 " throws java.io.IOException {\n" 721 " throws java.io.IOException {\n"
735 " return com.google.protobuf.GeneratedMessage$ver$\n" 722 " return com.google.protobuf.GeneratedMessage\n"
736 " .parseWithIOException(PARSER, input, extensionRegistry);\n" 723 " .parseWithIOException(PARSER, input, extensionRegistry);\n"
737 "}\n" 724 "}\n"
738 "\n", 725 "\n",
739 "classname", name_resolver_->GetImmutableClassName(descriptor_), 726 "classname", name_resolver_->GetImmutableClassName(descriptor_));
740 "ver", GeneratedCodeVersionSuffix());
741 } 727 }
742 728
743 void ImmutableMessageGenerator::GenerateSerializeOneField( 729 void ImmutableMessageGenerator::GenerateSerializeOneField(
744 io::Printer* printer, const FieldDescriptor* field) { 730 io::Printer* printer, const FieldDescriptor* field) {
745 field_generators_.get(field).GenerateSerializationCode(printer); 731 field_generators_.get(field).GenerateSerializationCode(printer);
746 } 732 }
747 733
748 void ImmutableMessageGenerator::GenerateSerializeOneExtensionRange( 734 void ImmutableMessageGenerator::GenerateSerializeOneExtensionRange(
749 io::Printer* printer, const Descriptor::ExtensionRange* range) { 735 io::Printer* printer, const Descriptor::ExtensionRange* range) {
750 printer->Print( 736 printer->Print(
(...skipping 18 matching lines...) Expand all
769 "public Builder toBuilder() {\n" 755 "public Builder toBuilder() {\n"
770 " return this == DEFAULT_INSTANCE\n" 756 " return this == DEFAULT_INSTANCE\n"
771 " ? new Builder() : new Builder().mergeFrom(this);\n" 757 " ? new Builder() : new Builder().mergeFrom(this);\n"
772 "}\n" 758 "}\n"
773 "\n", 759 "\n",
774 "classname", name_resolver_->GetImmutableClassName(descriptor_)); 760 "classname", name_resolver_->GetImmutableClassName(descriptor_));
775 761
776 printer->Print( 762 printer->Print(
777 "@java.lang.Override\n" 763 "@java.lang.Override\n"
778 "protected Builder newBuilderForType(\n" 764 "protected Builder newBuilderForType(\n"
779 " com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n" 765 " com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n"
780 " Builder builder = new Builder(parent);\n" 766 " Builder builder = new Builder(parent);\n"
781 " return builder;\n" 767 " return builder;\n"
782 "}\n", 768 "}\n");
783 "ver", GeneratedCodeVersionSuffix());
784 769
785 MessageBuilderGenerator builderGenerator(descriptor_, context_); 770 MessageBuilderGenerator builderGenerator(descriptor_, context_);
786 builderGenerator.Generate(printer); 771 builderGenerator.Generate(printer);
787 } 772 }
788 773
789 void ImmutableMessageGenerator:: 774 void ImmutableMessageGenerator::
790 GenerateDescriptorMethods(io::Printer* printer) { 775 GenerateDescriptorMethods(io::Printer* printer) {
791 if (!descriptor_->options().no_standard_descriptor_accessor()) { 776 if (!descriptor_->options().no_standard_descriptor_accessor()) {
792 printer->Print( 777 printer->Print(
793 "public static final com.google.protobuf.Descriptors.Descriptor\n" 778 "public static final com.google.protobuf.Descriptors.Descriptor\n"
794 " getDescriptor() {\n" 779 " getDescriptor() {\n"
795 " return $fileclass$.internal_$identifier$_descriptor;\n" 780 " return $fileclass$.internal_$identifier$_descriptor;\n"
796 "}\n" 781 "}\n"
797 "\n", 782 "\n",
798 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), 783 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
799 "identifier", UniqueFileScopeIdentifier(descriptor_)); 784 "identifier", UniqueFileScopeIdentifier(descriptor_));
800 } 785 }
801 std::vector<const FieldDescriptor*> map_fields; 786 vector<const FieldDescriptor*> map_fields;
802 for (int i = 0; i < descriptor_->field_count(); i++) { 787 for (int i = 0; i < descriptor_->field_count(); i++) {
803 const FieldDescriptor* field = descriptor_->field(i); 788 const FieldDescriptor* field = descriptor_->field(i);
804 if (GetJavaType(field) == JAVATYPE_MESSAGE && 789 if (GetJavaType(field) == JAVATYPE_MESSAGE &&
805 IsMapEntry(field->message_type())) { 790 IsMapEntry(field->message_type())) {
806 map_fields.push_back(field); 791 map_fields.push_back(field);
807 } 792 }
808 } 793 }
809 if (!map_fields.empty()) { 794 if (!map_fields.empty()) {
810 printer->Print( 795 printer->Print(
811 "@SuppressWarnings({\"rawtypes\"})\n" 796 "@SuppressWarnings({\"rawtypes\"})\n"
(...skipping 15 matching lines...) Expand all
827 "default:\n" 812 "default:\n"
828 " throw new RuntimeException(\n" 813 " throw new RuntimeException(\n"
829 " \"Invalid map field number: \" + number);\n"); 814 " \"Invalid map field number: \" + number);\n");
830 printer->Outdent(); 815 printer->Outdent();
831 printer->Outdent(); 816 printer->Outdent();
832 printer->Print( 817 printer->Print(
833 " }\n" 818 " }\n"
834 "}\n"); 819 "}\n");
835 } 820 }
836 printer->Print( 821 printer->Print(
837 "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n" 822 "protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n"
838 " internalGetFieldAccessorTable() {\n" 823 " internalGetFieldAccessorTable() {\n"
839 " return $fileclass$.internal_$identifier$_fieldAccessorTable\n" 824 " return $fileclass$.internal_$identifier$_fieldAccessorTable\n"
840 " .ensureFieldAccessorsInitialized(\n" 825 " .ensureFieldAccessorsInitialized(\n"
841 " $classname$.class, $classname$.Builder.class);\n" 826 " $classname$.class, $classname$.Builder.class);\n"
842 "}\n" 827 "}\n"
843 "\n", 828 "\n",
844 "classname", name_resolver_->GetImmutableClassName(descriptor_), 829 "classname", name_resolver_->GetImmutableClassName(descriptor_),
845 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), 830 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
846 "identifier", UniqueFileScopeIdentifier(descriptor_), 831 "identifier", UniqueFileScopeIdentifier(descriptor_));
847 "ver", GeneratedCodeVersionSuffix());
848 } 832 }
849 833
850 // =================================================================== 834 // ===================================================================
851 835
852 void ImmutableMessageGenerator::GenerateIsInitialized( 836 void ImmutableMessageGenerator::GenerateIsInitialized(
853 io::Printer* printer) { 837 io::Printer* printer) {
854 // Memoizes whether the protocol buffer is fully initialized (has all 838 // Memoizes whether the protocol buffer is fully initialized (has all
855 // required fields). -1 means not yet computed. 0 means false and 1 means 839 // required fields). -1 means not yet computed. 0 means false and 1 means
856 // true. 840 // true.
857 printer->Print( 841 printer->Print(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 " if (!get$name$().isInitialized()) {\n" 904 " if (!get$name$().isInitialized()) {\n"
921 " memoizedIsInitialized = 0;\n" 905 " memoizedIsInitialized = 0;\n"
922 " return false;\n" 906 " return false;\n"
923 " }\n" 907 " }\n"
924 "}\n", 908 "}\n",
925 "name", info->capitalized_name); 909 "name", info->capitalized_name);
926 break; 910 break;
927 case FieldDescriptor::LABEL_REPEATED: 911 case FieldDescriptor::LABEL_REPEATED:
928 if (IsMapEntry(field->message_type())) { 912 if (IsMapEntry(field->message_type())) {
929 printer->Print( 913 printer->Print(
930 "for ($type$ item : get$name$Map().values()) {\n" 914 "for ($type$ item : get$name$().values()) {\n"
931 " if (!item.isInitialized()) {\n" 915 " if (!item.isInitialized()) {\n"
932 " memoizedIsInitialized = 0;\n" 916 " memoizedIsInitialized = 0;\n"
933 " return false;\n" 917 " return false;\n"
934 " }\n" 918 " }\n"
935 "}\n", 919 "}\n",
936 "type", MapValueImmutableClassdName(field->message_type(), 920 "type", MapValueImmutableClassdName(field->message_type(),
937 name_resolver_), 921 name_resolver_),
938 "name", info->capitalized_name); 922 "name", info->capitalized_name);
939 } else { 923 } else {
940 printer->Print( 924 printer->Print(
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 printer->Print( 1069 printer->Print(
1086 "if (memoizedHashCode != 0) {\n"); 1070 "if (memoizedHashCode != 0) {\n");
1087 printer->Indent(); 1071 printer->Indent();
1088 printer->Print( 1072 printer->Print(
1089 "return memoizedHashCode;\n"); 1073 "return memoizedHashCode;\n");
1090 printer->Outdent(); 1074 printer->Outdent();
1091 printer->Print( 1075 printer->Print(
1092 "}\n" 1076 "}\n"
1093 "int hash = 41;\n"); 1077 "int hash = 41;\n");
1094 1078
1095 // If we output a getDescriptor() method, use that as it is more efficient. 1079 printer->Print("hash = (19 * hash) + getDescriptorForType().hashCode();\n");
1096 if (descriptor_->options().no_standard_descriptor_accessor()) {
1097 printer->Print("hash = (19 * hash) + getDescriptorForType().hashCode();\n");
1098 } else {
1099 printer->Print("hash = (19 * hash) + getDescriptor().hashCode();\n");
1100 }
1101 1080
1102 // hashCode non-oneofs. 1081 // hashCode non-oneofs.
1103 for (int i = 0; i < descriptor_->field_count(); i++) { 1082 for (int i = 0; i < descriptor_->field_count(); i++) {
1104 const FieldDescriptor* field = descriptor_->field(i); 1083 const FieldDescriptor* field = descriptor_->field(i);
1105 if (field->containing_oneof() == NULL) { 1084 if (field->containing_oneof() == NULL) {
1106 const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); 1085 const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
1107 bool check_has_bits = CheckHasBitsForEqualsAndHashCode(field); 1086 bool check_has_bits = CheckHasBitsForEqualsAndHashCode(field);
1108 if (check_has_bits) { 1087 if (check_has_bits) {
1109 printer->Print( 1088 printer->Print(
1110 "if (has$name$()) {\n", 1089 "if (has$name$()) {\n",
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 " extensionRegistry, tag)) {\n" 1218 " extensionRegistry, tag)) {\n"
1240 " done = true;\n" // it's an endgroup tag 1219 " done = true;\n" // it's an endgroup tag
1241 " }\n" 1220 " }\n"
1242 " break;\n" 1221 " break;\n"
1243 "}\n"); 1222 "}\n");
1244 } else { 1223 } else {
1245 printer->Print( 1224 printer->Print(
1246 "default: {\n" 1225 "default: {\n"
1247 " if (!input.skipField(tag)) {\n" 1226 " if (!input.skipField(tag)) {\n"
1248 " done = true;\n" // it's an endgroup tag 1227 " done = true;\n" // it's an endgroup tag
1249 " }\n" 1228 " }\n");
1229 printer->Print(
1250 " break;\n" 1230 " break;\n"
1251 "}\n"); 1231 "}\n");
1252 } 1232 }
1253 1233
1254 for (int i = 0; i < descriptor_->field_count(); i++) { 1234 for (int i = 0; i < descriptor_->field_count(); i++) {
1255 const FieldDescriptor* field = sorted_fields[i]; 1235 const FieldDescriptor* field = sorted_fields[i];
1256 uint32 tag = WireFormatLite::MakeTag(field->number(), 1236 uint32 tag = WireFormatLite::MakeTag(field->number(),
1257 WireFormat::WireTypeForFieldType(field->type())); 1237 WireFormat::WireTypeForFieldType(field->type()));
1258 1238
1259 printer->Print( 1239 printer->Print(
1260 "case $tag$: {\n", 1240 "case $tag$: {\n",
1261 "tag", SimpleItoa(static_cast<int32>(tag))); 1241 "tag", SimpleItoa(tag));
1262 printer->Indent(); 1242 printer->Indent();
1263 1243
1264 field_generators_.get(field).GenerateParsingCode(printer); 1244 field_generators_.get(field).GenerateParsingCode(printer);
1265 1245
1266 printer->Outdent(); 1246 printer->Outdent();
1267 printer->Print( 1247 printer->Print(
1268 " break;\n" 1248 " break;\n"
1269 "}\n"); 1249 "}\n");
1270 1250
1271 if (field->is_packable()) { 1251 if (field->is_packable()) {
1272 // To make packed = true wire compatible, we generate parsing code from a 1252 // To make packed = true wire compatible, we generate parsing code from a
1273 // packed version of this field regardless of field->options().packed(). 1253 // packed version of this field regardless of field->options().packed().
1274 uint32 packed_tag = WireFormatLite::MakeTag(field->number(), 1254 uint32 packed_tag = WireFormatLite::MakeTag(field->number(),
1275 WireFormatLite::WIRETYPE_LENGTH_DELIMITED); 1255 WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
1276 printer->Print( 1256 printer->Print(
1277 "case $tag$: {\n", 1257 "case $tag$: {\n",
1278 "tag", SimpleItoa(static_cast<int32>(packed_tag))); 1258 "tag", SimpleItoa(packed_tag));
1279 printer->Indent(); 1259 printer->Indent();
1280 1260
1281 field_generators_.get(field).GenerateParsingCodeFromPacked(printer); 1261 field_generators_.get(field).GenerateParsingCodeFromPacked(printer);
1282 1262
1283 printer->Outdent(); 1263 printer->Outdent();
1284 printer->Print( 1264 printer->Print(
1285 " break;\n" 1265 " break;\n"
1286 "}\n"); 1266 "}\n");
1287 } 1267 }
1288 } 1268 }
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 "public static <T extends com.google.protobuf.Message> Any pack(\n" 1394 "public static <T extends com.google.protobuf.Message> Any pack(\n"
1415 " T message) {\n" 1395 " T message) {\n"
1416 " return Any.newBuilder()\n" 1396 " return Any.newBuilder()\n"
1417 " .setTypeUrl(getTypeUrl(\"type.googleapis.com\",\n" 1397 " .setTypeUrl(getTypeUrl(\"type.googleapis.com\",\n"
1418 " message.getDescriptorForType()))\n" 1398 " message.getDescriptorForType()))\n"
1419 " .setValue(message.toByteString())\n" 1399 " .setValue(message.toByteString())\n"
1420 " .build();\n" 1400 " .build();\n"
1421 "}\n" 1401 "}\n"
1422 "\n" 1402 "\n"
1423 "/**\n" 1403 "/**\n"
1424 " * Packs a message using the given type URL prefix. The type URL will\n" 1404 " * Packs a message uisng the given type URL prefix. The type URL will\n"
1425 " * be constructed by concatenating the message type's full name to the\n" 1405 " * be constructed by concatenating the message type's full name to the\n"
1426 " * prefix with an optional \"/\" separator if the prefix doesn't end\n" 1406 " * prefix with an optional \"/\" separator if the prefix doesn't end\n"
1427 " * with \"/\" already.\n" 1407 " * with \"/\" already.\n"
1428 " */\n" 1408 " */\n"
1429 "public static <T extends com.google.protobuf.Message> Any pack(\n" 1409 "public static <T extends com.google.protobuf.Message> Any pack(\n"
1430 " T message, java.lang.String typeUrlPrefix) {\n" 1410 " T message, java.lang.String typeUrlPrefix) {\n"
1431 " return Any.newBuilder()\n" 1411 " return Any.newBuilder()\n"
1432 " .setTypeUrl(getTypeUrl(typeUrlPrefix,\n" 1412 " .setTypeUrl(getTypeUrl(typeUrlPrefix,\n"
1433 " message.getDescriptorForType()))\n" 1413 " message.getDescriptorForType()))\n"
1434 " .setValue(message.toByteString())\n" 1414 " .setValue(message.toByteString())\n"
(...skipping 26 matching lines...) Expand all
1461 " .parseFrom(getValue());\n" 1441 " .parseFrom(getValue());\n"
1462 " cachedUnpackValue = result;\n" 1442 " cachedUnpackValue = result;\n"
1463 " return result;\n" 1443 " return result;\n"
1464 "}\n"); 1444 "}\n");
1465 } 1445 }
1466 1446
1467 } // namespace java 1447 } // namespace java
1468 } // namespace compiler 1448 } // namespace compiler
1469 } // namespace protobuf 1449 } // namespace protobuf
1470 } // namespace google 1450 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698