@@ -37,12 +37,14 @@ namespace grpc {
37
37
namespace {
38
38
bool ClientStreaming (const RPCCall *method) {
39
39
const Value *val = method->attributes .Lookup (" streaming" );
40
- return val != nullptr && (val->constant == " client" || val->constant == " bidi" );
40
+ return val != nullptr &&
41
+ (val->constant == " client" || val->constant == " bidi" );
41
42
}
42
43
43
44
bool ServerStreaming (const RPCCall *method) {
44
45
const Value *val = method->attributes .Lookup (" streaming" );
45
- return val != nullptr && (val->constant == " server" || val->constant == " bidi" );
46
+ return val != nullptr &&
47
+ (val->constant == " server" || val->constant == " bidi" );
46
48
}
47
49
48
50
void FormatImports (std::stringstream &ss, const Imports &imports) {
@@ -103,9 +105,10 @@ class BaseGenerator {
103
105
protected:
104
106
BaseGenerator (const Parser &parser, const Namer::Config &config,
105
107
const std::string &path, const Version &version)
106
- : parser_{parser},
107
- namer_{WithFlagOptions (config, parser.opts , path), Keywords (version)},
108
- version_{version} {}
108
+ : parser_{ parser },
109
+ namer_{ WithFlagOptions (config, parser.opts , path), Keywords (version) },
110
+ version_{ version },
111
+ path_ (path) {}
109
112
110
113
protected:
111
114
std::string ModuleForFile (const std::string &file) const {
@@ -115,15 +118,34 @@ class BaseGenerator {
115
118
return module ;
116
119
}
117
120
118
- template <typename T>
119
- std::string ModuleFor (const T *def) const {
121
+ template <typename T> std::string ModuleFor (const T *def) const {
120
122
if (parser_.opts .one_file ) return ModuleForFile (def->file );
121
123
return namer_.NamespacedType (*def);
122
124
}
123
125
126
+ std::string NamespaceDir (const Parser &parser, const std::string &path,
127
+ const Namespace &ns, const bool dasherize) {
128
+ EnsureDirExists (path);
129
+ if (parser.opts .one_file ) return path;
130
+ std::string namespace_dir = path; // Either empty or ends in separator.
131
+ auto &namespaces = ns.components ;
132
+ for (auto it = namespaces.begin (); it != namespaces.end (); ++it) {
133
+ namespace_dir +=
134
+ !dasherize ? *it : ConvertCase (*it, Case::kDasher , Case::kUpperCamel );
135
+ namespace_dir += kPathSeparator ;
136
+ EnsureDirExists (namespace_dir);
137
+ }
138
+ return namespace_dir;
139
+ }
140
+
141
+ std::string NamespaceDir (const Namespace &ns, const bool dasherize) {
142
+ return NamespaceDir (parser_, path_, ns, dasherize);
143
+ }
144
+
124
145
const Parser &parser_;
125
146
const IdlNamer namer_;
126
147
const Version version_;
148
+ const std::string &path_;
127
149
};
128
150
129
151
class StubGenerator : public BaseGenerator {
@@ -135,14 +157,18 @@ class StubGenerator : public BaseGenerator {
135
157
bool Generate () {
136
158
Imports imports;
137
159
std::stringstream stub;
160
+ std::string ns_name{};
138
161
for (const ServiceDef *service : parser_.services_ .vec ) {
139
162
Generate (stub, service, &imports);
163
+ ns_name = NamespaceDir (*service->defined_namespace , false );
140
164
}
141
165
166
+ std::string sanitized_suffix{ parser_.opts .grpc_filename_suffix };
167
+ std::replace (sanitized_suffix.begin (), sanitized_suffix.end (), ' .' , ' _' );
142
168
std::string filename =
143
- namer_. config_ . output_path +
169
+ ns_name + kPathSeparator +
144
170
StripPath (StripExtension (parser_.file_being_parsed_ )) + " _grpc" +
145
- parser_. opts . grpc_filename_suffix + namer_.config_ .filename_extension ;
171
+ sanitized_suffix + namer_.config_ .filename_extension ;
146
172
147
173
return SaveStub (filename, imports, stub.str ());
148
174
}
@@ -247,16 +273,20 @@ class ServiceGenerator : public BaseGenerator {
247
273
<< ' \n ' ;
248
274
}
249
275
276
+ std::string ns_name{};
250
277
for (const ServiceDef *service : parser_.services_ .vec ) {
251
278
GenerateStub (ss, service, &imports);
252
279
GenerateServicer (ss, service, &imports);
253
280
GenerateRegister (ss, service, &imports);
281
+ ns_name = NamespaceDir (*service->defined_namespace , false );
254
282
}
255
283
284
+ std::string sanitized_suffix{ parser_.opts .grpc_filename_suffix };
285
+ std::replace (sanitized_suffix.begin (), sanitized_suffix.end (), ' .' , ' _' );
256
286
std::string filename =
257
- namer_. config_ . output_path +
287
+ ns_name + kPathSeparator +
258
288
StripPath (StripExtension (parser_.file_being_parsed_ )) + " _grpc" +
259
- parser_. opts . grpc_filename_suffix + namer_.config_ .filename_extension ;
289
+ sanitized_suffix + namer_.config_ .filename_extension ;
260
290
261
291
return SaveService (filename, imports, ss.str ());
262
292
}
@@ -365,13 +395,13 @@ class ServiceGenerator : public BaseGenerator {
365
395
366
396
bool Generate (const Parser &parser, const std::string &path,
367
397
const Version &version) {
368
- ServiceGenerator generator{parser, path, version};
398
+ ServiceGenerator generator{ parser, path, version };
369
399
return generator.Generate ();
370
400
}
371
401
372
402
bool GenerateStub (const Parser &parser, const std::string &path,
373
403
const Version &version) {
374
- StubGenerator generator{parser, path, version};
404
+ StubGenerator generator{ parser, path, version };
375
405
return generator.Generate ();
376
406
}
377
407
0 commit comments