diff options
Diffstat (limited to 'src/google/protobuf/compiler/java/java_enum.cc')
-rw-r--r-- | src/google/protobuf/compiler/java/java_enum.cc | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/google/protobuf/compiler/java/java_enum.cc b/src/google/protobuf/compiler/java/java_enum.cc index 668377a3..0353b607 100644 --- a/src/google/protobuf/compiler/java/java_enum.cc +++ b/src/google/protobuf/compiler/java/java_enum.cc @@ -111,6 +111,10 @@ void EnumGenerator::Generate(io::Printer* printer) { "$name$($index$, $number$),\n"); } + if (SupportUnknownEnumValue(descriptor_->file())) { + printer->Print("UNRECOGNIZED(-1, -1),\n"); + } + printer->Print( ";\n" "\n"); @@ -141,7 +145,17 @@ void EnumGenerator::Generate(io::Printer* printer) { printer->Print( "\n" - "public final int getNumber() { return value; }\n" + "public final int getNumber() {\n"); + if (SupportUnknownEnumValue(descriptor_->file())) { + printer->Print( + " if (index == -1) {\n" + " throw new java.lang.IllegalArgumentException(\n" + " \"Can't get the number of an unknown enum value.\");\n" + " }\n"); + } + printer->Print( + " return value;\n" + "}\n" "\n" "public static $classname$ valueOf(int value) {\n" " switch (value) {\n", @@ -231,11 +245,12 @@ void EnumGenerator::Generate(io::Printer* printer) { "index", SimpleItoa(descriptor_->index())); } printer->Print( - "return $immutable_package$.$descriptor_class$.getDescriptor()\n" + "return $immutable_package$.$descriptor_class$.$descriptor$\n" " .getEnumTypes().get($index$);\n", "immutable_package", FileJavaPackage(descriptor_->file(), true), "descriptor_class", name_resolver_->GetDescriptorClassName(descriptor_->file()), + "descriptor", "getDescriptor()", "index", SimpleItoa(descriptor_->index())); printer->Outdent(); } @@ -283,11 +298,18 @@ void EnumGenerator::Generate(io::Printer* printer) { " if (desc.getType() != getDescriptor()) {\n" " throw new java.lang.IllegalArgumentException(\n" " \"EnumValueDescriptor is not for this type.\");\n" - " }\n" + " }\n", + "classname", descriptor_->name()); + if (SupportUnknownEnumValue(descriptor_->file())) { + printer->Print( + " if (desc.getIndex() == -1) {\n" + " return UNRECOGNIZED;\n" + " }\n"); + } + printer->Print( " return VALUES[desc.getIndex()];\n" "}\n" - "\n", - "classname", descriptor_->name()); + "\n"); // index is only used for reflection; lite implementation does not need it printer->Print("private final int index;\n"); |