|
|
|
@ -40,14 +40,40 @@ inline ::grpc::string SystemImport(const ::grpc::string &import) { |
|
|
|
|
return ::grpc::string("#import <" + import + ">\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline ::grpc::string PreprocIf(const ::grpc::string& condition, |
|
|
|
|
const ::grpc::string& if_true) { |
|
|
|
|
// Preprocessor condition flags.
|
|
|
|
|
using PreprocConditionFlag = uint32_t; |
|
|
|
|
constexpr PreprocConditionFlag kInvertCondition = 0b0001; |
|
|
|
|
constexpr PreprocConditionFlag kCheckIfDefined = 0b0010; |
|
|
|
|
|
|
|
|
|
// Convenience flag set.
|
|
|
|
|
constexpr PreprocConditionFlag kIfNotOrNotDefined = |
|
|
|
|
kInvertCondition | kCheckIfDefined; |
|
|
|
|
|
|
|
|
|
inline ::grpc::string PreprocConditional(::grpc::string symbol, |
|
|
|
|
PreprocConditionFlag flags) { |
|
|
|
|
if (flags & kCheckIfDefined) { |
|
|
|
|
return (flags & kInvertCondition) |
|
|
|
|
? "!defined(" + symbol + ") || !" + symbol |
|
|
|
|
: "defined(" + symbol + ") && " + symbol; |
|
|
|
|
} else { |
|
|
|
|
return (flags & kInvertCondition) |
|
|
|
|
? "!" + symbol |
|
|
|
|
: symbol; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline ::grpc::string PreprocIf(const ::grpc::string& symbol, |
|
|
|
|
const ::grpc::string& if_true, |
|
|
|
|
PreprocConditionFlag flags = 0) { |
|
|
|
|
::grpc::string condition = PreprocConditional(symbol, flags); |
|
|
|
|
return ::grpc::string("#if " + condition + "\n" + if_true + "#endif\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline ::grpc::string PreprocIfElse(const ::grpc::string& condition, |
|
|
|
|
inline ::grpc::string PreprocIfElse(const ::grpc::string& symbol, |
|
|
|
|
const ::grpc::string& if_true, |
|
|
|
|
const ::grpc::string& if_false) { |
|
|
|
|
const ::grpc::string& if_false, |
|
|
|
|
PreprocConditionFlag flags = 0) { |
|
|
|
|
::grpc::string condition = PreprocConditional(symbol, flags); |
|
|
|
|
return ::grpc::string("#if " + condition + "\n" + |
|
|
|
|
if_true + "#else\n" + if_false + "#endif\n"); |
|
|
|
|
} |
|
|
|
@ -71,7 +97,8 @@ inline ::grpc::string ImportProtoHeaders( |
|
|
|
|
"GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS"; |
|
|
|
|
return PreprocIfElse(kFrameworkImportsCondition, |
|
|
|
|
indent + SystemImport(framework_header), |
|
|
|
|
indent + LocalImport(header)); |
|
|
|
|
indent + LocalImport(header), |
|
|
|
|
kCheckIfDefined); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
@ -81,6 +108,13 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { |
|
|
|
|
ObjectiveCGrpcGenerator() {} |
|
|
|
|
virtual ~ObjectiveCGrpcGenerator() {} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
static const ::grpc::string kNonNullBegin = "NS_ASSUME_NONNULL_BEGIN\n"; |
|
|
|
|
static const ::grpc::string kNonNullEnd = "NS_ASSUME_NONNULL_END\n"; |
|
|
|
|
static const ::grpc::string kProtocolOnly = "GPB_GRPC_PROTOCOL_ONLY"; |
|
|
|
|
static const ::grpc::string kForwardDeclare = |
|
|
|
|
"GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO"; |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
virtual bool Generate(const grpc::protobuf::FileDescriptor* file, |
|
|
|
|
const ::grpc::string& parameter, |
|
|
|
@ -91,15 +125,13 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
auto OmitIf = [](const ::grpc::string& s, const ::grpc::string& v) { |
|
|
|
|
return PreprocIf(s, v, kInvertCondition | kCheckIfDefined); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
::grpc::string file_name = |
|
|
|
|
google::protobuf::compiler::objectivec::FilePath(file); |
|
|
|
|
|
|
|
|
|
static const ::grpc::string kNonNullBegin = "NS_ASSUME_NONNULL_BEGIN\n"; |
|
|
|
|
static const ::grpc::string kNonNullEnd = "NS_ASSUME_NONNULL_END\n"; |
|
|
|
|
static const ::grpc::string kForwardDeclareCondition = |
|
|
|
|
"GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO"; |
|
|
|
|
static const ::grpc::string kOmitInterfaceCondition = |
|
|
|
|
"GPB_GRPC_OMIT_INTERFACE"; |
|
|
|
|
{ |
|
|
|
|
// Generate .pbrpc.h
|
|
|
|
|
|
|
|
|
@ -134,14 +166,14 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Write(context, file_name + ".pbrpc.h", |
|
|
|
|
PreprocIf("!" + kForwardDeclareCondition, imports) + "\n" + |
|
|
|
|
PreprocIf("!" + kOmitInterfaceCondition, system_imports) + "\n" + |
|
|
|
|
PreprocIfElse(kForwardDeclareCondition, |
|
|
|
|
class_declarations, class_imports) + "\n" + |
|
|
|
|
OmitIf(kForwardDeclare, imports) + "\n" + |
|
|
|
|
OmitIf(kProtocolOnly, system_imports) + "\n" + |
|
|
|
|
PreprocIfElse(kForwardDeclare, class_declarations, class_imports, |
|
|
|
|
kCheckIfDefined) + "\n" + |
|
|
|
|
forward_declarations + "\n" + |
|
|
|
|
kNonNullBegin + "\n" + |
|
|
|
|
protocols + "\n" + |
|
|
|
|
PreprocIf("!" + kOmitInterfaceCondition, interfaces) + "\n" + |
|
|
|
|
OmitIf(kProtocolOnly, interfaces) + "\n" + |
|
|
|
|
kNonNullEnd + "\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -166,10 +198,8 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Write(context, file_name + ".pbrpc.m", |
|
|
|
|
PreprocIf("!" + kOmitInterfaceCondition, |
|
|
|
|
imports + "\n" + |
|
|
|
|
class_imports + "\n" + |
|
|
|
|
definitions)); |
|
|
|
|
OmitIf(kProtocolOnly, |
|
|
|
|
imports + "\n" + class_imports + "\n" + definitions)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|