|
@@ -1201,8 +1201,6 @@ bool CSharpScript::_update_exports() {
|
|
exported_members_cache.clear();
|
|
exported_members_cache.clear();
|
|
exported_members_defval_cache.clear();
|
|
exported_members_defval_cache.clear();
|
|
|
|
|
|
- const Vector<GDMonoField *> &fields = script_class->get_all_fields();
|
|
|
|
-
|
|
|
|
// We are creating a temporary new instance of the class here to get the default value
|
|
// We are creating a temporary new instance of the class here to get the default value
|
|
// TODO Workaround. Should be replaced with IL opcodes analysis
|
|
// TODO Workaround. Should be replaced with IL opcodes analysis
|
|
|
|
|
|
@@ -1226,36 +1224,47 @@ bool CSharpScript::_update_exports() {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- for (int i = 0; i < fields.size(); i++) {
|
|
|
|
- GDMonoField *field = fields[i];
|
|
|
|
|
|
+ GDMonoClass *top = script_class;
|
|
|
|
|
|
- if (field->is_static() || field->get_visibility() != GDMono::PUBLIC)
|
|
|
|
- continue;
|
|
|
|
|
|
+ while (top && top != native) {
|
|
|
|
+ const Vector<GDMonoField *> &fields = top->get_all_fields();
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < fields.size(); i++) {
|
|
|
|
+ GDMonoField *field = fields[i];
|
|
|
|
+
|
|
|
|
+ if (field->is_static() || field->get_visibility() != GDMono::PUBLIC)
|
|
|
|
+ continue;
|
|
|
|
|
|
- String name = field->get_name();
|
|
|
|
- StringName cname = name;
|
|
|
|
|
|
+ String name = field->get_name();
|
|
|
|
+ StringName cname = name;
|
|
|
|
|
|
- Variant::Type type = GDMonoMarshal::managed_to_variant_type(field->get_type());
|
|
|
|
|
|
+ if (member_info.has(cname))
|
|
|
|
+ continue;
|
|
|
|
|
|
- if (field->has_attribute(CACHED_CLASS(ExportAttribute))) {
|
|
|
|
- MonoObject *attr = field->get_attribute(CACHED_CLASS(ExportAttribute));
|
|
|
|
|
|
+ Variant::Type type = GDMonoMarshal::managed_to_variant_type(field->get_type());
|
|
|
|
|
|
- // Field has Export attribute
|
|
|
|
- int hint = CACHED_FIELD(ExportAttribute, hint)->get_int_value(attr);
|
|
|
|
- String hint_string = CACHED_FIELD(ExportAttribute, hint_string)->get_string_value(attr);
|
|
|
|
- int usage = CACHED_FIELD(ExportAttribute, usage)->get_int_value(attr);
|
|
|
|
|
|
+ if (field->has_attribute(CACHED_CLASS(ExportAttribute))) {
|
|
|
|
+ MonoObject *attr = field->get_attribute(CACHED_CLASS(ExportAttribute));
|
|
|
|
|
|
- PropertyInfo prop_info = PropertyInfo(type, name, PropertyHint(hint), hint_string, PropertyUsageFlags(usage));
|
|
|
|
|
|
+ // Field has Export attribute
|
|
|
|
+ int hint = CACHED_FIELD(ExportAttribute, hint)->get_int_value(attr);
|
|
|
|
+ String hint_string = CACHED_FIELD(ExportAttribute, hint_string)->get_string_value(attr);
|
|
|
|
+ int usage = CACHED_FIELD(ExportAttribute, usage)->get_int_value(attr);
|
|
|
|
|
|
- member_info[cname] = prop_info;
|
|
|
|
- exported_members_cache.push_back(prop_info);
|
|
|
|
|
|
+ PropertyInfo prop_info = PropertyInfo(type, name, PropertyHint(hint), hint_string, PropertyUsageFlags(usage));
|
|
|
|
|
|
- if (tmp_object) {
|
|
|
|
- exported_members_defval_cache[cname] = GDMonoMarshal::mono_object_to_variant(field->get_value(tmp_object));
|
|
|
|
|
|
+ member_info[cname] = prop_info;
|
|
|
|
+ exported_members_cache.push_back(prop_info);
|
|
|
|
+
|
|
|
|
+ if (tmp_object) {
|
|
|
|
+ exported_members_defval_cache[cname] = GDMonoMarshal::mono_object_to_variant(field->get_value(tmp_object));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ member_info[cname] = PropertyInfo(type, name, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_SCRIPT_VARIABLE);
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- member_info[cname] = PropertyInfo(type, name, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_SCRIPT_VARIABLE);
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ top = top->get_parent_class();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|