1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #108577 from YYF233333/global_class_list

Simplify `ScriptServer::get_global_class_list`
This commit is contained in:
Thaddeus Crews
2025-09-30 11:19:10 -05:00
23 changed files with 155 additions and 150 deletions

View File

@@ -33,6 +33,7 @@
#include "core/config/engine.h"
#include "core/io/resource_loader.h"
#include "core/object/script_language.h"
#include "core/templates/sort_array.h"
#include "core/version.h"
#ifdef DEBUG_ENABLED
@@ -240,28 +241,46 @@ bool ClassDB::is_parent_class(const StringName &p_class, const StringName &p_inh
return _is_parent_class(p_class, p_inherits);
}
void ClassDB::get_class_list(List<StringName> *p_classes) {
// This function only sorts items added by this function.
// If `p_classes` is not empty before calling and a global sort is needed, caller must handle that separately.
void ClassDB::get_class_list(LocalVector<StringName> &p_classes) {
Locker::Lock lock(Locker::STATE_READ);
for (const KeyValue<StringName, ClassInfo> &E : classes) {
p_classes->push_back(E.key);
if (classes.is_empty()) {
return;
}
p_classes->sort_custom<StringName::AlphCompare>();
p_classes.reserve(p_classes.size() + classes.size());
for (const KeyValue<StringName, ClassInfo> &cls : classes) {
p_classes.push_back(cls.key);
}
SortArray<StringName> sorter;
sorter.sort(&p_classes[p_classes.size() - classes.size()], classes.size());
}
#ifdef TOOLS_ENABLED
void ClassDB::get_extensions_class_list(List<StringName> *p_classes) {
// This function only sorts items added by this function.
// If `p_classes` is not empty before calling and a global sort is needed, caller must handle that separately.
void ClassDB::get_extensions_class_list(LocalVector<StringName> &p_classes) {
Locker::Lock lock(Locker::STATE_READ);
uint32_t original_size = p_classes.size();
for (const KeyValue<StringName, ClassInfo> &E : classes) {
if (E.value.api != API_EXTENSION && E.value.api != API_EDITOR_EXTENSION) {
continue;
}
p_classes->push_back(E.key);
p_classes.push_back(E.key);
}
p_classes->sort_custom<StringName::AlphCompare>();
// Nothing appended.
if (p_classes.size() == original_size) {
return;
}
SortArray<StringName> sorter;
sorter.sort(&p_classes[original_size], p_classes.size() - original_size);
}
void ClassDB::get_extension_class_list(const Ref<GDExtension> &p_extension, List<StringName> *p_classes) {