public override void Initialize(Config config)
        {
            Type[] types = null;
            try {
                types = CodeGeneratorUtil.LoadTypesFromCodeGeneratorAssemblies();
            } catch (Exception ex) {
                _configException = ex;
            }

            if (_configException == null)
            {
                var defaultEnabledDataProviderNames  = initPhase <ICodeGeneratorDataProvider>(types, out _availableDataProviderTypes, out _availableDataProviderNames);
                var defaultEnabledGeneratorNames     = initPhase <ICodeGenerator>(types, out _availableGeneratorTypes, out _availableGeneratorNames);
                var defaultEnabledPostProcessorNames = initPhase <ICodeGenFilePostProcessor>(types, out _availablePostProcessorTypes, out _availablePostProcessorNames);

                _codeGeneratorConfig = new CodeGeneratorConfig(config, defaultEnabledDataProviderNames, defaultEnabledGeneratorNames, defaultEnabledPostProcessorNames);

                _contexts = new List <string>(_codeGeneratorConfig.contexts);

                _contextList = new UnityEditorInternal.ReorderableList(_contexts, typeof(string), true, true, true, true);
                _contextList.drawHeaderCallback  = rect => EditorGUI.LabelField(rect, "Contexts");
                _contextList.drawElementCallback = (rect, index, isActive, isFocused) => {
                    rect.width      -= 20;
                    _contexts[index] = EditorGUI.TextField(rect, _contexts[index]);
                };
                _contextList.onAddCallback       = list => list.list.Add("New Context");
                _contextList.onCanRemoveCallback = list => list.count > 1;
                _contextList.onChangedCallback   = list => GUI.changed = true;
            }
        }
示例#2
0
 public override void Run(string[] args)
 {
     if (assertPreferences(args))
     {
         printTypes(CodeGeneratorUtil.LoadTypesFromPlugins(loadPreferences(args)));
     }
 }
示例#3
0
        public override void Run(string[] args)
        {
            if (assertPreferences())
            {
                var preferences = loadPreferences();
                var config      = new CodeGeneratorConfig();
                config.Configure(preferences);

                fabl.Debug(config.ToString());

                Type[] types = null;
                Dictionary <string, string> configurables = null;

                try {
                    types         = CodeGeneratorUtil.LoadTypesFromPlugins(preferences);
                    configurables = CodeGeneratorUtil.GetConfigurables(
                        CodeGeneratorUtil.GetUsed <ICodeGeneratorDataProvider>(types, config.dataProviders),
                        CodeGeneratorUtil.GetUsed <ICodeGenerator>(types, config.codeGenerators),
                        CodeGeneratorUtil.GetUsed <ICodeGenFilePostProcessor>(types, config.postProcessors)
                        );
                } catch (Exception ex) {
                    printKeyStatus(config.defaultProperties.Keys.ToArray(), preferences);
                    throw ex;
                }

                var requiredKeys = config.defaultProperties.Merge(configurables).Keys.ToArray();

                printKeyStatus(requiredKeys, preferences);
                printPluginStatus(types, config);
            }
        }
