Add nanopb-specific package name option (#422)
diff --git a/docs/reference.rst b/docs/reference.rst
index eff5fd1..8c09b63 100644
--- a/docs/reference.rst
+++ b/docs/reference.rst
@@ -102,6 +102,9 @@
(max_size must also be defined).
fixed_count Generate arrays with constant length
(max_count must also be defined).
+package Package name that applies only for nanopb
+ generator, as opposed to the .proto file
+ *package* keyword that applies for all languages.
============================ ================================================
These options can be defined for the .proto files before they are converted
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 0b365a2..83264d9 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -1333,6 +1333,10 @@
replacement_prefix = ""
for part in self.fdesc.package.split("."):
replacement_prefix += part[0]
+ elif self.file_options.package:
+ strip_prefix = "." + self.fdesc.package
+ replacement_prefix = self.file_options.package
+
def create_name(names):
if mangle_names == nanopb_pb2.M_NONE or mangle_names == nanopb_pb2.M_PACKAGE_INITIALS:
@@ -1353,14 +1357,15 @@
return "." + replacement_prefix + typename[len(strip_prefix):]
else:
return typename[len(strip_prefix):]
+ elif self.file_options.package:
+ return "." + replacement_prefix + typename
else:
return typename
- if self.fdesc.package:
- if replacement_prefix is not None:
- base_name = Names(replacement_prefix)
- else:
- base_name = Names(self.fdesc.package.split('.'))
+ if replacement_prefix is not None:
+ base_name = Names(replacement_prefix.split('.'))
+ elif self.fdesc.package:
+ base_name = Names(self.fdesc.package.split('.'))
else:
base_name = Names()
@@ -1390,6 +1395,11 @@
for names, extension in iterate_extensions(self.fdesc, flatten):
name = create_name(names + extension.name)
field_options = get_nanopb_suboptions(extension, self.file_options, name)
+
+ extension = copy.deepcopy(extension)
+ if extension.type in (FieldD.TYPE_MESSAGE, FieldD.TYPE_ENUM):
+ extension.type_name = mangle_field_typename(extension.type_name)
+
if field_options.type != nanopb_pb2.FT_IGNORE:
self.extensions.append(ExtensionField(name, extension, field_options))
diff --git a/generator/proto/nanopb.proto b/generator/proto/nanopb.proto
index 7138b88..2480913 100644
--- a/generator/proto/nanopb.proto
+++ b/generator/proto/nanopb.proto
@@ -131,6 +131,9 @@
// Extra files to include in generated `.pb.h`
repeated string include = 24;
+
+ // Package name that applies only for nanopb.
+ optional string package = 25;
}
// Extensions to protoc 'Descriptor' type in order to define options