diff options
Diffstat (limited to 'src/google/protobuf/compiler/java/java_file.cc')
-rw-r--r-- | src/google/protobuf/compiler/java/java_file.cc | 87 |
1 files changed, 49 insertions, 38 deletions
diff --git a/src/google/protobuf/compiler/java/java_file.cc b/src/google/protobuf/compiler/java/java_file.cc index c53aae6b..a06c5f6d 100644 --- a/src/google/protobuf/compiler/java/java_file.cc +++ b/src/google/protobuf/compiler/java/java_file.cc @@ -193,19 +193,19 @@ void MaybeRestartJavaMethod(io::Printer* printer, } // 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,10 +253,13 @@ 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(); // ----------------------------------------------------------------- @@ -372,7 +375,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 +526,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, + vector<string>* file_list, bool annotate_code, + 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 +560,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) { + vector<string>* file_list, + 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); } } } |