Handle unsupported extension field types more gracefully.
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>
Sun, 8 Sep 2013 08:05:20 +0000 (11:05 +0300)
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>
Sun, 8 Sep 2013 08:05:20 +0000 (11:05 +0300)
Previously the generator would stop with NotImplementedException as
soon as a required or repeated extension field is found. New behaviour
is to just ignore the unsupported field and note that in a comment
in the generated file.

Furthermore, allow skipping of extension fields using the generator
option (nanopb).type = FT_IGNORE.

Update issue 83
Status: FixedInGit

generator/nanopb_generator.py
tests/extensions.proto

index e3cddb6..55e5ab6 100644 (file)
@@ -310,18 +310,26 @@ class ExtensionField(Field):
         Field.__init__(self, self.fullname + 'struct', desc, field_options)
         
         if self.rules != 'OPTIONAL':
-            raise NotImplementedError("Only 'optional' is supported for extension fields. "
-               + "(%s.rules == %s)" % (self.fullname, self.rules))
-
-        self.rules = 'OPTEXT'
+            self.skip = True
+        else:
+            self.skip = False
+            self.rules = 'OPTEXT'
 
     def extension_decl(self):
         '''Declaration of the extension type in the .pb.h file'''
+        if self.skip:
+            msg = '/* Extension field %s was skipped because only "optional"\n' % self.fullname
+            msg +='   type of extension fields is currently supported. */\n'
+            return msg
+        
         return 'extern const pb_extension_type_t %s;\n' % self.fullname
 
     def extension_def(self):
         '''Definition of the extension type in the .pb.c file'''
 
+        if self.skip:
+            return ''
+
         result  = 'typedef struct {\n'
         result += str(self)
         result += '\n} %s;\n\n' % self.struct_name
@@ -475,7 +483,8 @@ def parse_file(fdesc, file_options):
     
     for names, extension in iterate_extensions(fdesc, base_name):
         field_options = get_nanopb_suboptions(extension, file_options, names)
-        extensions.append(ExtensionField(names, extension, field_options))
+        if field_options.type != nanopb_pb2.FT_IGNORE:
+            extensions.append(ExtensionField(names, extension, field_options))
     
     # Fix field default values where enum short names are used.
     for enum in enums:
index cbffdce..d85e819 100644 (file)
@@ -7,6 +7,8 @@ extend AllTypes {
 message ExtensionMessage {
     extend AllTypes {
         optional ExtensionMessage AllTypes_extensionfield2 = 254;
+       required ExtensionMessage AllTypes_extensionfield3 = 253;
+       repeated ExtensionMessage AllTypes_extensionfield4 = 252;
     }
     
     required string test1 = 1;