Allow specifying descriptorsize on field level also (#546)
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 8e1074c..445b149 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -1014,6 +1014,8 @@
self.oneofs = {}
self.desc = desc
self.math_include_required = False
+ self.packed = message_options.packed_struct
+ self.descriptorsize = message_options.descriptorsize
if message_options.msgid:
self.msgid = message_options.msgid
@@ -1030,9 +1032,6 @@
self.callback_function = "%s_callback" % self.name
break
- self.packed = message_options.packed_struct
- self.descriptorsize = message_options.descriptorsize
-
def load_fields(self, desc, message_options):
'''Load field list from DescriptorProto'''
@@ -1056,6 +1055,9 @@
if field_options.type == nanopb_pb2.FT_IGNORE:
continue
+ if field_options.descriptorsize > self.descriptorsize:
+ self.descriptorsize = field_options.descriptorsize
+
field = Field(self.name, f, field_options)
if (hasattr(f, 'oneof_index') and
f.HasField('oneof_index') and
diff --git a/tests/options/options.proto b/tests/options/options.proto
index 28ea2d5..10acca6 100644
--- a/tests/options/options.proto
+++ b/tests/options/options.proto
@@ -103,6 +103,14 @@
required int32 foo = 1;
}
+// Wide descriptor option in a single field
+message WideMessage2
+{
+ required int32 foo = 1 [(nanopb).descriptorsize = DS_8];
+ required int32 foo2 = 2 [(nanopb).descriptorsize = DS_4];
+ required int32 foo3 = 3;
+}
+
// Default value for has_ field
message HasFieldMessage
{
diff --git a/tests/options/options_c.expected b/tests/options/options_c.expected
index 8b75530..3544555 100644
--- a/tests/options/options_c.expected
+++ b/tests/options/options_c.expected
@@ -1,2 +1,3 @@
PB_BIND\(Message1, Message1, AUTO\)
PB_BIND\(WideMessage, WideMessage, 4\)
+PB_BIND\(WideMessage2, WideMessage2, 8\)