Merge pull request #15533 from neikeq/issue-15307

Mono: Fix iteration order of object types when generating bindings
This commit is contained in:
Rémi Verschelde 2018-01-09 19:43:37 +01:00 committed by GitHub
commit 958a15c7a7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 30 deletions

View file

@ -448,14 +448,14 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_output_dir, bo
compile_items.push_back(output_file);
}
for (Map<StringName, TypeInterface>::Element *E = obj_types.front(); E; E = E->next()) {
const TypeInterface &itype = E->get();
for (OrderedHashMap<StringName, TypeInterface>::Element E = obj_types.front(); E; E = E.next()) {
const TypeInterface &itype = E.get();
if (itype.api_type == ClassDB::API_EDITOR)
continue;
String output_file = path_join(obj_type_dir, E->get().proxy_name + ".cs");
Error err = _generate_cs_type(E->get(), output_file);
String output_file = path_join(obj_type_dir, itype.proxy_name + ".cs");
Error err = _generate_cs_type(itype, output_file);
if (err == ERR_SKIP)
continue;
@ -580,14 +580,14 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_output_dir,
if (!solution.set_path(p_output_dir))
return ERR_FILE_NOT_FOUND;
for (Map<StringName, TypeInterface>::Element *E = obj_types.front(); E; E = E->next()) {
const TypeInterface &itype = E->get();
for (OrderedHashMap<StringName, TypeInterface>::Element E = obj_types.front(); E; E = E.next()) {
const TypeInterface &itype = E.get();
if (itype.api_type != ClassDB::API_EDITOR)
continue;
String output_file = path_join(obj_type_dir, E->get().proxy_name + ".cs");
Error err = _generate_cs_type(E->get(), output_file);
String output_file = path_join(obj_type_dir, itype.proxy_name + ".cs");
Error err = _generate_cs_type(itype, output_file);
if (err == ERR_SKIP)
continue;
@ -945,7 +945,7 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str
return ERR_BUG;
}
Map<StringName, TypeInterface>::Element *object_itype = obj_types.find("Object");
OrderedHashMap<StringName, TypeInterface>::Element object_itype = obj_types.find("Object");
if (!object_itype) {
ERR_PRINT("BUG: Object type interface not found!");
@ -953,7 +953,7 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str
}
output.push_back(MEMBER_BEGIN "public " CS_CLASS_SIGNALAWAITER " ToSignal(");
output.push_back(object_itype->get().cs_type);
output.push_back(object_itype.get().cs_type);
output.push_back(" source, string signal)\n" OPEN_BLOCK_L2
"return new " CS_CLASS_SIGNALAWAITER "(source, signal, this);\n" CLOSE_BLOCK_L2);
}
@ -999,9 +999,9 @@ Error BindingsGenerator::_generate_cs_property(const BindingsGenerator::TypeInte
// Search it in base types too
const TypeInterface *current_type = &p_itype;
while (!setter && current_type->base_name != StringName()) {
Map<StringName, TypeInterface>::Element *base_match = obj_types.find(current_type->base_name);
ERR_FAIL_NULL_V(base_match, ERR_BUG);
current_type = &base_match->get();
OrderedHashMap<StringName, TypeInterface>::Element base_match = obj_types.find(current_type->base_name);
ERR_FAIL_COND_V(!base_match, ERR_BUG);
current_type = &base_match.get();
setter = current_type->find_method_by_name(p_iprop.setter);
}
@ -1010,9 +1010,9 @@ Error BindingsGenerator::_generate_cs_property(const BindingsGenerator::TypeInte
// Search it in base types too
current_type = &p_itype;
while (!getter && current_type->base_name != StringName()) {
Map<StringName, TypeInterface>::Element *base_match = obj_types.find(current_type->base_name);
ERR_FAIL_NULL_V(base_match, ERR_BUG);
current_type = &base_match->get();
OrderedHashMap<StringName, TypeInterface>::Element base_match = obj_types.find(current_type->base_name);
ERR_FAIL_COND_V(!base_match, ERR_BUG);
current_type = &base_match.get();
getter = current_type->find_method_by_name(p_iprop.getter);
}
@ -1324,8 +1324,8 @@ Error BindingsGenerator::generate_glue(const String &p_output_dir) {
generated_icall_funcs.clear();
for (Map<StringName, TypeInterface>::Element *type_elem = obj_types.front(); type_elem; type_elem = type_elem->next()) {
const TypeInterface &itype = type_elem->get();
for (OrderedHashMap<StringName, TypeInterface>::Element type_elem = obj_types.front(); type_elem; type_elem = type_elem.next()) {
const TypeInterface &itype = type_elem.get();
List<InternalCall> &custom_icalls = itype.api_type == ClassDB::API_EDITOR ? editor_custom_icalls : core_custom_icalls;
@ -1631,20 +1631,20 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte
const BindingsGenerator::TypeInterface *BindingsGenerator::_get_type_by_name_or_null(const StringName &p_cname) {
const Map<StringName, TypeInterface>::Element *match = builtin_types.find(p_cname);
const Map<StringName, TypeInterface>::Element *builtin_type_match = builtin_types.find(p_cname);
if (match)
return &match->get();
if (builtin_type_match)
return &builtin_type_match->get();
match = obj_types.find(p_cname);
const OrderedHashMap<StringName, TypeInterface>::Element obj_type_match = obj_types.find(p_cname);
if (match)
return &match->get();
if (obj_type_match)
return &obj_type_match.get();
match = enum_types.find(p_cname);
const Map<StringName, TypeInterface>::Element *enum_match = enum_types.find(p_cname);
if (match)
return &match->get();
if (enum_match)
return &enum_match->get();
return NULL;
}
@ -2484,8 +2484,8 @@ void BindingsGenerator::initialize() {
_generate_header_icalls();
for (Map<StringName, TypeInterface>::Element *E = obj_types.front(); E; E = E->next())
_generate_method_icalls(E->get());
for (OrderedHashMap<StringName, TypeInterface>::Element E = obj_types.front(); E; E = E.next())
_generate_method_icalls(E.get());
_generate_method_icalls(builtin_types["NodePath"]);
_generate_method_icalls(builtin_types["RID"]);

View file

@ -429,10 +429,11 @@ class BindingsGenerator {
static bool verbose_output;
OrderedHashMap<StringName, TypeInterface> obj_types;
Map<StringName, TypeInterface> placeholder_types;
Map<StringName, TypeInterface> builtin_types;
Map<StringName, TypeInterface> enum_types;
Map<StringName, TypeInterface> obj_types;
List<EnumInterface> global_enums;
List<ConstantInterface> global_constants;