示例#4
0
        public CodeGeneratorData[] GetData()
        {
            if (_types == null)
            {
                _types = CodeGeneratorUtil.LoadTypesFromAssemblies();
            }

            var dataFromComponents = _types
                                     .Where(type => type.ImplementsInterface <IComponent>())
                                     .Where(type => !type.IsAbstract)
                                     .Select(type => createDataForComponent(type));

            var dataFromNonComponents = _types
                                        .Where(type => !type.ImplementsInterface <IComponent>())
                                        .Where(type => !type.IsGenericType)
                                        .Where(type => hasContexts(type))
                                        .SelectMany(type => createDataForNonComponent(type));

            var generatedComponentsLookup = dataFromNonComponents.ToLookup(data => data.GetFullTypeName());

            return(dataFromComponents
                   .Where(data => !generatedComponentsLookup.Contains(data.GetFullTypeName()))
                   .Concat(dataFromNonComponents)
                   .ToArray());
        }
        DesperateDevs.CodeGeneration.CodeGenerator.CodeGenerator CodeGeneratorFromPreferences(Preferences preferences)
        {
            ICodeGenerationPlugin[] instances    = LoadFromPlugins(preferences);
            CodeGeneratorConfig     andConfigure = preferences.CreateAndConfigure <CodeGeneratorConfig>();

            IPreProcessor[] enabledInstancesOf1 =
                CodeGeneratorUtil.GetEnabledInstancesOf <IPreProcessor>(instances, andConfigure.preProcessors);
            IDataProvider[] enabledInstancesOf2 =
                CodeGeneratorUtil.GetEnabledInstancesOf <IDataProvider>(instances, andConfigure.dataProviders);
            ICodeGenerator[] enabledInstancesOf3 =
                CodeGeneratorUtil.GetEnabledInstancesOf <ICodeGenerator>(instances, andConfigure.codeGenerators);
            IPostProcessor[] enabledInstancesOf4 =
                CodeGeneratorUtil.GetEnabledInstancesOf <IPostProcessor>(instances, andConfigure.postProcessors);
            configure((ICodeGenerationPlugin[])enabledInstancesOf1, preferences);
            configure((ICodeGenerationPlugin[])enabledInstancesOf2, preferences);
            configure((ICodeGenerationPlugin[])enabledInstancesOf3, preferences);
            configure((ICodeGenerationPlugin[])enabledInstancesOf4, preferences);
            bool trackHooks = true;

            if (preferences.HasKey("Jenny.TrackHooks"))
            {
                trackHooks = preferences["Jenny.TrackHooks"] == "true";
            }
            return(new DesperateDevs.CodeGeneration.CodeGenerator.CodeGenerator(enabledInstancesOf1,
                                                                                enabledInstancesOf2, enabledInstancesOf3, enabledInstancesOf4, trackHooks));
        }
        public CodeGeneratorData[] GetData()
        {
            if (_types == null)
            {
                _types = CodeGeneratorUtil.LoadTypesFromAssemblies();
            }

            var entityIndexData = _types
                                  .Where(type => !type.IsAbstract)
                                  .Where(type => type.ImplementsInterface <IComponent>())
                                  .ToDictionary(
                type => type,
                type => type.GetPublicMemberInfos())
                                  .Where(kv => kv.Value.Any(info => info.attributes.Any(attr => attr.attribute is AbstractEntityIndexAttribute)))
                                  .Select(kv => createEntityIndexData(kv.Key, kv.Value));

            var customEntityIndexData = _types
                                        .Where(type => !type.IsAbstract)
                                        .Where(type => Attribute.IsDefined(type, typeof(CustomEntityIndexAttribute)))
                                        .Select(type => createCustomEntityIndexData(type));

            return(entityIndexData
                   .Concat(customEntityIndexData)
                   .ToArray());
        }
示例#7
0
        public override void Run(string[] args)
        {
            if (assertPreferences(args))
            {
                var preferences = loadPreferences(args);
                var config      = new CodeGeneratorConfig();
                config.Configure(preferences);

                var cliConfig = new CLIConfig();
                cliConfig.Configure(preferences);

                forceAddKeys(config.defaultProperties, preferences);
                forceAddKeys(cliConfig.defaultProperties, preferences);

                Type[] types = null;

                try {
                    types = CodeGeneratorUtil.LoadTypesFromPlugins(preferences);
                    getConfigurables(types, config);
                } catch (Exception ex) {
                    throw ex;
                }

                var askedRemoveKeys = new HashSet <string>();
                var askedAddKeys    = new HashSet <string>();
                while (fix(askedRemoveKeys, askedAddKeys, types, config, cliConfig, preferences))
                {
                }
            }
        }
        static string[] initPhase <T>(Assembly assembly, out string[] availableTypes, out string[] availableNames) where T : ICodeGeneratorInterface
        {
            var instances = CodeGeneratorUtil
                            .GetOrderedTypes <T>(assembly)
                            .Where(type => !type.IsAbstract)
                            .Select(type => (T)Activator.CreateInstance(type));

            if (typeof(T) == typeof(ICodeGenFilePostProcessor))
            {
                instances = instances
                            .OrderBy(instance => ((ICodeGenFilePostProcessor)instance).priority);
            }
            else
            {
                instances = instances
                            .OrderBy(instance => instance.name);
            }

            availableTypes = instances
                             .Select(instance => instance.GetType().FullName)
                             .ToArray();

            availableNames = instances
                             .Select(instance => instance.name)
                             .ToArray();

            return(instances
                   .Where(instance => instance.isEnabledByDefault)
                   .Select(instance => instance.GetType().FullName)
                   .ToArray());
        }
