diff options
author | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2022-11-24 13:15:23 +0300 |
---|---|---|
committer | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2022-11-24 13:15:23 +0300 |
commit | 677c4f671a346b228cb9c6a1ae2bb81b402ec108 (patch) | |
tree | 778f7945ff65b94b31ad4d4ba721ba46161f07b5 | |
parent | 6b878fe29adf0ad954334e8988173815c860a649 (diff) |
Add reverse mapping when mangle_names is used (#783)
Should help for many cases where other files do not know
what name mangling option an included file might be using.
-rwxr-xr-x | generator/nanopb_generator.py | 17 | ||||
-rw-r--r-- | tests/regression/issue_783/SConscript | 13 | ||||
-rw-r--r-- | tests/regression/issue_783/folder_A/file_A.options | 1 | ||||
-rw-r--r-- | tests/regression/issue_783/folder_A/file_A.proto | 7 | ||||
-rw-r--r-- | tests/regression/issue_783/folder_B/file_B.proto | 6 |
5 files changed, 43 insertions, 1 deletions
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py index cf0642a..0ec8839 100755 --- a/generator/nanopb_generator.py +++ b/generator/nanopb_generator.py @@ -1709,6 +1709,7 @@ class MangleNames: self.replacement_prefix = None self.name_mapping = {} self.reverse_name_mapping = {} + self.canonical_base = Names(fdesc.package.split('.')) if self.mangle_names == nanopb_pb2.M_STRIP_PACKAGE: self.strip_prefix = "." + fdesc.package @@ -1747,7 +1748,7 @@ class MangleNames: (self.mangle_names, self.reverse_name_mapping[str(new_name)], names, new_name)) self.name_mapping[str(names)] = new_name - self.reverse_name_mapping[str(new_name)] = names + self.reverse_name_mapping[str(new_name)] = self.canonical_base + names return self.name_mapping[str(names)] @@ -1769,6 +1770,9 @@ class MangleNames: return typename + def unmangle(self, names): + return self.reverse_name_mapping.get(str(names), names) + class ProtoFile: def __init__(self, fdesc, file_options): '''Takes a FileDescriptorProto and parses it.''' @@ -1839,10 +1843,12 @@ class ProtoFile: def add_dependency(self, other): for enum in other.enums: self.dependencies[str(enum.names)] = enum + self.dependencies[str(other.manglenames.unmangle(enum.names))] = enum enum.protofile = other for msg in other.messages: self.dependencies[str(msg.name)] = msg + self.dependencies[str(other.manglenames.unmangle(msg.name))] = msg msg.protofile = other # Fix field default values where enum short names are used. @@ -2044,6 +2050,15 @@ class ProtoFile: yield '#define %s_msgid %d\n' % (msg.name, msg.msgid) yield '\n' + if self.manglenames.mangle_names != nanopb_pb2.M_NONE: + pairs = [x for x in self.manglenames.reverse_name_mapping.items() if str(x[0]) != str(x[1])] + if pairs: + modename = nanopb_pb2.TypenameMangling.Name(self.manglenames.mangle_names) + yield '/* Mapping from canonical names for the mangle_names=%s option */\n' % modename + for shortname, longname in pairs: + yield '#define %s %s\n' % (longname, shortname) + yield '\n' + yield '#ifdef __cplusplus\n' yield '} /* extern "C" */\n' yield '#endif\n' diff --git a/tests/regression/issue_783/SConscript b/tests/regression/issue_783/SConscript new file mode 100644 index 0000000..4088be5 --- /dev/null +++ b/tests/regression/issue_783/SConscript @@ -0,0 +1,13 @@ +# Regression test for issue #783: +# Could not find enum type when using mangle_names:M_STRIP_PACKAGE +# when using multiple packages. + +Import('env') + +incpath = env.Clone() +incpath.Append(CPPPATH="$BUILD/regression/issue_783") +incpath.NanopbProto(['folder_A/file_A', 'folder_A/file_A.options']) +incpath.NanopbProto(['folder_B/file_B']) + +incpath.Object('folder_A/file_A.pb.c') +incpath.Object('folder_B/file_B.pb.c') diff --git a/tests/regression/issue_783/folder_A/file_A.options b/tests/regression/issue_783/folder_A/file_A.options new file mode 100644 index 0000000..d9b4e41 --- /dev/null +++ b/tests/regression/issue_783/folder_A/file_A.options @@ -0,0 +1 @@ +* mangle_names:M_STRIP_PACKAGE diff --git a/tests/regression/issue_783/folder_A/file_A.proto b/tests/regression/issue_783/folder_A/file_A.proto new file mode 100644 index 0000000..f9d8fcd --- /dev/null +++ b/tests/regression/issue_783/folder_A/file_A.proto @@ -0,0 +1,7 @@ +syntax = "proto2"; +package folder_A; +enum my_enum { + ENUM_0 = 0; + ENUM_1 = 1; + ENUM_2 = 2; +} diff --git a/tests/regression/issue_783/folder_B/file_B.proto b/tests/regression/issue_783/folder_B/file_B.proto new file mode 100644 index 0000000..efb2ca3 --- /dev/null +++ b/tests/regression/issue_783/folder_B/file_B.proto @@ -0,0 +1,6 @@ +syntax = "proto2"; +package folder_B; +import "folder_A/file_A.proto"; +message dummy { + required folder_A.my_enum value = 1; +} |