LCOV - code coverage report
Current view: top level - third_party/protobuf/src/google/protobuf/compiler/javanano - javanano_generator.cc (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 2 92 2.2 %
Date: 2015-10-10 Functions: 2 6 33.3 %

          Line data    Source code
       1             : // Protocol Buffers - Google's data interchange format
       2             : // Copyright 2008 Google Inc.  All rights reserved.
       3             : // http://code.google.com/p/protobuf/
       4             : //
       5             : // Redistribution and use in source and binary forms, with or without
       6             : // modification, are permitted provided that the following conditions are
       7             : // met:
       8             : //
       9             : //     * Redistributions of source code must retain the above copyright
      10             : // notice, this list of conditions and the following disclaimer.
      11             : //     * Redistributions in binary form must reproduce the above
      12             : // copyright notice, this list of conditions and the following disclaimer
      13             : // in the documentation and/or other materials provided with the
      14             : // distribution.
      15             : //     * Neither the name of Google Inc. nor the names of its
      16             : // contributors may be used to endorse or promote products derived from
      17             : // this software without specific prior written permission.
      18             : //
      19             : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
      20             : // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
      21             : // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
      22             : // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
      23             : // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      24             : // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
      25             : // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      26             : // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      27             : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      28             : // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      29             : // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      30             : 
      31             : // Author: kenton@google.com (Kenton Varda)
      32             : //  Based on original Protocol Buffers design by
      33             : //  Sanjay Ghemawat, Jeff Dean, and others.
      34             : 
      35             : #include <google/protobuf/compiler/javanano/javanano_params.h>
      36             : #include <google/protobuf/compiler/javanano/javanano_generator.h>
      37             : #include <google/protobuf/compiler/javanano/javanano_file.h>
      38             : #include <google/protobuf/compiler/javanano/javanano_helpers.h>
      39             : #include <google/protobuf/io/printer.h>
      40             : #include <google/protobuf/io/zero_copy_stream.h>
      41             : #include <google/protobuf/descriptor.pb.h>
      42             : #include <google/protobuf/stubs/strutil.h>
      43             : 
      44             : namespace google {
      45             : namespace protobuf {
      46             : namespace compiler {
      47             : namespace javanano {
      48             : 
      49             : namespace {
      50             : 
      51           0 : string TrimString(const string& s) {
      52           0 :   string::size_type start = s.find_first_not_of(" \n\r\t");
      53           0 :   if (start == string::npos) {
      54           0 :     return "";
      55             :   }
      56           0 :   string::size_type end = s.find_last_not_of(" \n\r\t") + 1;
      57           0 :   return s.substr(start, end - start);
      58             : }
      59             : 
      60             : } // namespace
      61             : 
      62           0 : void UpdateParamsRecursively(Params& params,
      63           0 :     const FileDescriptor* file) {
      64             :   // Add any parameters for this file
      65           0 :   if (file->options().has_java_outer_classname()) {
      66             :     params.set_java_outer_classname(
      67           0 :       file->name(), file->options().java_outer_classname());
      68             :   }
      69           0 :   if (file->options().has_java_package()) {
      70           0 :     string result = file->options().java_package();
      71           0 :     if (!file->options().javanano_use_deprecated_package()) {
      72           0 :       if (!result.empty()) {
      73             :         result += ".";
      74             :       }
      75             :       result += "nano";
      76             :     }
      77             :     params.set_java_package(
      78           0 :       file->name(), result);
      79             :   }
      80           0 :   if (file->options().has_java_multiple_files()) {
      81             :     params.set_java_multiple_files(
      82           0 :       file->name(), file->options().java_multiple_files());
      83             :   }
      84             : 
      85             :   // Loop through all dependent files recursively
      86             :   // adding dep
      87           0 :   for (int i = 0; i < file->dependency_count(); i++) {
      88           0 :     UpdateParamsRecursively(params, file->dependency(i));
      89             :   }
      90           0 : }
      91             : 
      92          34 : JavaNanoGenerator::JavaNanoGenerator() {}
      93          17 : JavaNanoGenerator::~JavaNanoGenerator() {}
      94             : 
      95           0 : bool JavaNanoGenerator::Generate(const FileDescriptor* file,
      96             :                              const string& parameter,
      97             :                              GeneratorContext* output_directory,
      98             :                              string* error) const {
      99             :   vector<pair<string, string> > options;
     100             : 
     101           0 :   ParseGeneratorParameter(parameter, &options);
     102             : 
     103             :   // -----------------------------------------------------------------
     104             :   // parse generator options
     105             : 
     106             :   // Name a file where we will write a list of generated file names, one
     107             :   // per line.
     108             :   string output_list_file;
     109           0 :   Params params(file->name());
     110             : 
     111             :   // Update per file params
     112           0 :   UpdateParamsRecursively(params, file);
     113             : 
     114             :   // Replace any existing options with ones from command line
     115           0 :   for (int i = 0; i < options.size(); i++) {
     116           0 :     string option_name = TrimString(options[i].first);
     117           0 :     string option_value = TrimString(options[i].second);
     118           0 :     if (option_name == "output_list_file") {
     119             :       output_list_file = option_value;
     120           0 :     } else if (option_name == "java_package") {
     121             :         vector<string> parts;
     122           0 :         SplitStringUsing(option_value, "|", &parts);
     123           0 :         if (parts.size() != 2) {
     124             :           *error = "Bad java_package, expecting filename|PackageName found '"
     125           0 :             + option_value + "'";
     126           0 :           return false;
     127             :         }
     128           0 :         params.set_java_package(parts[0], parts[1]);
     129           0 :     } else if (option_name == "java_outer_classname") {
     130             :         vector<string> parts;
     131           0 :         SplitStringUsing(option_value, "|", &parts);
     132           0 :         if (parts.size() != 2) {
     133             :           *error = "Bad java_outer_classname, "
     134             :                    "expecting filename|ClassName found '"
     135           0 :                    + option_value + "'";
     136           0 :           return false;
     137             :         }
     138           0 :         params.set_java_outer_classname(parts[0], parts[1]);
     139           0 :     } else if (option_name == "store_unknown_fields") {
     140           0 :       params.set_store_unknown_fields(option_value == "true");
     141           0 :     } else if (option_name == "java_multiple_files") {
     142           0 :       params.set_override_java_multiple_files(option_value == "true");
     143           0 :     } else if (option_name == "java_nano_generate_has") {
     144           0 :       params.set_generate_has(option_value == "true");
     145           0 :     } else if (option_name == "enum_style") {
     146           0 :       params.set_java_enum_style(option_value == "java");
     147           0 :     } else if (option_name == "optional_field_style") {
     148           0 :       params.set_optional_field_accessors(option_value == "accessors");
     149             :       params.set_use_reference_types_for_primitives(option_value == "reftypes"
     150           0 :           || option_value == "reftypes_compat_mode");
     151             :       params.set_reftypes_primitive_enums(
     152           0 :           option_value == "reftypes_compat_mode");
     153           0 :       if (option_value == "reftypes_compat_mode") {
     154           0 :         params.set_generate_clear(false);
     155             :       }
     156           0 :     } else if (option_name == "generate_equals") {
     157           0 :       params.set_generate_equals(option_value == "true");
     158           0 :     } else if (option_name == "ignore_services") {
     159           0 :       params.set_ignore_services(option_value == "true");
     160           0 :     } else if (option_name == "parcelable_messages") {
     161           0 :       params.set_parcelable_messages(option_value == "true");
     162           0 :     } else if (option_name == "generate_clone") {
     163           0 :       params.set_generate_clone(option_value == "true");
     164           0 :     } else if (option_name == "generate_intdefs") {
     165           0 :       params.set_generate_intdefs(option_value == "true");
     166           0 :     } else if (option_name == "generate_clear") {
     167           0 :       params.set_generate_clear(option_value == "true");
     168             :     } else {
     169           0 :       *error = "Ignore unknown javanano generator option: " + option_name;
     170             :     }
     171             :   }
     172             : 
     173             :   // Check illegal parameter combinations
     174             :   // Note: the enum-like optional_field_style generator param ensures
     175             :   // that we can never have illegal combinations of field styles
     176             :   // (e.g. reftypes and accessors can't be on at the same time).
     177           0 :   if (params.generate_has()
     178           0 :       && (params.optional_field_accessors()
     179           0 :           || params.use_reference_types_for_primitives())) {
     180             :     error->assign("java_nano_generate_has=true cannot be used in conjunction"
     181           0 :         " with optional_field_style=accessors or optional_field_style=reftypes");
     182             :     return false;
     183             :   }
     184             : 
     185             :   // -----------------------------------------------------------------
     186             : 
     187           0 :   FileGenerator file_generator(file, params);
     188           0 :   if (!file_generator.Validate(error)) {
     189             :     return false;
     190             :   }
     191             : 
     192             :   string package_dir =
     193           0 :     StringReplace(file_generator.java_package(), ".", "/", true);
     194           0 :   if (!package_dir.empty()) package_dir += "/";
     195             : 
     196           0 :   vector<string> all_files;
     197             : 
     198           0 :   if (IsOuterClassNeeded(params, file)) {
     199           0 :     string java_filename = package_dir;
     200           0 :     java_filename += file_generator.classname();
     201             :     java_filename += ".java";
     202           0 :     all_files.push_back(java_filename);
     203             : 
     204             :     // Generate main java file.
     205             :     scoped_ptr<io::ZeroCopyOutputStream> output(
     206           0 :       output_directory->Open(java_filename));
     207           0 :     io::Printer printer(output.get(), '$');
     208           0 :     file_generator.Generate(&printer);
     209             :   }
     210             : 
     211             :   // Generate sibling files.
     212           0 :   file_generator.GenerateSiblings(package_dir, output_directory, &all_files);
     213             : 
     214             :   // Generate output list if requested.
     215           0 :   if (!output_list_file.empty()) {
     216             :     // Generate output list.  This is just a simple text file placed in a
     217             :     // deterministic location which lists the .java files being generated.
     218             :     scoped_ptr<io::ZeroCopyOutputStream> srclist_raw_output(
     219           0 :       output_directory->Open(output_list_file));
     220           0 :     io::Printer srclist_printer(srclist_raw_output.get(), '$');
     221           0 :     for (int i = 0; i < all_files.size(); i++) {
     222           0 :       srclist_printer.Print("$filename$\n", "filename", all_files[i]);
     223             :     }
     224             :   }
     225             : 
     226           0 :   return true;
     227             : }
     228             : 
     229             : }  // namespace java
     230             : }  // namespace compiler
     231             : }  // namespace protobuf
     232             : }  // namespace google

Generated by: LCOV version 1.10