示例#9
0
        protected override void run()
        {
            var config = new CodeGeneratorConfig();

            config.Configure(_preferences);

            var cliConfig = new CLIConfig();

            cliConfig.Configure(_preferences);

            forceAddKeys(config.defaultProperties, _preferences);
            forceAddKeys(cliConfig.defaultProperties, _preferences);

            Type[] types = null;

            try {
                types = CodeGeneratorUtil.LoadTypesFromPlugins(_preferences);
                // A test to check if all types can be resolved and instantiated.
                CodeGeneratorUtil.GetEnabledInstancesOf <ICodeGeneratorDataProvider>(types, config.dataProviders);
                CodeGeneratorUtil.GetEnabledInstancesOf <ICodeGenerator>(types, config.codeGenerators);
                CodeGeneratorUtil.GetEnabledInstancesOf <ICodeGenFilePostProcessor>(types, config.postProcessors);
            } catch (Exception ex) {
                throw ex;
            }

            var askedRemoveKeys = new HashSet <string>();
            var askedAddKeys    = new HashSet <string>();

            while (fix(askedRemoveKeys, askedAddKeys, types, config, cliConfig, _preferences))
            {
            }
        }
示例#10
0
        public override void Run(string[] args)
        {
            if (assertProperties())
            {
                var properties = loadProperties();
                var config     = new CodeGeneratorConfig();
                config.Configure(properties);

                Type[] types = null;
                Dictionary <string, string> configurables = null;

                try {
                    types         = CodeGeneratorUtil.LoadTypesFromPlugins(properties);
                    configurables = CodeGeneratorUtil.GetConfigurables(
                        CodeGeneratorUtil.GetUsed <ICodeGeneratorDataProvider>(types, config.dataProviders),
                        CodeGeneratorUtil.GetUsed <ICodeGenerator>(types, config.codeGenerators),
                        CodeGeneratorUtil.GetUsed <ICodeGenFilePostProcessor>(types, config.postProcessors)
                        );
                } catch (Exception ex) {
                    fixKeys(null, config.defaultProperties, properties);
                    throw ex;
                }

                fixKeys(configurables, config.defaultProperties, properties);
                fixConfigurableKeys(configurables, properties);
                fixPlugins(types, config, properties);
            }
        }
示例#11
0
 static void fixConfigurableKeys(Dictionary <string, string> configurables, Properties properties)
 {
     foreach (var kv in CodeGeneratorUtil.GetMissingConfigurables(configurables, properties))
     {
         Helper.AddKey("Add missing key", kv.Key, kv.Value, properties);
     }
 }
示例#12
0
        static void createNewConfig(bool force)
        {
            var currentDir = Directory.GetCurrentDirectory();
            var path       = currentDir + Path.DirectorySeparatorChar + Preferences.configPath;

            if (!File.Exists(path) || force)
            {
                var types         = AppDomain.CurrentDomain.GetAllTypes();
                var defaultConfig = new CodeGeneratorConfig(
                    new Config(string.Empty),
                    CodeGeneratorUtil.GetOrderedTypeNames <ICodeGeneratorDataProvider>(types).ToArray(),
                    CodeGeneratorUtil.GetOrderedTypeNames <ICodeGenerator>(types).ToArray(),
                    CodeGeneratorUtil.GetOrderedTypeNames <ICodeGenFilePostProcessor>(types).ToArray()
                    );

                var config = defaultConfig.ToString();
                File.WriteAllText(path, config);
                _logger.Info("Created " + path);
                _logger.Debug(config);

                editConfig();
            }
            else
            {
                _logger.Warn(path + " already exists!");
                _logger.Info("Use entitas new -f to overwrite the exiting file.");
                _logger.Info("Use entitas edit to open the exiting file.");
            }
        }
