#include "variable-usage.hpp" #include "macro-helpers.hpp" #include "macro.hpp" #include "sync-helpers.hpp" #include "variable-ref.hpp" #include namespace advss { static std::unordered_map collectReferences(Macro *macro) { VariableRefCollector collector; OBSDataAutoRelease data = obs_data_create(); macro->Save(data); return collector.Counts(); } std::unordered_map GetVariableUsage() { std::unordered_map result; auto lock = LockContext(); // Nested macros are saved as part of their parent macro for (const auto ¯o : GetTopLevelMacros()) { for (const auto &[name, count] : collectReferences(macro.get())) { auto &usage = result[name]; usage.referenceCount += count; usage.macroNames.emplace_back(macro->Name()); } } return result; } std::unordered_map GetVariablesUsedByMacro(Macro *macro) { if (!macro) { return {}; } return collectReferences(macro); } std::unordered_map GetVariablesUsedByMacros(const std::vector> ¯os) { std::unordered_map result; auto lock = LockContext(); for (const auto ¯o : macros) { for (const auto &[name, count] : collectReferences(macro.get())) { result[name] += count; } } return result; } } // namespace advss