Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nanopb/nanopb.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>2022-11-24 13:15:23 +0300
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>2022-11-24 13:15:23 +0300
commit677c4f671a346b228cb9c6a1ae2bb81b402ec108 (patch)
tree778f7945ff65b94b31ad4d4ba721ba46161f07b5
parent6b878fe29adf0ad954334e8988173815c860a649 (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-xgenerator/nanopb_generator.py17
-rw-r--r--tests/regression/issue_783/SConscript13
-rw-r--r--tests/regression/issue_783/folder_A/file_A.options1
-rw-r--r--tests/regression/issue_783/folder_A/file_A.proto7
-rw-r--r--tests/regression/issue_783/folder_B/file_B.proto6
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;
+}