示例#13
0
        protected override void run()
        {
            var config = new CodeGeneratorConfig();

            config.Configure(_preferences);

            var cliConfig = new CLIConfig();

            cliConfig.Configure(_preferences);

            fabl.Debug(_preferences.ToString());

            Type[] types = null;
            Dictionary <string, string> defaultProperties = null;

            try {
                types             = CodeGeneratorUtil.LoadTypesFromPlugins(_preferences);
                defaultProperties = CodeGeneratorUtil.GetDefaultProperties(types, config);
            } catch (Exception ex) {
                printKeyStatus(config.defaultProperties.Keys.ToArray(), cliConfig, _preferences);
                throw ex;
            }

            var requiredKeys = config.defaultProperties
                               .Merge(cliConfig.defaultProperties)
                               .Merge(defaultProperties).Keys.ToArray();

            printKeyStatus(requiredKeys, cliConfig, _preferences);
            printPluginStatus(types, config);
            printCollisions(config);
        }
示例#14
0
 public static void Main(string[] args)
 {
     // Configure code generator in Entitas.properties file
     CodeGeneratorUtil
     .CodeGeneratorFromConfig("../../Entitas.properties")
     .Generate();
 }
示例#15
0
 static void printConfigurableKeyStatus(Dictionary <string, string> configurables, Properties properties)
 {
     foreach (var kv in CodeGeneratorUtil.GetMissingConfigurables(configurables, properties))
     {
         fabl.Warn("Missing key: " + kv.Key);
     }
 }
示例#16
0
 Dictionary <string, string> GetConfigurables()
 {
     return(CodeGeneratorUtil.GetConfigurables(
                CodeGeneratorUtil.GetUsed <ICodeGeneratorDataProvider>(mTypes, mCodeGeneratorConfig.DataProviders),
                CodeGeneratorUtil.GetUsed <ICodeGenerator>(mTypes, mCodeGeneratorConfig.CodeGenerators),
                CodeGeneratorUtil.GetUsed <ICodeGenFilePostProcessor>(mTypes, mCodeGeneratorConfig.PostProcessors)
                ));
 }
示例#17
0
 static Dictionary <string, string> getConfigurables(Type[] types, CodeGeneratorConfig config)
 {
     return(CodeGeneratorUtil.GetConfigurables(
                CodeGeneratorUtil.GetUsed <ICodeGeneratorDataProvider>(types, config.dataProviders),
                CodeGeneratorUtil.GetUsed <ICodeGenerator>(types, config.codeGenerators),
                CodeGeneratorUtil.GetUsed <ICodeGenFilePostProcessor>(types, config.postProcessors)
                ));
 }
示例#18
0
        protected override void run()
        {
            var codeGenerator = CodeGeneratorUtil.CodeGeneratorFromPreferences(_preferences);

            codeGenerator.OnProgress += (title, info, progress) => {
                var p = (int)(progress * 100);
                fabl.Debug(string.Format("{0}: {1} ({2}%)", title, info, p));
            };
            codeGenerator.DryRun();
        }
示例#19
0
        void drawConfigurables()
        {
            var defaultProperties = CodeGeneratorUtil.GetDefaultProperties(_types, _codeGeneratorConfig);

            _preferences.AddProperties(defaultProperties, false);

            foreach (var kv in defaultProperties.OrderBy(kv => kv.Key))
            {
                _preferences[kv.Key] = EditorGUILayout.TextField(kv.Key.ShortTypeName().ToSpacedCamelCase(), _preferences[kv.Key]);
            }
        }
示例#20
0
        protected override void run()
        {
            fabl.Debug("Entitas Code Generator version " + EntitasResources.GetVersion());
            new Status().Run(_rawArgs);
            fabl.Debug("Dry Run");
            CodeGeneratorUtil
            .CodeGeneratorFromPreferences(_preferences)
            .DryRun();

            fabl.Info("👨‍🔬  No problems detected. Happy coding :)");
        }
