Open pradeepk opened 5 years ago
Not sure the exact cause but you are probably getting clashes since the name parts Req
and Res
are used multiple times (despite being nested).
Have you tried giving them different names and seeing what happens?
If you flatten, I am sure it will work (I haven't tried it). With the nested types, t.getContainingType needs to be recursively checked to get the nesting right. So for example the following patch worked for me:
diff --git a/codegen/src/main/scala/akka/grpc/gen/javadsl/Method.scala b/codegen/src/main/scala/akka/grpc/gen/javadsl/Method.scala
index 172536a..fd2105a 100644
--- a/codegen/src/main/scala/akka/grpc/gen/javadsl/Method.scala
+++ b/codegen/src/main/scala/akka/grpc/gen/javadsl/Method.scala
@@ -62,12 +62,20 @@ object Method {
private def methodName(name: String) =
name.head.toLower +: name.tail
- def messageType(t: Descriptor) =
- "_root_." + t.getFile.getOptions.getJavaPackage + "." + protoName(t) + "." + t.getName
-
/** Java API */
def getMessageType(t: Descriptor) = {
- t.getFile.getOptions.getJavaPackage + "." + outerClass(t) + t.getName
+ t.getFile.getOptions.getJavaPackage + "." + outerClass(t) + nestedName(t)
+ }
+
+ def getMessageTypeName(t: Descriptor) = {
+ nestedName(t).replaceFirst("\\.", "_")
+ }
+
+ def nestedName(t: Descriptor): String = {
+ if (t.getContainingType == null)
+ t.getName
+ else
+ nestedName(t.getContainingType) + "." + t.getName
}
private def outerClass(t: Descriptor) = {
diff --git a/codegen/src/main/scala/akka/grpc/gen/javadsl/Serializer.scala b/codegen/src/main/scala/akka/grpc/gen/javadsl/Serializer.scala
index e69ec43..9606ae9 100644
--- a/codegen/src/main/scala/akka/grpc/gen/javadsl/Serializer.scala
+++ b/codegen/src/main/scala/akka/grpc/gen/javadsl/Serializer.scala
@@ -10,7 +10,7 @@ final case class Serializer(name: String, init: String, messageType: String)
object Serializer {
def apply(messageType: Descriptor): Serializer = Serializer(
- messageType.getName + "Serializer",
+ Method.getMessageTypeName(messageType) + "Serializer",
s"new GoogleProtobufSerializer<>(${Method.getMessageType(messageType)}.class)",
Method.getMessageType(messageType))
}
Hi,
Sorry for resuscitating this issue, but the title matches my problem although it might not be exactly the same thing... I am having an issue where the names of the Serializers get duplicated for a proto definition where I want to define nested messages and the innermost name is repeated.
For example, consider the following:
service Example {
rpc exampleRpc1 (Namespace1.SomeRequest) returns (Namespace1.SomeReply) {}
rpc exampleRpc2 (Namespace2.SomeRequest) returns (Namespace2.SomeReply) {}
}
message Namespace1 {
message SomeRequest {
string name = 1;
}
message SomeReply {
string message = 1;
}
}
message Namespace2 {
message SomeRequest {
string name = 1;
}
message SomeReply {
string message = 1;
}
}
Compiling this would result in errors like:
SomeRequestSerializer is already defined as value SomeRequestSerializer
Because the resulting scala service description would be something like:
object Example extends akka.grpc.ServiceDescription {
val name = "Example"
val descriptor: com.google.protobuf.Descriptors.FileDescriptor =
com.example.helloworld.HelloworldProto.javaDescriptor;
object Serializers {
import akka.grpc.scaladsl.ScalapbProtobufSerializer
val SomeRequestSerializer = new ScalapbProtobufSerializer(com.example.helloworld.Namespace1.SomeRequest.messageCompanion)
val SomeRequestSerializer = new ScalapbProtobufSerializer(com.example.helloworld.Namespace2.SomeRequest.messageCompanion)
val SomeReplySerializer = new ScalapbProtobufSerializer(com.example.helloworld.Namespace1.SomeReply.messageCompanion)
val SomeReplySerializer = new ScalapbProtobufSerializer(com.example.helloworld.Namespace2.SomeReply.messageCompanion)
}
}
same here. member names are generated without any regard for package name
I am trying to generate akka-grpc code for a proto file with nested message types:
And what gets generated is this:
2 issues:
ai.grakn.rpc.proto.KeyspaceProto.Keyspace.Create.Req
etc.