Fix naming of enums when long_names=false.
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>
Tue, 13 Nov 2012 22:20:44 +0000 (00:20 +0200)
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>
Tue, 13 Nov 2012 22:36:16 +0000 (00:36 +0200)
Modify test case to check that options.pb.o compiles.

Update issue 42
Status: FixedInGit

Update issue 43
Status: FixedInGit

generator/nanopb_generator.py
tests/Makefile
tests/options.expected
tests/options.proto

index 9e6f2e2..68cc800 100644 (file)
@@ -73,6 +73,9 @@ class Names:
         else:
             raise ValueError("Name parts should be of type str")
     
+    def __eq__(self, other):
+        return isinstance(other, Names) and self.parts == other.parts
+    
 def names_from_type_name(type_name):
     '''Parse Names() from FieldDescriptorProto type_name'''
     if type_name[0] != '.':
@@ -83,12 +86,15 @@ class Enum:
     def __init__(self, names, desc, enum_options):
         '''desc is EnumDescriptorProto'''
         
+        self.options = enum_options
+        self.names = names + desc.name
+        
         if enum_options.long_names:
-            self.names = names + desc.name
+            self.values = [(self.names + x.name, x.number) for x in desc.value]            
         else:
-            self.names = names
+            self.values = [(x.name, x.number) for x in desc.value] 
         
-        self.values = [(self.names + x.name, x.number) for x in desc.value]
+        self.value_longnames = [names + desc.name + x.name for x in desc.value]
     
     def __str__(self):
         result = 'typedef enum _%s {\n' % self.names
@@ -391,6 +397,15 @@ def parse_file(fdesc, file_options):
         for enum in message.enum_type:
             enums.append(Enum(names, enum, message_options))
     
+    # Fix field default values where enum short names are used.
+    for enum in enums:
+        if not enum.options.long_names:
+            for message in messages:
+                for field in message.fields:
+                    if field.default in enum.value_longnames:
+                        idx = enum.value_longnames.index(field.default)
+                        field.default = enum.values[idx][0]
+    
     return enums, messages
 
 def toposort2(data):
index 99e27ff..1f2be71 100644 (file)
@@ -82,7 +82,7 @@ run_unittests: decode_unittests encode_unittests test_cxxcompile test_encode1 te
        
        ./test_missing_fields
 
-test_options: options.pb.h options.expected
+test_options: options.pb.h options.expected options.pb.o
        cat options.expected | while read -r p; do \
            if ! grep -q "$$p" $<; then \
                echo Expected: "$$p"; \
index 960daee..61d9805 100644 (file)
@@ -2,4 +2,4 @@ char filesize\[20\];
 char msgsize\[30\];
 char fieldsize\[40\];
 pb_callback_t int32_callback;
-[^_]EnumValue1 = 1
+\sEnumValue1 = 1
index e296bcd..7eb2eb3 100644 (file)
@@ -36,4 +36,10 @@ enum Enum1
 {
     option (nanopb_enumopt).long_names = false;
     EnumValue1 = 1;
+    EnumValue2 = 2;
+}
+
+message EnumTest
+{
+    required Enum1 field = 1 [default = EnumValue2];
 }