Files
GDevelop/Core/GDCore/IDE/Events/ExtensionDependencyCache.cpp
D8H 9d0d86e6fb Fix missing extension dependencies in GDO files (#8372)
Also fix an exception when importing a GDO file with an extension without a valid version number
2026-03-11 17:27:59 +01:00

49 lines
1.7 KiB
C++

#include "ExtensionDependencyCache.h"
#include "GDCore/IDE/Events/UsedExtensionsFinder.h"
#include "GDCore/Project/Project.h"
namespace gd {
const std::set<gd::String> &
ExtensionDependencyCache::FindRequiredExtensionsRecursively(
gd::Project &project, const gd::String &extensionName) {
auto itr = dependenciesByExtension.find(extensionName);
if (itr != dependenciesByExtension.end()) {
return itr->second;
}
if (!project.HasEventsFunctionsExtensionNamed(extensionName)) {
// This can't happen.
return InsertAndGetNewDependencies(extensionName);
}
auto &eventsFunctionsExtension =
project.GetEventsFunctionsExtension(extensionName);
const auto &usedExtensionsResult =
gd::UsedExtensionsFinder::ScanEventsFunctionsExtension(
project, eventsFunctionsExtension);
const auto &directlyRequiredExtension =
usedExtensionsResult.GetUsedExtensions();
auto &requiredExtensions = InsertAndGetNewDependencies(extensionName);
for (const gd::String &requiredExtensionName : directlyRequiredExtension) {
if (!project.HasEventsFunctionsExtensionNamed(requiredExtensionName)) {
continue;
}
requiredExtensions.insert(requiredExtensionName);
auto &transitivelyRequiredExtensions =
FindRequiredExtensionsRecursively(project, requiredExtensionName);
for (auto &&requiredExtensionName : transitivelyRequiredExtensions) {
requiredExtensions.insert(requiredExtensionName);
}
}
return requiredExtensions;
};
std::set<gd::String> &ExtensionDependencyCache::InsertAndGetNewDependencies(
const gd::String &extensionName) {
std::set<gd::String> dependencies;
dependenciesByExtension[extensionName] = dependencies;
return dependenciesByExtension[extensionName];
}
} // namespace gd