aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/compiler/objective_c_generator.cc
diff options
context:
space:
mode:
authorGravatar Jorge Canizales <jcanizales@google.com>2015-05-12 22:56:04 -0700
committerGravatar Jorge Canizales <jcanizales@google.com>2015-05-15 09:56:29 -0700
commit472f0b0a6b52119698197c221958af959f95d87f (patch)
tree16612e536a98f9fedcc9a59c13c33371b8c83ab1 /src/compiler/objective_c_generator.cc
parent9a065d2e2f91df6ff836771a2105d2368a72b3b8 (diff)
Fixes generated implementation file and adjusts plugin to proto3
Still missing: retrieving prefix from file option.
Diffstat (limited to 'src/compiler/objective_c_generator.cc')
-rw-r--r--src/compiler/objective_c_generator.cc159
1 files changed, 77 insertions, 82 deletions
diff --git a/src/compiler/objective_c_generator.cc b/src/compiler/objective_c_generator.cc
index d1482a40d0..6898b4dda3 100644
--- a/src/compiler/objective_c_generator.cc
+++ b/src/compiler/objective_c_generator.cc
@@ -40,14 +40,15 @@
#include <sstream>
-namespace grpc_objective_c_generator {
-namespace {
-
using ::grpc::protobuf::io::Printer;
using ::grpc::protobuf::MethodDescriptor;
+using ::grpc::protobuf::ServiceDescriptor;
using ::std::map;
using ::grpc::string;
+namespace grpc_objective_c_generator {
+namespace {
+
void PrintProtoRpcDeclarationAsPragma(Printer *printer,
const MethodDescriptor *method,
map<string, string> vars) {
@@ -72,6 +73,7 @@ void PrintMethodSignature(Printer *printer,
}
// TODO(jcanizales): Put this on a new line and align colons.
+ // TODO(jcanizales): eventHandler for server streaming?
printer->Print(" handler:(void(^)(");
if (method->server_streaming()) {
printer->Print("BOOL done, ");
@@ -112,69 +114,67 @@ void PrintMethodDeclarations(Printer *printer,
printer->Print(";\n\n\n");
}
-void PrintSourceMethodSimpleBlock(Printer *printer,
- const MethodDescriptor *method,
- map<string, string> vars) {
- vars["method_name"] = method->name();
- vars["request_type"] = method->input_type()->name();
- vars["response_type"] = method->output_type()->name();
+void PrintSimpleImplementation(Printer *printer,
+ const MethodDescriptor *method,
+ map<string, string> vars) {
+ printer->Print("{\n");
+ printer->Print(vars, "[[self RPCTo$method_name$With");
+ 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");
}
-void PrintSourceMethodAdvanced(Printer *printer,
- const MethodDescriptor *method,
- map<string, string> vars) {
+void PrintMethodImplementations(Printer *printer,
+ const MethodDescriptor *method,
+ map<string, string> vars) {
vars["method_name"] = method->name();
vars["request_type"] = method->input_type()->name();
vars["response_type"] = method->output_type()->name();
- PrintAdvancedSignature(printer, method, vars);
+ PrintProtoRpcDeclarationAsPragma(printer, method, vars);
- printer->Print(" {\n");
- printer->Indent();
- printer->Print(vars, "return [self $method_name$WithRequest:request "
- "client:[self newClient]];\n");
- printer->Outdent();
- printer->Print("}\n");
-}
+ // TODO(jcanizales): Print documentation from the method.
+ PrintSimpleSignature(printer, method, vars);
+ PrintSimpleImplementation(printer, method, vars);
-void PrintSourceMethodHandler(Printer *printer,
- const MethodDescriptor *method,
- std::map<grpc::string, grpc::string> *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");
+ printer->Print("// Returns a not-yet-started RPC object.\n");
+ PrintAdvancedSignature(printer, method, vars);
+ PrintAdvancedImplementation(printer, method, vars);
}
-}
+} // namespace
-grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service,
- const string prefix) {
- grpc::string output;
+string GetHeader(const ServiceDescriptor *service, const string prefix) {
+ string output;
grpc::protobuf::io::StringOutputStream output_stream(&output);
Printer printer(&output_stream, '$');
@@ -192,52 +192,47 @@ grpc::string GetHeader(const grpc::protobuf::ServiceDescriptor *service,
printer.Print("// Basic service implementation, over gRPC, that only does"
" marshalling and parsing.\n");
- // use prefix
- printer.Print(vars, "@interface RMT$service_name$ :"
- " ProtoService<RMT$service_name$>\n");
+ printer.Print(vars, "@interface $prefix$$service_name$ :"
+ " ProtoService<$prefix$$service_name$>\n");
printer.Print("- (instancetype)initWithHost:(NSString *)host"
" NS_DESIGNATED_INITIALIZER;\n");
printer.Print("@end\n");
return output;
}
-grpc::string GetSource(const grpc::protobuf::ServiceDescriptor *service,
- const string prefix) {
- grpc::string output;
+string GetSource(const ServiceDescriptor *service, const string prefix) {
+ string output;
grpc::protobuf::io::StringOutputStream output_stream(&output);
Printer printer(&output_stream, '$');
map<string, string> vars = {{"service_name", service->name()},
+ {"package", service->file()->package()},
{"prefix", prefix}};
- printer.Print(vars, "#import \"$service_name$Stub.pb.h\"\n");
- printer.Print("#import \"PBGeneratedMessage+GRXSource.h\"\n\n");
- vars["full_name"] = service->full_name();
+
+ printer.Print(vars,
+ "static NSString *const kPackageName = @\"$package$\";\n");
printer.Print(vars,
- "static NSString *const kInterface = @\"$full_name$\";\n");
- printer.Print("@implementation $service_name$Stub\n\n");
+ "static NSString *const kServiceName = @\"$service_name$\";\n\n");
+
+ printer.Print(vars, "@implementation $prefix$$service_name$\n\n");
+
+ printer.Print("// Designated initializer\n");
printer.Print("- (instancetype)initWithHost:(NSString *)host {\n");
- printer.Indent();
- printer.Print("if ((self = [super initWithHost:host "
- "interface:kInterface])) {\n");
- printer.Print("}\n");
- printer.Print("return self;\n");
- printer.Outdent();
+ printer.Print(" return (self = [super initWithHost:host"
+ " packageName:kPackageName serviceName:kServiceName]);\n");
printer.Print("}\n\n");
- printer.Print("#pragma mark Simple block handlers.\n");
- for (int i = 0; i < service->method_count(); i++) {
- PrintSourceMethodSimpleBlock(&printer, service->method(i), vars);
- }
- printer.Print("\n");
- printer.Print("#pragma mark Advanced handlers.\n");
- for (int i = 0; i < service->method_count(); i++) {
- PrintSourceMethodAdvanced(&printer, service->method(i), vars);
- }
- printer.Print("\n");
- printer.Print("#pragma mark Handlers for subclasses "
- "(stub wrappers) to override.\n");
+ printer.Print("// Override superclass initializer to disallow different"
+ " package and service names.\n");
+ printer.Print("- (instancetype)initWithHost:(NSString *)host\n");
+ printer.Print(" packageName:(NSString *)packageName\n");
+ printer.Print(" serviceName:(NSString *)serviceName {\n");
+ printer.Print(" return [self initWithHost:host];\n");
+ printer.Print("}\n\n\n");
+
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");
return output;
}