Exemple #1
0
        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);
        }
Exemple #2
0
        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");
        }