Browse Source

Generate conformance when message are nested (#879)

Motivation:

Protobuf message definitions may be nested yet we only generated payload
conformance for the top-level message.

Modifications:

- Generate conformance for messages defined within of other messages
- Update test

Result:

Messages which are defined within another message will have conformance
for GRPCProtobufPalyoad generated.
George Barnett 5 years ago
parent
commit
bf9a0df618

+ 11 - 2
Sources/protoc-gen-grpc-swift/Generator-Conformance.swift

@@ -23,8 +23,17 @@ extension Generator {
     }
     println("// Provides conformance to `GRPCPayload`")
     for message in self.file.messages {
-      let name = self.protobufNamer.fullName(message: message)
-      self.println("extension \(name): GRPCProtobufPayload {}")
+      self.printProtobufExtensions(for: message)
+    }
+  }
+
+  internal func printProtobufExtensions(for message: Descriptor) {
+    let name = self.protobufNamer.fullName(message: message)
+    self.println("extension \(name): GRPCProtobufPayload {}")
+
+    // Messages may be nested.
+    for message in message.messages {
+      self.printProtobufExtensions(for: message)
     }
   }
 }

+ 4 - 0
dev/codegen-tests/04-messages-only/golden/test.grpc.swift

@@ -30,3 +30,7 @@ import SwiftProtobuf
 
 // Provides conformance to `GRPCPayload`
 extension Codegentest_Foo: GRPCProtobufPayload {}
+extension Codegentest_Foo.FooA: GRPCProtobufPayload {}
+extension Codegentest_Foo.FooA.FooAA: GRPCProtobufPayload {}
+extension Codegentest_Foo.FooA.FooAA.FooAAA: GRPCProtobufPayload {}
+extension Codegentest_Foo.FooB: GRPCProtobufPayload {}

+ 18 - 1
dev/codegen-tests/04-messages-only/proto/test.proto

@@ -16,5 +16,22 @@ syntax = "proto3";
 package codegentest;
 
 message Foo {
-  string bar = 1;
+  FooA fooA = 1;
+  FooB fooB = 2;
+
+  message FooA {
+    FooAA fooAA = 1;
+
+    message FooAA {
+      FooAAA fooAAA = 1;
+
+      message FooAAA {
+        string bar = 1;
+      }
+    }
+  }
+
+  message FooB {
+    FooA fooA = 1;
+  }
 }