79 lines
2.4 KiB
C#
79 lines
2.4 KiB
C#
#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<Config>();
|
|
|
|
var configsCode = "";
|
|
var configAddCode = "";
|
|
var configReferencesCode = "";
|
|
var configReferencesUsingsCode = "";
|
|
var configOfConfigsCode = "";
|
|
|
|
foreach (var cfg in configs.OrderByDescending(o => o.Name))
|
|
{
|
|
var attribute = cfg.GetAttribute<Config>();
|
|
|
|
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 |