#if UNITY_EDITOR using System.Linq; using Unity.VisualScripting; using UnityCodeGen; using UnityEditor; namespace Code.Infrastructure.Generators { [Generator] public class ConfigGenerator : ICodeGenerator { public void Execute(GeneratorContext context) { var configs = TypeCache.GetTypesWithAttribute(); var configsCode = ""; var configAddCode = ""; var configReferencesCode = ""; var configReferencesUsingsCode = ""; var configOfConfigsCode = ""; foreach (var cfg in configs.OrderByDescending(o => o.Name)) { var attribute = cfg.GetAttribute(); configReferencesUsingsCode += $"using {cfg.Namespace};\n"; if (attribute.Multiple) { configReferencesCode += $"public string {cfg.Name};\n"; configAddCode += $@" _multipleConfigReferences.Add(typeof({cfg.FullName}), _configReferences.{cfg.Name}); "; } else { configReferencesCode += $"public AssetReference {cfg.Name};\n"; configAddCode += $@" _singleConfigReferences.Add(typeof({cfg.FullName}), _configReferences.{cfg.Name}); "; } } configsCode += $@" #pragma warning disable CS0105 {configReferencesUsingsCode} #pragma warning restore CS0105 namespace Code.Infrastructure.Configs {{ public partial class ConfigLocator {{ partial void LoadConfigs() {{ {configAddCode} }} }} }} "; context.AddCode($"ConfigLocator.Generated.cs", configsCode); configOfConfigsCode += $@" #pragma warning disable CS0105 {configReferencesUsingsCode} using UnityEngine.AddressableAssets; #pragma warning restore CS0105 namespace Code.Infrastructure.Configs{{ public partial class ConfigReferences {{ {configReferencesCode} }} }} "; context.AddCode($"ConfigReferences.Generated.cs", configOfConfigsCode); } } } #endif