Improve signature of signal target generated function

This commit is contained in:
Ignacio Etcheverry 2017-10-16 04:17:06 +02:00
parent 1a9efb417a
commit 8ed3247a63
4 changed files with 108 additions and 34 deletions

View file

@ -41,6 +41,7 @@
#include "editor/csharp_project.h"
#include "editor/editor_node.h"
#include "editor/godotsharp_editor.h"
#include "utils/string_utils.h"
#endif
#include "godotsharp_dirs.h"
@ -295,20 +296,88 @@ bool CSharpLanguage::has_named_classes() const {
return true;
}
String CSharpLanguage::make_function(const String &p_class, const String &p_name, const PoolStringArray &p_args) const {
static String variant_type_to_managed_name(const String &p_var_type_name) {
if (p_var_type_name.empty())
return "object";
if (!ClassDB::class_exists(p_var_type_name)) {
Variant::Type var_types[] = {
Variant::BOOL,
Variant::INT,
Variant::REAL,
Variant::STRING,
Variant::VECTOR2,
Variant::RECT2,
Variant::VECTOR3,
Variant::TRANSFORM2D,
Variant::PLANE,
Variant::QUAT,
Variant::RECT3,
Variant::BASIS,
Variant::TRANSFORM,
Variant::COLOR,
Variant::NODE_PATH,
Variant::_RID
};
for (int i = 0; i < sizeof(var_types) / sizeof(Variant::Type); i++) {
if (p_var_type_name == Variant::get_type_name(var_types[i]))
return p_var_type_name;
}
if (p_var_type_name == "String")
return "string"; // I prefer this one >:[
// TODO these will be rewritten later into custom containers
if (p_var_type_name == "Array")
return "object[]";
if (p_var_type_name == "Dictionary")
return "Dictionary<object, object>";
if (p_var_type_name == "PoolByteArray")
return "byte[]";
if (p_var_type_name == "PoolIntArray")
return "int[]";
if (p_var_type_name == "PoolRealArray")
return "float[]";
if (p_var_type_name == "PoolStringArray")
return "string[]";
if (p_var_type_name == "PoolVector2Array")
return "Vector2[]";
if (p_var_type_name == "PoolVector3Array")
return "Vector3[]";
if (p_var_type_name == "PoolColorArray")
return "Color[]";
return "object";
}
return p_var_type_name;
}
String CSharpLanguage::make_function(const String &p_class, const String &p_name, const PoolStringArray &p_args) const {
#ifdef TOOLS_ENABLED
// FIXME
// Due to Godot's API limitation this just appends the function to the end of the file
// Another limitation is that the parameter types are not specified, so we must use System.Object
// - Due to Godot's API limitation this just appends the function to the end of the file
// - Use fully qualified name if there is ambiguity
String s = "private void " + p_name + "(";
for (int i = 0; i < p_args.size(); i++) {
const String &arg = p_args[i];
if (i > 0)
s += ", ";
s += "object " + p_args[i];
s += variant_type_to_managed_name(arg.get_slice(":", 1)) + " " + escape_csharp_keyword(arg.get_slice(":", 0));
}
s += ")\n{\n // Replace with function body\n}\n";
return s;
#else
return String();
#endif
}
void CSharpLanguage::frame() {