示例#21
0
 public ActionResult MockAddReturnOrder()
 {
     _returnOrderService.Save(new SaveReturnOrderInput()
     {
         BillNum     = CodeGeneratorUtil.GetInt32UniqueCode().ToString(),
         GmtCreate   = DateTime.Now,
         Status      = (int)ReturnOrderStatus.待审核,
         GmtModified = DateTime.Now,
     });
     return(Json(Result.Success("创建成功")));
 }
示例#22
0
 static void scanDlls()
 {
     if (File.Exists(Preferences.configPath))
     {
         printTypes(CodeGeneratorUtil.LoadTypesFromCodeGeneratorAssemblies());
         printTypes(CodeGeneratorUtil.LoadTypesFromAssemblies());
     }
     else
     {
         printNoConfig();
     }
 }
示例#23
0
 public override void Run(string[] args)
 {
     if (assertPreferences(args))
     {
         var codeGenerator = CodeGeneratorUtil.CodeGeneratorFromPreferences(loadPreferences(args));
         codeGenerator.OnProgress += (title, info, progress) => {
             var p = (int)(progress * 100);
             fabl.Debug(string.Format("{0}: {1} ({2}%)", title, info, p));
         };
         codeGenerator.DryRun();
     }
 }
示例#24
0
        protected override void run()
        {
            var types        = CodeGeneratorUtil.LoadTypesFromPlugins(_preferences);
            var orderedTypes = types
                               .OrderBy(type => type.Assembly.GetName().Name)
                               .ThenBy(type => type.FullName);

            foreach (var type in orderedTypes)
            {
                fabl.Info(type.Assembly.GetName().Name + ": " + type);
            }
        }
示例#25
0
 public static void AddValue(string question, string value, string[] values, Action <string[]> updateAction, Properties properties)
 {
     fabl.Info(question + ": '" + value + "' ? (y / n)");
     if (GetUserDecision())
     {
         var valueList = values.ToList();
         valueList.Add(value);
         updateAction(CodeGeneratorUtil.GetOrderedNames(valueList.ToArray()));
         Preferences.SaveProperties(properties);
         fabl.Info("Added: " + value);
     }
 }
示例#26
0
        static void setTypesAndNames <T>(Type[] types, out string[] availableTypes, out string[] availableNames) where T : ICodeGeneratorInterface
        {
            IEnumerable <T> instances = CodeGeneratorUtil.GetOrderedInstancesOf <T>(types);

            availableTypes = instances
                             .Select(instance => instance.GetType().ToCompilableString())
                             .ToArray();

            availableNames = instances
                             .Select(instance => instance.name)
                             .ToArray();
        }
示例#27
0
 public override void Run(string[] args)
 {
     if (base.assertProperties())
     {
         CodeGenerator codeGenerator = CodeGeneratorUtil.CodeGeneratorFromPreferences(Preferences.sharedInstance);
         codeGenerator.OnProgress += delegate(string title, string info, float progress)
         {
             int num = (int)(progress * 100f);
             fabl.Debug(string.Format("{0}: {1} ({2}%)", title, info, num));
         };
         codeGenerator.DryRun();
     }
 }
示例#28
0
 static void generate()
 {
     if (File.Exists(Preferences.configPath))
     {
         CodeGeneratorUtil
         .CodeGeneratorFromConfig(Preferences.configPath)
         .Generate();
     }
     else
     {
         printNoConfig();
     }
 }
示例#29
0
        public override void Execute(string[] args)
        {
            Log.I("QFramework Code Generator version " + EntitasResources.GetVersion());
            if (AssertProperties())
            {
                new Status().Execute(args);

                Log.I("Dry Run");

                CodeGeneratorUtil
                .CodeGeneratorFromProperties()
                .DryRun();
            }
        }
示例#30
0
        public override void Run(string[] args)
        {
            fabl.Debug("Entitas Code Generator version " + EntitasResources.GetVersion());
            if (assertPreferences(args))
            {
                new Status().Run(args);
                fabl.Debug("Dry Run");
                CodeGeneratorUtil
                .CodeGeneratorFromPreferences(loadPreferences(args))
                .DryRun();

                fabl.Info("👨‍🔬  No problems detected. Happy coding :)");
            }
        }