Skip to content
Snippets Groups Projects
Commit 472f0b0a authored by Jorge Canizales's avatar Jorge Canizales
Browse files

Fixes generated implementation file and adjusts plugin to proto3

Still missing: retrieving prefix from file option.
parent 9a065d2e
No related branches found
No related tags found
No related merge requests found
...@@ -40,14 +40,15 @@ ...@@ -40,14 +40,15 @@
#include <sstream> #include <sstream>
namespace grpc_objective_c_generator {
namespace {
using ::grpc::protobuf::io::Printer; using ::grpc::protobuf::io::Printer;
using ::grpc::protobuf::MethodDescriptor; using ::grpc::protobuf::MethodDescriptor;
using ::grpc::protobuf::ServiceDescriptor;
using ::std::map; using ::std::map;
using ::grpc::string; using ::grpc::string;
namespace grpc_objective_c_generator {
namespace {
void PrintProtoRpcDeclarationAsPragma(Printer *printer, void PrintProtoRpcDeclarationAsPragma(Printer *printer,
const MethodDescriptor *method, const MethodDescriptor *method,
map<string, string> vars) { map<string, string> vars) {
...@@ -72,6 +73,7 @@ void PrintMethodSignature(Printer *printer, ...@@ -72,6 +73,7 @@ void PrintMethodSignature(Printer *printer,
} }
// TODO(jcanizales): Put this on a new line and align colons. // TODO(jcanizales): Put this on a new line and align colons.
// TODO(jcanizales): eventHandler for server streaming?
printer->Print(" handler:(void(^)("); printer->Print(" handler:(void(^)(");
if (method->server_streaming()) { if (method->server_streaming()) {
printer->Print("BOOL done, "); printer->Print("BOOL done, ");
...@@ -112,69 +114,67 @@ void PrintMethodDeclarations(Printer *printer, ...@@ -112,69 +114,67 @@ void PrintMethodDeclarations(Printer *printer,
printer->Print(";\n\n\n"); printer->Print(";\n\n\n");
} }
void PrintSourceMethodSimpleBlock(Printer *printer, void PrintSimpleImplementation(Printer *printer,
const MethodDescriptor *method, const MethodDescriptor *method,
map<string, string> vars) { map<string, string> vars) {
vars["method_name"] = method->name(); printer->Print("{\n");
vars["request_type"] = method->input_type()->name(); printer->Print(vars, "[[self RPCTo$method_name$With");
vars["response_type"] = method->output_type()->name(); if (method->client_streaming()) {
printer->Print("RequestsWriter:requestsWriter"); //TODO(jcanizales):request?
} else {
printer->Print("Request:request");
}
printer->Print(" handler:handler] start];\n");
printer->Print("}\n");
}
PrintSimpleSignature(printer, method, vars); void PrintAdvancedImplementation(Printer *printer,
const MethodDescriptor *method,
map<string, string> vars) {
printer->Print("{\n");
printer->Print(vars, " return [self RPCToMethod:@\"$method_name$\"\n");
printer->Print(" requestsWriter:");
if (method->client_streaming()) {
printer->Print("requestsWriter\n");
} else {
printer->Print("[GRXWriter writerWithValue:request]\n");
}
printer->Print(vars, " responseClass:[$response_type$ class]\n");
printer->Print(" responsesWriteable:[GRXWriteable ");
if (method->server_streaming()) {
printer->Print("writeableWithStreamHandler:handler]];\n");
} else {
printer->Print("writeableWithSingleValueHandler:handler]];\n");
}
printer->Print(" {\n");
printer->Indent();
printer->Print(vars, "return [[self $method_name$WithRequest:request] "
"connectHandler:^(id value, NSError *error) {\n");
printer->Indent();
printer->Print("handler(value, error);\n");
printer->Outdent();
printer->Print("}];\n");
printer->Outdent();
printer->Print("}\n"); printer->Print("}\n");
} }
void PrintSourceMethodAdvanced(Printer *printer, void PrintMethodImplementations(Printer *printer,
const MethodDescriptor *method, const MethodDescriptor *method,
map<string, string> vars) { map<string, string> vars) {
vars["method_name"] = method->name(); vars["method_name"] = method->name();
vars["request_type"] = method->input_type()->name(); vars["request_type"] = method->input_type()->name();
vars["response_type"] = method->output_type()->name(); vars["response_type"] = method->output_type()->name();
PrintAdvancedSignature(printer, method, vars); PrintProtoRpcDeclarationAsPragma(printer, method, vars);
printer->Print(" {\n"); // TODO(jcanizales): Print documentation from the method.
printer->Indent(); PrintSimpleSignature(printer, method, vars);
printer->Print(vars, "return [self $method_name$WithRequest:request " PrintSimpleImplementation(printer, method, vars);
"client:[self newClient]];\n");
printer->Outdent();
printer->Print("}\n");
}
void PrintSourceMethodHandler(Printer *printer, printer->Print("// Returns a not-yet-started RPC object.\n");
const MethodDescriptor *method, PrintAdvancedSignature(printer, method, vars);
std::map<grpc::string, grpc::string> *vars) { PrintAdvancedImplementation(printer, method, vars);
(*vars)["method_name"] = method->name();
(*vars)["response_type"] = PrefixedName(method->output_type()->name());
(*vars)["caps_name"] = grpc_generator::CapitalizeFirstLetter(method->name());
printer->Print(*vars, "- (GRXSource *)$method_name$WithRequest:"
"(id<GRXSource>)request client:(PBgRPCClient *)client {\n");
printer->Indent();
printer->Print(*vars,
"return [self responseWithMethod:$@\"$caps_name\"\n");
printer->Print(*vars,
" class:[$response_type$ class]\n");
printer->Print(" request:request\n");
printer->Print(" client:client];\n");
printer->Outdent();
printer->Print("}\n");
} }
} } // namespace
grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service, string GetHeader(const ServiceDescriptor *service, const string prefix) {
const string prefix) { string output;
grpc::string output;
grpc::protobuf::io::StringOutputStream output_stream(&output); grpc::protobuf::io::StringOutputStream output_stream(&output);
Printer printer(&output_stream, '$'); Printer printer(&output_stream, '$');
...@@ -192,52 +192,47 @@ grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service, ...@@ -192,52 +192,47 @@ grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service,
printer.Print("// Basic service implementation, over gRPC, that only does" printer.Print("// Basic service implementation, over gRPC, that only does"
" marshalling and parsing.\n"); " marshalling and parsing.\n");
// use prefix printer.Print(vars, "@interface $prefix$$service_name$ :"
printer.Print(vars, "@interface RMT$service_name$ :" " ProtoService<$prefix$$service_name$>\n");
" ProtoService<RMT$service_name$>\n");
printer.Print("- (instancetype)initWithHost:(NSString *)host" printer.Print("- (instancetype)initWithHost:(NSString *)host"
" NS_DESIGNATED_INITIALIZER;\n"); " NS_DESIGNATED_INITIALIZER;\n");
printer.Print("@end\n"); printer.Print("@end\n");
return output; return output;
} }
grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service, string GetSource(const ServiceDescriptor *service, const string prefix) {
const string prefix) { string output;
grpc::string output;
grpc::protobuf::io::StringOutputStream output_stream(&output); grpc::protobuf::io::StringOutputStream output_stream(&output);
Printer printer(&output_stream, '$'); Printer printer(&output_stream, '$');
map<string, string> vars = {{"service_name", service->name()}, map<string, string> vars = {{"service_name", service->name()},
{"package", service->file()->package()},
{"prefix", prefix}}; {"prefix", prefix}};
printer.Print(vars, "#import \"$service_name$Stub.pb.h\"\n");
printer.Print("#import \"PBGeneratedMessage+GRXSource.h\"\n\n"); printer.Print(vars,
vars["full_name"] = service->full_name(); "static NSString *const kPackageName = @\"$package$\";\n");
printer.Print(vars, printer.Print(vars,
"static NSString *const kInterface = @\"$full_name$\";\n"); "static NSString *const kServiceName = @\"$service_name$\";\n\n");
printer.Print("@implementation $service_name$Stub\n\n");
printer.Print(vars, "@implementation $prefix$$service_name$\n\n");
printer.Print("// Designated initializer\n");
printer.Print("- (instancetype)initWithHost:(NSString *)host {\n"); printer.Print("- (instancetype)initWithHost:(NSString *)host {\n");
printer.Indent(); printer.Print(" return (self = [super initWithHost:host"
printer.Print("if ((self = [super initWithHost:host " " packageName:kPackageName serviceName:kServiceName]);\n");
"interface:kInterface])) {\n");
printer.Print("}\n");
printer.Print("return self;\n");
printer.Outdent();
printer.Print("}\n\n"); printer.Print("}\n\n");
printer.Print("#pragma mark Simple block handlers.\n"); printer.Print("// Override superclass initializer to disallow different"
for (int i = 0; i < service->method_count(); i++) { " package and service names.\n");
PrintSourceMethodSimpleBlock(&printer, service->method(i), vars); printer.Print("- (instancetype)initWithHost:(NSString *)host\n");
} printer.Print(" packageName:(NSString *)packageName\n");
printer.Print("\n"); printer.Print(" serviceName:(NSString *)serviceName {\n");
printer.Print("#pragma mark Advanced handlers.\n"); printer.Print(" return [self initWithHost:host];\n");
for (int i = 0; i < service->method_count(); i++) { printer.Print("}\n\n\n");
PrintSourceMethodAdvanced(&printer, service->method(i), vars);
}
printer.Print("\n");
printer.Print("#pragma mark Handlers for subclasses "
"(stub wrappers) to override.\n");
for (int i = 0; i < service->method_count(); i++) { for (int i = 0; i < service->method_count(); i++) {
PrintSourceMethodHandler(&printer, service->method(i), &vars); PrintMethodImplementations(&printer, service->method(i), vars);
} }
printer.Print("@end\n"); printer.Print("@end\n");
return output; return output;
} }
......
...@@ -38,9 +38,13 @@ ...@@ -38,9 +38,13 @@
namespace grpc_objective_c_generator { namespace grpc_objective_c_generator {
// Returns the content to be included in the "global_scope" insertion point of
// the generated header file.
grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service, grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service,
const grpc::string prefix); const grpc::string prefix);
// Returns the content to be included in the "global_scope" insertion point of
// the generated implementation file.
grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service, grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service,
const grpc::string prefix); const grpc::string prefix);
......
...@@ -62,20 +62,20 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { ...@@ -62,20 +62,20 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
// Generate .pb.h // Generate .pb.h
Insert(context, file_name + ".pb.h", "imports", Insert(context, file_name + ".pbobjc.h", "imports",
"#import <gRPC/ProtoService.h>\n"); "#import <gRPC/ProtoService.h>\n");
Insert(context, file_name + ".pb.h", "global_scope", Insert(context, file_name + ".pbobjc.h", "global_scope",
grpc_objective_c_generator::GetHeader(service, prefix)); grpc_objective_c_generator::GetHeader(service, prefix));
// Generate .pb.m // Generate .pb.m
Insert(context, file_name + ".pb.m", "imports", Insert(context, file_name + ".pbobjc.m", "imports",
"#import <gRPC/GRXWriteable.h>\n" "#import <gRPC/GRXWriteable.h>\n"
"#import <gRPC/GRXWriter+Immediate.h>\n" "#import <gRPC/GRXWriter+Immediate.h>\n"
"#import <gRPC/ProtoRPC.h>\n"); "#import <gRPC/ProtoRPC.h>\n");
Insert(context, file_name + ".pb.m", "global_scope", Insert(context, file_name + ".pbobjc.m", "global_scope",
grpc_objective_c_generator::GetSource(service, prefix)); grpc_objective_c_generator::GetSource(service, prefix));
} }
......
...@@ -44,6 +44,7 @@ static NSString *const kServiceName = @"TestService"; ...@@ -44,6 +44,7 @@ static NSString *const kServiceName = @"TestService";
return [self initWithHost:host]; return [self initWithHost:host];
} }
#pragma mark EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty) #pragma mark EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty)
// One empty request followed by one empty response. // One empty request followed by one empty response.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment