Handle unsupported extension field types more gracefully.
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
This commit is contained in:
@@ -310,18 +310,26 @@ class ExtensionField(Field):
|
|||||||
Field.__init__(self, self.fullname + 'struct', desc, field_options)
|
Field.__init__(self, self.fullname + 'struct', desc, field_options)
|
||||||
|
|
||||||
if self.rules != 'OPTIONAL':
|
if self.rules != 'OPTIONAL':
|
||||||
raise NotImplementedError("Only 'optional' is supported for extension fields. "
|
self.skip = True
|
||||||
+ "(%s.rules == %s)" % (self.fullname, self.rules))
|
else:
|
||||||
|
self.skip = False
|
||||||
self.rules = 'OPTEXT'
|
self.rules = 'OPTEXT'
|
||||||
|
|
||||||
def extension_decl(self):
|
def extension_decl(self):
|
||||||
'''Declaration of the extension type in the .pb.h file'''
|
'''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
|
return 'extern const pb_extension_type_t %s;\n' % self.fullname
|
||||||
|
|
||||||
def extension_def(self):
|
def extension_def(self):
|
||||||
'''Definition of the extension type in the .pb.c file'''
|
'''Definition of the extension type in the .pb.c file'''
|
||||||
|
|
||||||
|
if self.skip:
|
||||||
|
return ''
|
||||||
|
|
||||||
result = 'typedef struct {\n'
|
result = 'typedef struct {\n'
|
||||||
result += str(self)
|
result += str(self)
|
||||||
result += '\n} %s;\n\n' % self.struct_name
|
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):
|
for names, extension in iterate_extensions(fdesc, base_name):
|
||||||
field_options = get_nanopb_suboptions(extension, file_options, names)
|
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.
|
# Fix field default values where enum short names are used.
|
||||||
for enum in enums:
|
for enum in enums:
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ extend AllTypes {
|
|||||||
message ExtensionMessage {
|
message ExtensionMessage {
|
||||||
extend AllTypes {
|
extend AllTypes {
|
||||||
optional ExtensionMessage AllTypes_extensionfield2 = 254;
|
optional ExtensionMessage AllTypes_extensionfield2 = 254;
|
||||||
|
required ExtensionMessage AllTypes_extensionfield3 = 253;
|
||||||
|
repeated ExtensionMessage AllTypes_extensionfield4 = 252;
|
||||||
}
|
}
|
||||||
|
|
||||||
required string test1 = 1;
|
required string test1 = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user