| Index: third_party/protobuf/src/google/protobuf/compiler/java/java_enum.cc
|
| ===================================================================
|
| --- third_party/protobuf/src/google/protobuf/compiler/java/java_enum.cc (revision 216642)
|
| +++ third_party/protobuf/src/google/protobuf/compiler/java/java_enum.cc (working copy)
|
| @@ -36,6 +36,7 @@
|
| #include <string>
|
|
|
| #include <google/protobuf/compiler/java/java_enum.h>
|
| +#include <google/protobuf/compiler/java/java_doc_comment.h>
|
| #include <google/protobuf/compiler/java/java_helpers.h>
|
| #include <google/protobuf/io/printer.h>
|
| #include <google/protobuf/descriptor.pb.h>
|
| @@ -67,6 +68,7 @@
|
| EnumGenerator::~EnumGenerator() {}
|
|
|
| void EnumGenerator::Generate(io::Printer* printer) {
|
| + WriteEnumDocComment(printer, descriptor_);
|
| if (HasDescriptorMethods(descriptor_)) {
|
| printer->Print(
|
| "public enum $classname$\n"
|
| @@ -85,6 +87,7 @@
|
| vars["name"] = canonical_values_[i]->name();
|
| vars["index"] = SimpleItoa(canonical_values_[i]->index());
|
| vars["number"] = SimpleItoa(canonical_values_[i]->number());
|
| + WriteEnumValueDocComment(printer, canonical_values_[i]);
|
| printer->Print(vars,
|
| "$name$($index$, $number$),\n");
|
| }
|
| @@ -100,6 +103,7 @@
|
| vars["classname"] = descriptor_->name();
|
| vars["name"] = aliases_[i].value->name();
|
| vars["canonical_name"] = aliases_[i].canonical_value->name();
|
| + WriteEnumValueDocComment(printer, aliases_[i].value);
|
| printer->Print(vars,
|
| "public static final $classname$ $name$ = $canonical_name$;\n");
|
| }
|
| @@ -108,6 +112,7 @@
|
| map<string, string> vars;
|
| vars["name"] = descriptor_->value(i)->name();
|
| vars["number"] = SimpleItoa(descriptor_->value(i)->number());
|
| + WriteEnumValueDocComment(printer, descriptor_->value(i));
|
| printer->Print(vars,
|
| "public static final int $name$_VALUE = $number$;\n");
|
| }
|
| @@ -187,19 +192,30 @@
|
| printer->Print(
|
| "}\n"
|
| "\n"
|
| - "private static final $classname$[] VALUES = {\n"
|
| - " ",
|
| + "private static final $classname$[] VALUES = ",
|
| "classname", descriptor_->name());
|
|
|
| - for (int i = 0; i < descriptor_->value_count(); i++) {
|
| - printer->Print("$name$, ",
|
| - "name", descriptor_->value(i)->name());
|
| + if (CanUseEnumValues()) {
|
| + // If the constants we are going to output are exactly the ones we
|
| + // have declared in the Java enum in the same order, then we can use
|
| + // the values() method that the Java compiler automatically generates
|
| + // for every enum.
|
| + printer->Print("values();\n");
|
| + } else {
|
| + printer->Print(
|
| + "{\n"
|
| + " ");
|
| + for (int i = 0; i < descriptor_->value_count(); i++) {
|
| + printer->Print("$name$, ",
|
| + "name", descriptor_->value(i)->name());
|
| + }
|
| + printer->Print(
|
| + "\n"
|
| + "};\n");
|
| }
|
|
|
| printer->Print(
|
| "\n"
|
| - "};\n"
|
| - "\n"
|
| "public static $classname$ valueOf(\n"
|
| " com.google.protobuf.Descriptors.EnumValueDescriptor desc) {\n"
|
| " if (desc.getType() != getDescriptor()) {\n"
|
| @@ -237,6 +253,18 @@
|
| printer->Print("}\n\n");
|
| }
|
|
|
| +bool EnumGenerator::CanUseEnumValues() {
|
| + if (canonical_values_.size() != descriptor_->value_count()) {
|
| + return false;
|
| + }
|
| + for (int i = 0; i < descriptor_->value_count(); i++) {
|
| + if (descriptor_->value(i)->name() != canonical_values_[i]->name()) {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| } // namespace java
|
| } // namespace compiler
|
| } // namespace protobuf
|
|
|