瀏覽代碼

Add two codegen parameters to nano.

enum_style = c | java: 'c' to put the enum member int constants
at the parent scope; 'java' to create uninstantiatable shell
classes at the parent scope and put the int constants inside.

optional_field_style = default | accessors: 'default' to create
one public mutable field per optional proto field; 'accessors'
to encapsulate the generated fields behind get, set, has and
clear accessors.

This CL only contains parsing code for these two parameters.

Change-Id: Iec0c3b0f30af8eb7db328e790664306bc90be089
Max Cai 12 年之前
父節點
當前提交
71766127eb

+ 12 - 1
src/google/protobuf/compiler/javanano/javanano_generator.cc

@@ -119,12 +119,23 @@ bool JavaNanoGenerator::Generate(const FileDescriptor* file,
     } else if (options[i].first == "java_multiple_files") {
       params.set_override_java_multiple_files(options[i].second == "true");
     } else if (options[i].first == "java_nano_generate_has") {
-        params.set_generate_has(options[i].second == "true");
+      params.set_generate_has(options[i].second == "true");
+    } else if (options[i].first == "enum_style") {
+      params.set_java_enum_style(options[i].second == "java");
+    } else if (options[i].first == "optional_field_style") {
+      params.set_optional_field_accessors(options[i].second == "accessors");
     } else {
       *error = "Ignore unknown javanano generator option: " + options[i].first;
     }
   }
 
+  // Check illegal parameter combinations
+  if (params.generate_has() && params.optional_field_accessors()) {
+    error->assign("java_nano_generate_has=true cannot be used in conjunction"
+        " with optional_field_style=accessors");
+    return false;
+  }
+
   // -----------------------------------------------------------------
 
   FileGenerator file_generator(file, params);

+ 18 - 1
src/google/protobuf/compiler/javanano/javanano_params.h

@@ -58,6 +58,8 @@ class Params {
   NameMap java_outer_classnames_;
   NameSet java_multiple_files_;
   bool generate_has_;
+  bool java_enum_style_;
+  bool optional_field_accessors_;
 
  public:
   Params(const string & base_name) :
@@ -65,7 +67,9 @@ class Params {
     base_name_(base_name),
     override_java_multiple_files_(JAVANANO_MUL_UNSET),
     store_unknown_fields_(false),
-    generate_has_(false) {
+    generate_has_(false),
+    java_enum_style_(false),
+    optional_field_accessors_(false) {
   }
 
   const string& base_name() const {
@@ -160,6 +164,19 @@ class Params {
     return generate_has_;
   }
 
+  void set_java_enum_style(bool value) {
+    java_enum_style_ = value;
+  }
+  bool java_enum_style() const {
+    return java_enum_style_;
+  }
+
+  void set_optional_field_accessors(bool value) {
+    optional_field_accessors_ = value;
+  }
+  bool optional_field_accessors() const {
+    return optional_field_accessors_;
+  }
 };
 
 }  // namespace javanano