private List <string> Generate(StatorCodeGenerator generator, Type[] factoryTypes, Dictionary <string, string> asmdefFolders) { var files = new List <string>(); DebugInfo("Begin refreshing auto generated files"); foreach (var factoryType in factoryTypes) { DebugInfo($"Begin generate code for `{factoryType}` type"); var code = generator.Generate(factoryType); var path = Path.Combine(Settings.PathToGenerate, "builder_" + factoryType.GetTypeSafeName() + ".cs"); var assemblyName = factoryType.Assembly.GetName().Name; if (asmdefFolders.TryGetValue(assemblyName, out var asmPath)) { path = Path.Combine(asmPath, Settings.AutoGeneratedFolder, "builder_" + factoryType.GetTypeSafeName() + ".cs"); } else { DebugInfo($"Not found asmdef folder for assembly {assemblyName}"); } Directory.CreateDirectory(Path.GetDirectoryName(path)); DebugInfo($"Generated code for `{factoryType}` type, file: {path}"); files.Add(path); if (File.Exists(path)) { var oldCode = File.ReadAllText(path); if (!string.Equals(code, oldCode)) { Info($"Code for `{factoryType}` type will rewrite"); File.WriteAllText(path, code); } else { DebugInfo($"Generated code for `{factoryType}` type equal old code. Skippig."); } } else { Info($"Code for `{factoryType}` type will write in file: {path}"); File.WriteAllText(path, code); } } return(files); }
public void Refresh() { var validators = new Dictionary <Type, IRegistrationValidator>() { [typeof(ContainerRegistrationDirect)] = new DirectRegistrationValidator(), [typeof(ContainerRegistrationMethod)] = new MethodRegistrationValidator() }; var generators = new Dictionary <Type, ICodeRegistrationGenerator>() { [typeof(ContainerRegistrationDirect)] = new DirectCodeRegistrationGenerator(), [typeof(ContainerRegistrationMethod)] = new MethodCodeRegistrationGenerator() }; var validator = new ContainerDependencyValidator(validators); var generator = new StatorCodeGenerator(validator, generators); var factoryBaseType = typeof(ContainerFactory); var factoryTypes = AppDomain.CurrentDomain .GetAssemblies() .SelectMany(a => a.GetTypes()) .Where(t => factoryBaseType.IsAssignableFrom(t)) .Where(t => t != factoryBaseType) .ToArray(); var asmdefFolders = GetAsmDefToFolder(); var files = Generate(generator, factoryTypes, asmdefFolders); var allFiles = GetAllGeneratedFiles(asmdefFolders); var fileForDelete = allFiles.Except(files); foreach (var deletingFile in fileForDelete) { Info($"Remove old file {deletingFile}"); File.Delete(deletingFile); } AssetDatabase.Refresh(); DebugInfo($"Finish generating code"); }