Skip to content

Commit

Permalink
Merge pull request #81629 from rune-scape/more-gdscript-deps
Browse files Browse the repository at this point in the history
GDScript: Include lambda dependencies
  • Loading branch information
akien-mga committed Feb 12, 2024
2 parents 42c3a38 + e4242f9 commit 986c8af
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 27 deletions.
55 changes: 29 additions & 26 deletions modules/gdscript/gdscript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1170,7 +1170,7 @@ GDScript *GDScript::get_root_script() {
RBSet<GDScript *> GDScript::get_dependencies() {
RBSet<GDScript *> dependencies;

_get_dependencies(dependencies, this);
_collect_dependencies(dependencies, this);
dependencies.erase(this);

return dependencies;
Expand Down Expand Up @@ -1276,52 +1276,55 @@ GDScript *GDScript::_get_gdscript_from_variant(const Variant &p_variant) {
return Object::cast_to<GDScript>(obj);
}

void GDScript::_get_dependencies(RBSet<GDScript *> &p_dependencies, const GDScript *p_except) {
void GDScript::_collect_function_dependencies(GDScriptFunction *p_func, RBSet<GDScript *> &p_dependencies, const GDScript *p_except) {
if (p_func == nullptr) {
return;
}
for (GDScriptFunction *lambda : p_func->lambdas) {
_collect_function_dependencies(lambda, p_dependencies, p_except);
}
for (const Variant &V : p_func->constants) {
GDScript *scr = _get_gdscript_from_variant(V);
if (scr != nullptr && scr != p_except) {
scr->_collect_dependencies(p_dependencies, p_except);
}
}
}

void GDScript::_collect_dependencies(RBSet<GDScript *> &p_dependencies, const GDScript *p_except) {
if (p_dependencies.has(this)) {
return;
}
p_dependencies.insert(this);
if (this != p_except) {
p_dependencies.insert(this);
}

for (const KeyValue<StringName, GDScriptFunction *> &E : member_functions) {
if (E.value == nullptr) {
continue;
}
for (const Variant &V : E.value->constants) {
GDScript *scr = _get_gdscript_from_variant(V);
if (scr != nullptr && scr != p_except) {
scr->_get_dependencies(p_dependencies, p_except);
}
}
_collect_function_dependencies(E.value, p_dependencies, p_except);
}

if (implicit_initializer) {
for (const Variant &V : implicit_initializer->constants) {
GDScript *scr = _get_gdscript_from_variant(V);
if (scr != nullptr && scr != p_except) {
scr->_get_dependencies(p_dependencies, p_except);
}
}
_collect_function_dependencies(implicit_initializer, p_dependencies, p_except);
}

if (implicit_ready) {
for (const Variant &V : implicit_ready->constants) {
GDScript *scr = _get_gdscript_from_variant(V);
if (scr != nullptr && scr != p_except) {
scr->_get_dependencies(p_dependencies, p_except);
}
}
_collect_function_dependencies(implicit_ready, p_dependencies, p_except);
}

if (static_initializer) {
_collect_function_dependencies(static_initializer, p_dependencies, p_except);
}

for (KeyValue<StringName, Ref<GDScript>> &E : subclasses) {
if (E.value != p_except) {
E.value->_get_dependencies(p_dependencies, p_except);
E.value->_collect_dependencies(p_dependencies, p_except);
}
}

for (const KeyValue<StringName, Variant> &E : constants) {
GDScript *scr = _get_gdscript_from_variant(E.value);
if (scr != nullptr && scr != p_except) {
scr->_get_dependencies(p_dependencies, p_except);
scr->_collect_dependencies(p_dependencies, p_except);
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion modules/gdscript/gdscript.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ class GDScript : public Script {
void _get_script_signal_list(List<MethodInfo> *r_list, bool p_include_base) const;

GDScript *_get_gdscript_from_variant(const Variant &p_variant);
void _get_dependencies(RBSet<GDScript *> &p_dependencies, const GDScript *p_except);
void _collect_function_dependencies(GDScriptFunction *p_func, RBSet<GDScript *> &p_dependencies, const GDScript *p_except);
void _collect_dependencies(RBSet<GDScript *> &p_dependencies, const GDScript *p_except);

protected:
bool _get(const StringName &p_name, Variant &r_ret) const;
Expand Down

0 comments on commit 986c8af

Please sign in to comment.