Fix unsigned enums not working correctly inside OneOf (#611)
Fixed also a few smaller issues where generator didn't consider
fields inside oneof for field name mangling.
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 5759a7f..8e1074c 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -1164,9 +1164,9 @@
'''Return X-macro declaration of all fields in this message.'''
Field.macro_x_param = 'X'
Field.macro_a_param = 'a'
- while any(field.name == Field.macro_x_param for field in self.fields):
+ while any(field.name == Field.macro_x_param for field in self.all_fields()):
Field.macro_x_param += '_'
- while any(field.name == Field.macro_a_param for field in self.fields):
+ while any(field.name == Field.macro_a_param for field in self.all_fields()):
Field.macro_a_param += '_'
result = '#define %s_FIELDLIST(%s, %s) \\\n' % (self.name,
@@ -1518,7 +1518,7 @@
for enum in other.enums:
if not enum.options.long_names:
for message in self.messages:
- for field in message.fields:
+ for field in message.all_fields():
if field.default in enum.value_longnames:
idx = enum.value_longnames.index(field.default)
field.default = enum.values[idx][0]
@@ -1527,7 +1527,7 @@
for enum in other.enums:
if not enum.has_negative():
for message in self.messages:
- for field in message.fields:
+ for field in message.all_fields():
if field.pbtype == 'ENUM' and field.ctype == enum.names:
field.pbtype = 'UENUM'
@@ -1746,7 +1746,7 @@
# Add check for sizeof(double)
has_double = False
for msg in self.messages:
- for field in msg.fields:
+ for field in msg.all_fields():
if field.ctype == 'double':
has_double = True
diff --git a/tests/regression/issue_611/SConscript b/tests/regression/issue_611/SConscript
new file mode 100644
index 0000000..0043539
--- /dev/null
+++ b/tests/regression/issue_611/SConscript
@@ -0,0 +1,7 @@
+# Regression test for #611:
+# Enum messages inside OneOf generated as ENUM instead of UENUM
+
+Import("env")
+
+env.NanopbProto("uenum.proto")
+env.Match(["uenum.pb.h", "uenum.expected"])
diff --git a/tests/regression/issue_611/uenum.expected b/tests/regression/issue_611/uenum.expected
new file mode 100644
index 0000000..507c590
--- /dev/null
+++ b/tests/regression/issue_611/uenum.expected
@@ -0,0 +1,5 @@
+STATIC.* ONEOF.* ENUM.*MyEnum
+STATIC.* ONEOF.* UENUM.*MyUEnum
+! [^U]ENUM.*MyUEnum
+! UENUM.*MyEnum
+
diff --git a/tests/regression/issue_611/uenum.proto b/tests/regression/issue_611/uenum.proto
new file mode 100644
index 0000000..f6df218
--- /dev/null
+++ b/tests/regression/issue_611/uenum.proto
@@ -0,0 +1,28 @@
+syntax = "proto2";
+
+enum my_enum {
+ E0 = 0;
+ E240 = 240;
+ E1 = -1;
+}
+
+enum my_uenum {
+ U0 = 0;
+ U240 = 240;
+}
+
+message my_message_regular {
+ required my_enum MyEnum = 1;
+ required my_uenum MyUEnum = 2;
+}
+
+message my_message_oneof {
+ required uint32 Data1 = 1;
+ oneof Data {
+ bool null = 2;
+ my_enum MyEnum = 3;
+ my_uenum MyUEnum = 4;
+ }
+}
+
+