You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
C# bindings generator cleanup
- Normal log messages are no longer warnings. - BindingsGenerator is no longer a singleton. - Added a log function.
This commit is contained in:
@@ -101,10 +101,6 @@
|
||||
|
||||
const char *BindingsGenerator::TypeInterface::DEFAULT_VARARG_C_IN("\t%0 %1_in = %1;\n");
|
||||
|
||||
bool BindingsGenerator::verbose_output = false;
|
||||
|
||||
BindingsGenerator *BindingsGenerator::singleton = NULL;
|
||||
|
||||
static String fix_doc_description(const String &p_bbcode) {
|
||||
|
||||
// This seems to be the correct way to do this. It's the same EditorHelp does.
|
||||
@@ -816,9 +812,7 @@ void BindingsGenerator::_generate_global_constants(StringBuilder &p_output) {
|
||||
|
||||
CRASH_COND(enum_class_name != "Variant"); // Hard-coded...
|
||||
|
||||
if (verbose_output) {
|
||||
WARN_PRINTS("Declaring global enum `" + enum_proxy_name + "` inside static class `" + enum_class_name + "`");
|
||||
}
|
||||
_log("Declaring global enum `%s` inside static class `%s`\n", enum_proxy_name.utf8().get_data(), enum_class_name.utf8().get_data());
|
||||
|
||||
p_output.append("\n" INDENT1 "public static partial class ");
|
||||
p_output.append(enum_class_name);
|
||||
@@ -867,9 +861,7 @@ void BindingsGenerator::_generate_global_constants(StringBuilder &p_output) {
|
||||
p_output.append("\n#pragma warning restore CS1591\n");
|
||||
}
|
||||
|
||||
Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, DotNetSolution &r_solution, bool p_verbose_output) {
|
||||
|
||||
verbose_output = p_verbose_output;
|
||||
Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir, DotNetSolution &r_solution) {
|
||||
|
||||
String proj_dir = p_solution_dir.plus_file(CORE_API_ASSEMBLY_NAME);
|
||||
|
||||
@@ -1001,15 +993,12 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_solution_dir,
|
||||
|
||||
r_solution.add_new_project(CORE_API_ASSEMBLY_NAME, proj_info);
|
||||
|
||||
if (verbose_output)
|
||||
OS::get_singleton()->print("The solution and C# project for the Core API was generated successfully\n");
|
||||
_log("The solution and C# project for the Core API was generated successfully\n");
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir, DotNetSolution &r_solution, bool p_verbose_output) {
|
||||
|
||||
verbose_output = p_verbose_output;
|
||||
Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir, DotNetSolution &r_solution) {
|
||||
|
||||
String proj_dir = p_solution_dir.plus_file(EDITOR_API_ASSEMBLY_NAME);
|
||||
|
||||
@@ -1100,13 +1089,12 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_solution_dir
|
||||
|
||||
r_solution.add_new_project(EDITOR_API_ASSEMBLY_NAME, proj_info);
|
||||
|
||||
if (verbose_output)
|
||||
OS::get_singleton()->print("The solution and C# project for the Editor API was generated successfully\n");
|
||||
_log("The solution and C# project for the Editor API was generated successfully\n");
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error BindingsGenerator::generate_cs_api(const String &p_output_dir, bool p_verbose_output) {
|
||||
Error BindingsGenerator::generate_cs_api(const String &p_output_dir) {
|
||||
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
||||
ERR_FAIL_COND_V(!da, ERR_CANT_CREATE);
|
||||
@@ -1123,13 +1111,13 @@ Error BindingsGenerator::generate_cs_api(const String &p_output_dir, bool p_verb
|
||||
|
||||
Error proj_err;
|
||||
|
||||
proj_err = generate_cs_core_project(p_output_dir, solution, p_verbose_output);
|
||||
proj_err = generate_cs_core_project(p_output_dir, solution);
|
||||
if (proj_err != OK) {
|
||||
ERR_PRINT("Generation of the Core API C# project failed");
|
||||
return proj_err;
|
||||
}
|
||||
|
||||
proj_err = generate_cs_editor_project(p_output_dir, solution, p_verbose_output);
|
||||
proj_err = generate_cs_editor_project(p_output_dir, solution);
|
||||
if (proj_err != OK) {
|
||||
ERR_PRINT("Generation of the Editor API C# project failed");
|
||||
return proj_err;
|
||||
@@ -1168,8 +1156,7 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str
|
||||
|
||||
List<InternalCall> &custom_icalls = itype.api_type == ClassDB::API_EDITOR ? editor_custom_icalls : core_custom_icalls;
|
||||
|
||||
if (verbose_output)
|
||||
OS::get_singleton()->print("Generating %s.cs...\n", itype.proxy_name.utf8().get_data());
|
||||
_log("Generating %s.cs...\n", itype.proxy_name.utf8().get_data());
|
||||
|
||||
String ctor_method(ICALL_PREFIX + itype.proxy_name + "_Ctor"); // Used only for derived types
|
||||
|
||||
@@ -1710,8 +1697,6 @@ Error BindingsGenerator::_generate_cs_method(const BindingsGenerator::TypeInterf
|
||||
|
||||
Error BindingsGenerator::generate_glue(const String &p_output_dir) {
|
||||
|
||||
verbose_output = true;
|
||||
|
||||
bool dir_exists = DirAccess::exists(p_output_dir);
|
||||
ERR_EXPLAIN("The output directory does not exist.");
|
||||
ERR_FAIL_COND_V(!dir_exists, ERR_FILE_BAD_PATH);
|
||||
@@ -2128,15 +2113,13 @@ void BindingsGenerator::_populate_object_type_interfaces() {
|
||||
}
|
||||
|
||||
if (!ClassDB::is_class_exposed(type_cname)) {
|
||||
if (verbose_output)
|
||||
WARN_PRINTS("Ignoring type " + type_cname.operator String() + " because it's not exposed");
|
||||
_log("Ignoring type `%s` because it's not exposed\n", String(type_cname).utf8().get_data());
|
||||
class_list.pop_front();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!ClassDB::is_class_enabled(type_cname)) {
|
||||
if (verbose_output)
|
||||
WARN_PRINTS("Ignoring type " + type_cname.operator String() + " because it's not enabled");
|
||||
_log("Ignoring type `%s` because it's not enabled\n", String(type_cname).utf8().get_data());
|
||||
class_list.pop_front();
|
||||
continue;
|
||||
}
|
||||
@@ -2186,12 +2169,10 @@ void BindingsGenerator::_populate_object_type_interfaces() {
|
||||
|
||||
iprop.proxy_name = escape_csharp_keyword(snake_to_pascal_case(iprop.cname));
|
||||
|
||||
// Prevent property and enclosing type from sharing the same name
|
||||
// Prevent the property and its enclosing type from sharing the same name
|
||||
if (iprop.proxy_name == itype.proxy_name) {
|
||||
if (verbose_output) {
|
||||
WARN_PRINTS("Name of property `" + iprop.proxy_name + "` is ambiguous with the name of its class `" +
|
||||
itype.proxy_name + "`. Renaming property to `" + iprop.proxy_name + "_`");
|
||||
}
|
||||
_log("Name of property `%s` is ambiguous with the name of its enclosing class `%s`. Renaming property to `%s_`\n",
|
||||
iprop.proxy_name.utf8().get_data(), itype.proxy_name.utf8().get_data(), iprop.proxy_name.utf8().get_data());
|
||||
|
||||
iprop.proxy_name += "_";
|
||||
}
|
||||
@@ -2258,14 +2239,13 @@ void BindingsGenerator::_populate_object_type_interfaces() {
|
||||
// which could actually will return something different.
|
||||
// Let's put this to notify us if that ever happens.
|
||||
if (itype.cname != name_cache.type_Object || imethod.name != "free") {
|
||||
if (verbose_output) {
|
||||
WARN_PRINTS("Notification: New unexpected virtual non-overridable method found.\n"
|
||||
"We only expected Object.free, but found " +
|
||||
itype.name + "." + imethod.name);
|
||||
}
|
||||
ERR_PRINTS("Notification: New unexpected virtual non-overridable method found.\n"
|
||||
"We only expected Object.free, but found " +
|
||||
itype.name + "." + imethod.name);
|
||||
}
|
||||
} else {
|
||||
ERR_PRINTS("Missing MethodBind for non-virtual method: " + itype.name + "." + imethod.name);
|
||||
ERR_EXPLAIN("Missing MethodBind for non-virtual method: " + itype.name + "." + imethod.name);
|
||||
ERR_FAIL();
|
||||
}
|
||||
} else if (return_info.type == Variant::INT && return_info.usage & PROPERTY_USAGE_CLASS_IS_ENUM) {
|
||||
imethod.return_type.cname = return_info.class_name;
|
||||
@@ -2319,12 +2299,10 @@ void BindingsGenerator::_populate_object_type_interfaces() {
|
||||
|
||||
imethod.proxy_name = escape_csharp_keyword(snake_to_pascal_case(imethod.name));
|
||||
|
||||
// Prevent naming the property and its enclosing type from sharing the same name
|
||||
// Prevent the method and its enclosing type from sharing the same name
|
||||
if (imethod.proxy_name == itype.proxy_name) {
|
||||
if (verbose_output) {
|
||||
WARN_PRINTS("Name of method `" + imethod.proxy_name + "` is ambiguous with the name of its class `" +
|
||||
itype.proxy_name + "`. Renaming method to `" + imethod.proxy_name + "_`");
|
||||
}
|
||||
_log("Name of method `%s` is ambiguous with the name of its enclosing class `%s`. Renaming method to `%s_`\n",
|
||||
imethod.proxy_name.utf8().get_data(), itype.proxy_name.utf8().get_data(), imethod.proxy_name.utf8().get_data());
|
||||
|
||||
imethod.proxy_name += "_";
|
||||
}
|
||||
@@ -2858,7 +2836,18 @@ void BindingsGenerator::_populate_global_constants() {
|
||||
}
|
||||
}
|
||||
|
||||
void BindingsGenerator::initialize() {
|
||||
void BindingsGenerator::_log(const char *p_format, ...) {
|
||||
|
||||
if (log_print_enabled) {
|
||||
va_list list;
|
||||
|
||||
va_start(list, p_format);
|
||||
OS::get_singleton()->print("%s", str_format(p_format, list).utf8().get_data());
|
||||
va_end(list);
|
||||
}
|
||||
}
|
||||
|
||||
void BindingsGenerator::_initialize() {
|
||||
|
||||
EditorHelp::generate_doc();
|
||||
|
||||
@@ -2881,12 +2870,13 @@ void BindingsGenerator::initialize() {
|
||||
void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args) {
|
||||
|
||||
const int NUM_OPTIONS = 2;
|
||||
int options_left = NUM_OPTIONS;
|
||||
|
||||
String mono_glue_option = "--generate-mono-glue";
|
||||
String cs_api_option = "--generate-cs-api";
|
||||
|
||||
verbose_output = true;
|
||||
String mono_glue_path;
|
||||
String cs_api_path;
|
||||
|
||||
int options_left = NUM_OPTIONS;
|
||||
|
||||
const List<String>::Element *elem = p_cmdline_args.front();
|
||||
|
||||
@@ -2895,8 +2885,7 @@ void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args)
|
||||
const List<String>::Element *path_elem = elem->next();
|
||||
|
||||
if (path_elem) {
|
||||
if (get_singleton()->generate_glue(path_elem->get()) != OK)
|
||||
ERR_PRINTS(mono_glue_option + ": Failed to generate mono glue");
|
||||
mono_glue_path = path_elem->get();
|
||||
elem = elem->next();
|
||||
} else {
|
||||
ERR_PRINTS(mono_glue_option + ": No output directory specified");
|
||||
@@ -2907,8 +2896,7 @@ void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args)
|
||||
const List<String>::Element *path_elem = elem->next();
|
||||
|
||||
if (path_elem) {
|
||||
if (get_singleton()->generate_cs_api(path_elem->get()) != OK)
|
||||
ERR_PRINTS(cs_api_option + ": Failed to generate the C# API");
|
||||
cs_api_path = path_elem->get();
|
||||
elem = elem->next();
|
||||
} else {
|
||||
ERR_PRINTS(cs_api_option + ": No output directory specified");
|
||||
@@ -2920,10 +2908,23 @@ void BindingsGenerator::handle_cmdline_args(const List<String> &p_cmdline_args)
|
||||
elem = elem->next();
|
||||
}
|
||||
|
||||
verbose_output = false;
|
||||
if (mono_glue_path.length() || cs_api_path.length()) {
|
||||
BindingsGenerator bindings_generator;
|
||||
bindings_generator.set_log_print_enabled(true);
|
||||
|
||||
if (options_left != NUM_OPTIONS)
|
||||
if (mono_glue_path.length()) {
|
||||
if (bindings_generator.generate_glue(mono_glue_path) != OK)
|
||||
ERR_PRINTS(mono_glue_option + ": Failed to generate mono glue");
|
||||
}
|
||||
|
||||
if (cs_api_path.length()) {
|
||||
if (bindings_generator.generate_cs_api(cs_api_path) != OK)
|
||||
ERR_PRINTS(cs_api_option + ": Failed to generate the C# API");
|
||||
}
|
||||
|
||||
// Exit once done
|
||||
::exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user