Commit 2f761418 authored by Amol Deshpande's avatar Amol Deshpande

option to generate one file for C#

parent 932b22f0
...@@ -406,6 +406,7 @@ struct GeneratorOptions { ...@@ -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 { ...@@ -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) { ...@@ -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[]) { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment