From fc70267f0e9c728d50911e75403397eac4c96c44 Mon Sep 17 00:00:00 2001 From: Oshiumi Date: Tue, 7 Apr 2020 01:17:09 +0900 Subject: [PATCH] Fix generating output with nested resource --- src/compiler/ruby_generator_string-inl.h | 8 +++++--- .../codegen/grpc/testing/package_options_ruby_style.proto | 5 +++++ src/ruby/spec/pb/codegen/package_option_spec.rb | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/compiler/ruby_generator_string-inl.h b/src/compiler/ruby_generator_string-inl.h index 005e9f09c75..bece54ac4dd 100644 --- a/src/compiler/ruby_generator_string-inl.h +++ b/src/compiler/ruby_generator_string-inl.h @@ -119,12 +119,14 @@ inline grpc::string RubyPackage(const grpc::protobuf::FileDescriptor* file) { inline grpc::string RubyTypeOf(const grpc::protobuf::Descriptor* descriptor, const grpc::string& package) { std::string proto_type = descriptor->full_name(); + ReplacePrefix(&proto_type, package, ""); // remove the leading package if present + ReplacePrefix(&proto_type, ".", ""); // remove the leading . (no package) + if (descriptor->file()->options().has_ruby_package()) { - proto_type = RubyPackage(descriptor->file()) + "." + descriptor->name(); + proto_type = RubyPackage(descriptor->file()) + "." + proto_type; } grpc::string res(proto_type); - ReplacePrefix(&res, package, ""); // remove the leading package if present - ReplacePrefix(&res, ".", ""); // remove the leading . (no package) + if (res.find('.') == grpc::string::npos) { return res; } else { diff --git a/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto b/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto index 4bfe61e2f63..40400b67d2f 100644 --- a/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +++ b/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto @@ -27,8 +27,13 @@ message AnotherTestResponse { } message Foo { } +message Bar { + message Baz { } +} + service AnotherTestService { rpc GetTest(AnotherTestRequest) returns (AnotherTestResponse) { } rpc OtherTest(Thing) returns (Thing) { } rpc FooTest(Foo) returns (Foo) { } + rpc NestedMessageTest(Foo) returns (Bar.Baz) { } } diff --git a/src/ruby/spec/pb/codegen/package_option_spec.rb b/src/ruby/spec/pb/codegen/package_option_spec.rb index 870f53ef297..cc6649c5afa 100644 --- a/src/ruby/spec/pb/codegen/package_option_spec.rb +++ b/src/ruby/spec/pb/codegen/package_option_spec.rb @@ -40,6 +40,8 @@ describe 'Code Generation Options' do expect(services[:OtherTest].output).to eq(A::Other::Thing) expect(services[:FooTest].input).to eq(RPC::Test::New::Package::Options::Foo) expect(services[:FooTest].output).to eq(RPC::Test::New::Package::Options::Foo) + expect(services[:NestedMessageTest].input).to eq(RPC::Test::New::Package::Options::Foo) + expect(services[:NestedMessageTest].output).to eq(RPC::Test::New::Package::Options::Bar::Baz) end end end