mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-03 01:32:26 +00:00
option to generate one file for C#
This commit is contained in:
@@ -406,6 +406,7 @@ struct GeneratorOptions {
|
|||||||
bool prefixed_enums;
|
bool prefixed_enums;
|
||||||
bool include_dependence_headers;
|
bool include_dependence_headers;
|
||||||
bool mutable_buffer;
|
bool mutable_buffer;
|
||||||
|
bool one_file;
|
||||||
|
|
||||||
// Possible options for the more general generator below.
|
// Possible options for the more general generator below.
|
||||||
enum Language { kJava, kCSharp, kGo, kMAX };
|
enum Language { kJava, kCSharp, kGo, kMAX };
|
||||||
@@ -418,6 +419,7 @@ struct GeneratorOptions {
|
|||||||
output_enum_identifiers(true), prefixed_enums(true),
|
output_enum_identifiers(true), prefixed_enums(true),
|
||||||
include_dependence_headers(false),
|
include_dependence_headers(false),
|
||||||
mutable_buffer(false),
|
mutable_buffer(false),
|
||||||
|
one_file(false),
|
||||||
lang(GeneratorOptions::kJava) {}
|
lang(GeneratorOptions::kJava) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ static void Error(const std::string &err, bool usage, bool show_exe_name) {
|
|||||||
" --gen-includes Generate include statements for included schemas the\n"
|
" --gen-includes Generate include statements for included schemas the\n"
|
||||||
" generated file depends on (C++).\n"
|
" generated file depends on (C++).\n"
|
||||||
" --gen-mutable Generate accessors that can mutate buffers in-place.\n"
|
" --gen-mutable Generate accessors that can mutate buffers in-place.\n"
|
||||||
|
" --gen-onefile Generate single output file for C#\n"
|
||||||
" --raw-binary Allow binaries without file_indentifier to be read.\n"
|
" --raw-binary Allow binaries without file_indentifier to be read.\n"
|
||||||
" This may crash flatc given a mismatched schema.\n"
|
" This may crash flatc given a mismatched schema.\n"
|
||||||
" --proto Input is a .proto, translate to .fbs.\n"
|
" --proto Input is a .proto, translate to .fbs.\n"
|
||||||
@@ -140,7 +141,9 @@ int main(int argc, const char *argv[]) {
|
|||||||
opts.mutable_buffer = true;
|
opts.mutable_buffer = true;
|
||||||
} else if(arg == "--gen-includes") {
|
} else if(arg == "--gen-includes") {
|
||||||
opts.include_dependence_headers = true;
|
opts.include_dependence_headers = true;
|
||||||
} else if(arg == "--raw-binary") {
|
}else if (arg == "--gen-onefile") {
|
||||||
|
opts.one_file = true;
|
||||||
|
}else if (arg == "--raw-binary") {
|
||||||
raw_binary = true;
|
raw_binary = true;
|
||||||
} else if(arg == "--") { // Separator between text and binary inputs.
|
} else if(arg == "--") { // Separator between text and binary inputs.
|
||||||
binary_files_from = filenames.size();
|
binary_files_from = filenames.size();
|
||||||
|
|||||||
@@ -858,8 +858,8 @@ static void GenStruct(const LanguageParameters &lang, const Parser &parser,
|
|||||||
// Save out the generated code for a single class while adding
|
// Save out the generated code for a single class while adding
|
||||||
// declaration boilerplate.
|
// declaration boilerplate.
|
||||||
static bool SaveClass(const LanguageParameters &lang, const Parser &parser,
|
static bool SaveClass(const LanguageParameters &lang, const Parser &parser,
|
||||||
const Definition &def, const std::string &classcode,
|
const std::string &defname, const std::string &classcode,
|
||||||
const std::string &path, bool needs_includes) {
|
const std::string &path, bool needs_includes, bool onefile) {
|
||||||
if (!classcode.length()) return true;
|
if (!classcode.length()) return true;
|
||||||
|
|
||||||
std::string namespace_general;
|
std::string namespace_general;
|
||||||
@@ -870,7 +870,10 @@ static bool SaveClass(const LanguageParameters &lang, const Parser &parser,
|
|||||||
namespace_general += ".";
|
namespace_general += ".";
|
||||||
}
|
}
|
||||||
namespace_general += *it;
|
namespace_general += *it;
|
||||||
namespace_dir += *it + kPathSeparator;
|
if (!onefile) {
|
||||||
|
namespace_dir += *it + kPathSeparator;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
EnsureDirExists(namespace_dir);
|
EnsureDirExists(namespace_dir);
|
||||||
|
|
||||||
@@ -880,34 +883,48 @@ static bool SaveClass(const LanguageParameters &lang, const Parser &parser,
|
|||||||
if (needs_includes) code += lang.includes;
|
if (needs_includes) code += lang.includes;
|
||||||
code += classcode;
|
code += classcode;
|
||||||
code += lang.namespace_end;
|
code += lang.namespace_end;
|
||||||
auto filename = namespace_dir + def.name + lang.file_extension;
|
auto filename = namespace_dir + defname + lang.file_extension;
|
||||||
return SaveFile(filename.c_str(), code, false);
|
return SaveFile(filename.c_str(), code, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GenerateGeneral(const Parser &parser,
|
bool GenerateGeneral(const Parser &parser,
|
||||||
const std::string &path,
|
const std::string &path,
|
||||||
const std::string & /*file_name*/,
|
const std::string & file_name,
|
||||||
const GeneratorOptions &opts) {
|
const GeneratorOptions &opts) {
|
||||||
|
|
||||||
assert(opts.lang <= GeneratorOptions::kMAX);
|
assert(opts.lang <= GeneratorOptions::kMAX);
|
||||||
auto lang = language_parameters[opts.lang];
|
auto lang = language_parameters[opts.lang];
|
||||||
|
std::string one_file_code;
|
||||||
|
|
||||||
for (auto it = parser.enums_.vec.begin();
|
for (auto it = parser.enums_.vec.begin();
|
||||||
it != parser.enums_.vec.end(); ++it) {
|
it != parser.enums_.vec.end(); ++it) {
|
||||||
std::string enumcode;
|
std::string enumcode;
|
||||||
GenEnum(lang, **it, &enumcode);
|
GenEnum(lang, **it, &enumcode);
|
||||||
if (!SaveClass(lang, parser, **it, enumcode, path, false))
|
if (opts.one_file) {
|
||||||
return false;
|
one_file_code = enumcode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!SaveClass(lang, parser, (**it).name, enumcode, path, false, false))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto it = parser.structs_.vec.begin();
|
for (auto it = parser.structs_.vec.begin();
|
||||||
it != parser.structs_.vec.end(); ++it) {
|
it != parser.structs_.vec.end(); ++it) {
|
||||||
std::string declcode;
|
std::string declcode;
|
||||||
GenStruct(lang, parser, **it, &declcode);
|
GenStruct(lang, parser, **it, &declcode);
|
||||||
if (!SaveClass(lang, parser, **it, declcode, path, true))
|
if (opts.one_file) {
|
||||||
return false;
|
one_file_code += declcode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!SaveClass(lang, parser, (**it).name, declcode, path, true, false))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opts.one_file) {
|
||||||
|
return SaveClass(lang, parser, file_name, one_file_code,path, true, true);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user