Merge pull request #31021 from willnationsdev/script-reflection

Expose Script reflection methods to scripting API.
This commit is contained in:
Rémi Verschelde 2019-09-03 18:33:55 +02:00 committed by GitHub
commit a00a9e868e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 0 deletions

View file

@ -50,6 +50,52 @@ void Script::_notification(int p_what) {
} }
} }
Variant Script::_get_property_default_value(const StringName &p_property) {
Variant ret;
get_property_default_value(p_property, ret);
return ret;
}
Array Script::_get_script_property_list() {
Array ret;
List<PropertyInfo> list;
get_script_property_list(&list);
for (List<PropertyInfo>::Element *E = list.front(); E; E = E->next()) {
ret.append(E->get().operator Dictionary());
}
return ret;
}
Array Script::_get_script_method_list() {
Array ret;
List<MethodInfo> list;
get_script_method_list(&list);
for (List<MethodInfo>::Element *E = list.front(); E; E = E->next()) {
ret.append(E->get().operator Dictionary());
}
return ret;
}
Array Script::_get_script_signal_list() {
Array ret;
List<MethodInfo> list;
get_script_signal_list(&list);
for (List<MethodInfo>::Element *E = list.front(); E; E = E->next()) {
ret.append(E->get().operator Dictionary());
}
return ret;
}
Dictionary Script::_get_script_constant_map() {
Dictionary ret;
Map<StringName, Variant> map;
get_constants(&map);
for (Map<StringName, Variant>::Element *E = map.front(); E; E = E->next()) {
ret[E->key()] = E->value();
}
return ret;
}
void Script::_bind_methods() { void Script::_bind_methods() {
ClassDB::bind_method(D_METHOD("can_instance"), &Script::can_instance); ClassDB::bind_method(D_METHOD("can_instance"), &Script::can_instance);
@ -64,6 +110,12 @@ void Script::_bind_methods() {
ClassDB::bind_method(D_METHOD("has_script_signal", "signal_name"), &Script::has_script_signal); ClassDB::bind_method(D_METHOD("has_script_signal", "signal_name"), &Script::has_script_signal);
ClassDB::bind_method(D_METHOD("get_script_property_list"), &Script::_get_script_property_list);
ClassDB::bind_method(D_METHOD("get_script_method_list"), &Script::_get_script_method_list);
ClassDB::bind_method(D_METHOD("get_script_signal_list"), &Script::_get_script_signal_list);
ClassDB::bind_method(D_METHOD("get_script_constant_map"), &Script::_get_script_constant_map);
ClassDB::bind_method(D_METHOD("get_property_default_value"), &Script::_get_property_default_value);
ClassDB::bind_method(D_METHOD("is_tool"), &Script::is_tool); ClassDB::bind_method(D_METHOD("is_tool"), &Script::is_tool);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "source_code", PROPERTY_HINT_NONE, "", 0), "set_source_code", "get_source_code"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "source_code", PROPERTY_HINT_NONE, "", 0), "set_source_code", "get_source_code");

View file

@ -109,6 +109,12 @@ protected:
friend class PlaceHolderScriptInstance; friend class PlaceHolderScriptInstance;
virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) {} virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) {}
Variant _get_property_default_value(const StringName &p_property);
Array _get_script_property_list();
Array _get_script_method_list();
Array _get_script_signal_list();
Dictionary _get_script_constant_map();
public: public:
virtual bool can_instance() const = 0; virtual bool can_instance() const = 0;