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.
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 @@
         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 @@
                     (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 @@
 
         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 @@
     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 @@
                       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;
+}