瀏覽代碼

Correctly find templated classes in a different namespace.

Bart Hertog 5 年之前
父節點
當前提交
510600a53a

+ 10 - 3
generator/protoc-gen-eams.py

@@ -155,7 +155,12 @@ class FieldTemplateParameters:
     def update_templates(self, messages):
         if self.of_type_message:
             for msg in messages:
-                if msg.name == self.type:
+                if msg.namespace:
+                    msg_type = msg.namespace + "::" + msg.name
+                else:
+                    msg_type = msg.name
+
+                if msg_type == self.type:
                     msg_templates = deepcopy(msg.templates)
                     for tmpl in msg_templates:
                         tmpl["name"] = self.variable_name + tmpl["name"]
@@ -214,8 +219,10 @@ class OneofTemplateParameters:
 
 
 class MessageTemplateParameters:
-    def __init__(self, msg_proto):
+    def __init__(self, msg_proto, namespace):
         self.name = msg_proto.name
+        self.namespace = namespace
+
         self.msg_proto = msg_proto
         self.has_fields = len(self.msg_proto.field) > 0
         self.has_oneofs = len(self.msg_proto.oneof_decl) > 0
@@ -291,7 +298,7 @@ def generate_code(request, respones):
             raise Exception(proto_file.name + ": Sorry, proto2 is not supported, please use proto3.")
 
         for msg_type in proto_file.message_type:
-            msg = MessageTemplateParameters(msg_type)
+            msg = MessageTemplateParameters(msg_type, proto_file.package.replace(".", "::"))
             msg.update_templates(messages_array)
             messages_array.append(msg)
 

+ 1 - 1
test/proto/include_other_files.proto

@@ -46,5 +46,5 @@ message IncludedMessages {
   some.external.lib.CommonStates  state = 1;
   some.external.lib.CommonMessage msg   = 2;
   repeated_fields rf  = 3;
-  other_folder_msg sub_msg = 4;
+  sub.package.other_folder_msg sub_msg = 4;
 }

+ 3 - 0
test/proto/subfolder/file_to_include_from_subfolder.proto

@@ -32,7 +32,10 @@
 
 syntax = "proto3";
 
+package sub.package;
+
 message other_folder_msg {
   int32 val = 1;
+  repeated int32 array = 2;
 }
 

+ 4 - 3
test/test_IncludeOtherFiles.cpp

@@ -51,13 +51,14 @@ namespace test_EmbeddedAMS_IncludeOtherFiles
 {
 
 static constexpr uint32_t RF_SIZE = 3;
+static constexpr uint32_t ARRAY_SIZE = 2;
 
 TEST(IncludeOtherFiles, zero) 
 {
   InSequence s;
 
   // See if an empty message results in no data been pushed.
-  ::IncludedMessages<RF_SIZE> msg;
+  ::IncludedMessages<RF_SIZE, ARRAY_SIZE> msg;
   Mocks::WriteBufferMock buffer;
 
   EXPECT_CALL(buffer, push(_)).Times(0);
@@ -73,7 +74,7 @@ TEST(IncludeOtherFiles, set)
 {
   InSequence s;
 
-  ::IncludedMessages<RF_SIZE> msg;
+  ::IncludedMessages<RF_SIZE, ARRAY_SIZE> msg;
   Mocks::WriteBufferMock buffer;
 
   msg.set_state(some::external::lib::CommonStates::StateA);
@@ -116,7 +117,7 @@ TEST(IncludeOtherFiles, get)
 {
   InSequence s;
 
-  ::IncludedMessages<RF_SIZE> msg;
+  ::IncludedMessages<RF_SIZE, ARRAY_SIZE> msg;
   Mocks::ReadBufferMock buffer;
   ON_CALL(buffer, get_size()).WillByDefault(Return(22));