Index: third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc |
diff --git a/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc b/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc |
index c53aae6b6ac01c82e3b08e4e36199d0b46eb0bfb..cb4503f63768657c42bec7051947e123aa3f9006 100644 |
--- a/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc |
+++ b/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc |
@@ -90,7 +90,7 @@ bool CollectExtensions(const Message& message, |
// There are unknown fields that could be extensions, thus this call fails. |
if (reflection->GetUnknownFields(message).field_count() > 0) return false; |
- vector<const FieldDescriptor*> fields; |
+ std::vector<const FieldDescriptor*> fields; |
reflection->ListFields(message, &fields); |
for (int i = 0; i < fields.size(); i++) { |
@@ -189,23 +189,21 @@ void MaybeRestartJavaMethod(io::Printer* printer, |
*bytecode_estimate = 0; |
} |
} |
- |
- |
} // namespace |
-FileGenerator::FileGenerator(const FileDescriptor* file, bool immutable_api, |
- bool enforce_lite) |
+FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options, |
+ bool immutable_api) |
: file_(file), |
java_package_(FileJavaPackage(file, immutable_api)), |
message_generators_( |
new google::protobuf::scoped_ptr<MessageGenerator>[file->message_type_count()]), |
extension_generators_( |
new google::protobuf::scoped_ptr<ExtensionGenerator>[file->extension_count()]), |
- context_(new Context(file)), |
+ context_(new Context(file, options)), |
name_resolver_(context_->GetNameResolver()), |
+ options_(options), |
immutable_api_(immutable_api) { |
classname_ = name_resolver_->GetFileClassName(file, immutable_api); |
- context_->SetEnforceLite(enforce_lite); |
generator_factory_.reset( |
new ImmutableGeneratorFactory(context_.get())); |
for (int i = 0; i < file_->message_type_count(); ++i) { |
@@ -253,19 +251,20 @@ void FileGenerator::Generate(io::Printer* printer) { |
"\n", |
"package", java_package_); |
} |
+ PrintGeneratedAnnotation( |
+ printer, '$', options_.annotate_code ? classname_ + ".java.pb.meta" : ""); |
printer->Print( |
- "public final class $classname$ {\n" |
- " private $classname$() {}\n", |
- "classname", classname_); |
+ "public final class $classname$ {\n" |
+ " private $ctor$() {}\n", |
+ "classname", classname_, "ctor", classname_); |
+ printer->Annotate("classname", file_->name()); |
printer->Indent(); |
// ----------------------------------------------------------------- |
printer->Print( |
"public static void registerAllExtensions(\n" |
- " com.google.protobuf.ExtensionRegistry$lite$ registry) {\n", |
- "lite", |
- HasDescriptorMethods(file_, context_->EnforceLite()) ? "" : "Lite"); |
+ " com.google.protobuf.ExtensionRegistryLite registry) {\n"); |
printer->Indent(); |
@@ -280,6 +279,20 @@ void FileGenerator::Generate(io::Printer* printer) { |
printer->Outdent(); |
printer->Print( |
"}\n"); |
+ if (HasDescriptorMethods(file_, context_->EnforceLite())) { |
+ // Overload registerAllExtensions for the non-lite usage to |
+ // redundantly maintain the original signature (this is |
+ // redundant because ExtensionRegistryLite now invokes |
+ // ExtensionRegistry in the non-lite usage). Intent is |
+ // to remove this in the future. |
+ printer->Print( |
+ "\n" |
+ "public static void registerAllExtensions(\n" |
+ " com.google.protobuf.ExtensionRegistry registry) {\n" |
+ " registerAllExtensions(\n" |
+ " (com.google.protobuf.ExtensionRegistryLite) registry);\n" |
+ "}\n"); |
+ } |
// ----------------------------------------------------------------- |
@@ -372,7 +385,7 @@ void FileGenerator::GenerateDescriptorInitializationCodeForImmutable( |
"final", ""); |
printer->Indent(); |
- SharedCodeGenerator shared_code_generator(file_); |
+ SharedCodeGenerator shared_code_generator(file_, options_); |
shared_code_generator.GenerateDescriptors(printer); |
int bytecode_estimate = 0; |
@@ -523,20 +536,26 @@ void FileGenerator::GenerateDescriptorInitializationCodeForMutable(io::Printer* |
"}\n"); |
} |
-template<typename GeneratorClass, typename DescriptorClass> |
+template <typename GeneratorClass, typename DescriptorClass> |
static void GenerateSibling(const string& package_dir, |
const string& java_package, |
const DescriptorClass* descriptor, |
GeneratorContext* context, |
- vector<string>* file_list, |
+ std::vector<string>* file_list, bool annotate_code, |
+ std::vector<string>* annotation_list, |
const string& name_suffix, |
GeneratorClass* generator, |
void (GeneratorClass::*pfn)(io::Printer* printer)) { |
string filename = package_dir + descriptor->name() + name_suffix + ".java"; |
file_list->push_back(filename); |
+ string info_full_path = filename + ".pb.meta"; |
+ GeneratedCodeInfo annotations; |
+ io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector( |
+ &annotations); |
google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(filename)); |
- io::Printer printer(output.get(), '$'); |
+ io::Printer printer(output.get(), '$', |
+ annotate_code ? &annotation_collector : NULL); |
printer.Print( |
"// Generated by the protocol buffer compiler. DO NOT EDIT!\n" |
@@ -551,55 +570,57 @@ static void GenerateSibling(const string& package_dir, |
} |
(generator->*pfn)(&printer); |
+ |
+ if (annotate_code) { |
+ google::protobuf::scoped_ptr<io::ZeroCopyOutputStream> info_output( |
+ context->Open(info_full_path)); |
+ annotations.SerializeToZeroCopyStream(info_output.get()); |
+ annotation_list->push_back(info_full_path); |
+ } |
} |
void FileGenerator::GenerateSiblings(const string& package_dir, |
GeneratorContext* context, |
- vector<string>* file_list) { |
+ std::vector<string>* file_list, |
+ std::vector<string>* annotation_list) { |
if (MultipleJavaFiles(file_, immutable_api_)) { |
for (int i = 0; i < file_->enum_type_count(); i++) { |
if (HasDescriptorMethods(file_, context_->EnforceLite())) { |
EnumGenerator generator(file_->enum_type(i), immutable_api_, |
context_.get()); |
- GenerateSibling<EnumGenerator>(package_dir, java_package_, |
- file_->enum_type(i), |
- context, file_list, "", |
- &generator, |
- &EnumGenerator::Generate); |
+ GenerateSibling<EnumGenerator>( |
+ package_dir, java_package_, file_->enum_type(i), context, file_list, |
+ options_.annotate_code, annotation_list, "", &generator, |
+ &EnumGenerator::Generate); |
} else { |
EnumLiteGenerator generator(file_->enum_type(i), immutable_api_, |
context_.get()); |
- GenerateSibling<EnumLiteGenerator>(package_dir, java_package_, |
- file_->enum_type(i), |
- context, file_list, "", |
- &generator, |
- &EnumLiteGenerator::Generate); |
+ GenerateSibling<EnumLiteGenerator>( |
+ package_dir, java_package_, file_->enum_type(i), context, file_list, |
+ options_.annotate_code, annotation_list, "", &generator, |
+ &EnumLiteGenerator::Generate); |
} |
} |
for (int i = 0; i < file_->message_type_count(); i++) { |
if (immutable_api_) { |
- GenerateSibling<MessageGenerator>(package_dir, java_package_, |
- file_->message_type(i), |
- context, file_list, |
- "OrBuilder", |
- message_generators_[i].get(), |
- &MessageGenerator::GenerateInterface); |
+ GenerateSibling<MessageGenerator>( |
+ package_dir, java_package_, file_->message_type(i), context, |
+ file_list, options_.annotate_code, annotation_list, "OrBuilder", |
+ message_generators_[i].get(), &MessageGenerator::GenerateInterface); |
} |
- GenerateSibling<MessageGenerator>(package_dir, java_package_, |
- file_->message_type(i), |
- context, file_list, "", |
- message_generators_[i].get(), |
- &MessageGenerator::Generate); |
+ GenerateSibling<MessageGenerator>( |
+ package_dir, java_package_, file_->message_type(i), context, |
+ file_list, options_.annotate_code, annotation_list, "", |
+ message_generators_[i].get(), &MessageGenerator::Generate); |
} |
if (HasGenericServices(file_, context_->EnforceLite())) { |
for (int i = 0; i < file_->service_count(); i++) { |
google::protobuf::scoped_ptr<ServiceGenerator> generator( |
generator_factory_->NewServiceGenerator(file_->service(i))); |
- GenerateSibling<ServiceGenerator>(package_dir, java_package_, |
- file_->service(i), |
- context, file_list, "", |
- generator.get(), |
- &ServiceGenerator::Generate); |
+ GenerateSibling<ServiceGenerator>( |
+ package_dir, java_package_, file_->service(i), context, file_list, |
+ options_.annotate_code, annotation_list, "", generator.get(), |
+ &ServiceGenerator::Generate); |
} |
} |
} |