/// <summary> /// Performs final merging of old and new class, then triggers template engine to generate the code. /// </summary> /// <returns>Result to check for errors.</returns> public CodeGeneratorResult GenerateCode() { if (!config.IgnoreExistingCode) { if (existingClass != null && !existingClass.IsEmpty()) { string msg = string.Format("Animator state or parameter is no longer valid{0}. Refactor your code to not contain any references.", (config.KeepObsoleteMembers ? "" : " and will be removed in the next code generation")); existingClass.AddAttributeToAllMembers(new ObsoleteAttributeCodeElement(msg, false)); List <MemberCodeElement> allMembers = newClass.GetAllMembers(); newClass.MergeMethods(existingClass, (element) => !allMembers.Contains(element)); newClass.MergeProperties(existingClass, (element) => !allMembers.Contains(element)); newClass.MergeFields(existingClass, (element) => !allMembers.Contains(element)); } } FileCodeElement fileElement = new FileCodeElement(newClass); fileElement.Usings.Add(new UsingCodeElement("UnityEngine")); CodeGeneratorResult result = templateEngine.GenerateCode(fileElement); if (result.Success) { code = templateEngine.Code; } return(result); }
public async Task <ActionResult> Index(CodeGeneratorResult codeGeneratorResult, string btnAction = "") { if (!String.IsNullOrEmpty(codeGeneratorResult.ConnectionString.ToStr().Trim()) || !String.IsNullOrEmpty(codeGeneratorResult.MySqlConnectionString.ToStr().Trim())) { if (String.IsNullOrEmpty(codeGeneratorResult.SelectedTable.ToStr().Trim())) { ModelState.AddModelError("SelectedTable", "Selected Table is required."); return(View(codeGeneratorResult)); } else if (String.IsNullOrEmpty(codeGeneratorResult.ModifiedTableName.ToStr().Trim())) { ModelState.AddModelError("ModifiedTableName", "Entity Name is required."); return(View(codeGeneratorResult)); } } else if (String.IsNullOrEmpty(codeGeneratorResult.SqlCreateTableStatement.ToStr().Trim())) { ModelState.AddModelError("SqlCreateTableStatement", "Sql Create Table Statement is required."); return(View(codeGeneratorResult)); } if (btnAction.Equals("Generate Code", StringComparison.InvariantCultureIgnoreCase)) { await TableService.GenerateCode(codeGeneratorResult); } else if (btnAction.Equals("Fill GridView", StringComparison.InvariantCultureIgnoreCase)) { await TableService.FillGridView(codeGeneratorResult); } //Logger.Trace("XmlParserHelper.ToXml codeGeneratorResult " + XmlParserHelper.ToXml(codeGeneratorResult)); return(View(codeGeneratorResult)); }
/// <summary> /// Checks all preconditions and builds both class code elements. /// </summary> /// <returns>Result to check if there were errors or user input is required.</returns> /// <param name="suppressLoggingOfChanges">If set to <c>true</c> changes will not be printed to console.</param> public CodeGeneratorResult PrepareCodeGeneration(bool suppressLoggingOfChanges) { CodeGeneratorResult result = BuildClasses(); if (result.Error) { return(result); } if (!existingClass.IsEmpty() && !config.IgnoreExistingCode) { int remaining = CodeElementUtils.CleanupExistingClass(existingClass, newClass, config.KeepObsoleteMembers); if (remaining > 0 && !suppressLoggingOfChanges) { string consoleMessage = ""; List <MemberCodeElement> previousMembers = existingClass.GetAllMembers(); int previousMembersCount = previousMembers.Count; for (int i = 0; i < previousMembersCount; i++) { consoleMessage += previousMembers [i].GetSignature() + "\n"; } Logger.Info("Members found in previous version that will be marked as obsolete: " + consoleMessage); } } return(result); }
private async Task <DatabaseMetadata> GetDatabaseMetaDataAsync(CodeGeneratorResult codeGeneratorResult, DatabaseMetadata databaseMetaData) { var t = Task <DatabaseMetadata> .Factory.StartNew(() => { if (!String.IsNullOrEmpty(codeGeneratorResult.ConnectionString)) { databaseMetaData = this.GetAllTablesFromCache(codeGeneratorResult.ConnectionString); TableRepository.GetSelectedTableMetaData(databaseMetaData, codeGeneratorResult.SelectedTable); } else if (!String.IsNullOrEmpty(codeGeneratorResult.MySqlConnectionString)) { databaseMetaData = this.GetAllMySqlTables(codeGeneratorResult.MySqlConnectionString); TableRepository.GetSelectedMysqlTableMetaData(databaseMetaData, codeGeneratorResult.SelectedTable); } else if (!String.IsNullOrEmpty(codeGeneratorResult.SqlCreateTableStatement)) { databaseMetaData = SqlParserHelper.ParseSqlCreateStatement(codeGeneratorResult.SqlCreateTableStatement); } return(databaseMetaData); }); await t; return(t.Result); }
/// <summary> /// Updates the AnimatorAccess component of the specified game object. /// </summary> /// <param name="go">Go.</param> public void Update(GameObject go) { string file = GetTargetFile(go); if (string.IsNullOrEmpty(file)) { return; } ClassElementsBuilder a = new ClassElementsBuilder(go); CodeGeneratorResult r = a.PrepareCodeGeneration(true); if (!r.Error) { r = a.GenerateCode(); if (r.Success) { BackupAndSave(a.Code, file); EditorStatusObserver.CheckForAutoRefresh(); } } else { Logger.Warning(r); EditorUtility.DisplayDialog(r.ErrorTitle, r.ErrorText, "OK"); } }
/// <summary> /// Builds the new and the existing classes' ClassCodeElements, evaluates all changes and returns a list of them. /// </summary> /// <param name="go">Go.</param> public List <ClassMemberCompareElement> Compare(GameObject go) { CodeGeneratorResult result = BuildClasses(); if (result.Success) { if (!existingClass.IsEmpty()) { List <ClassMemberCompareElement> comparisonResult = CodeElementUtils.CompareClasses(existingClass, newClass, config.IgnoreExistingCode, config.KeepObsoleteMembers); // only Get, Set and Is methods of the existing class are analysed by reflection so remove all // other methods that are provided by default comparisonResult.RemoveAll((element) => element.Member == "Awake" || element.Member == "InitialiseEventManager"); if (builder.allTransitionsHash != existingAllTransitionsHash) { comparisonResult.Add(new ClassMemberCompareElement(ClassMemberCompareElement.Result.New, "", "Transition definition changes", "", "Transition changes", "")); } string message = ""; comparisonResult.ForEach((s) => message += s + "\n"); Logger.Debug("Comparison between new and existing class reveals " + comparisonResult.Count + " changes: " + message); return(comparisonResult); } } return(new List <ClassMemberCompareElement> ()); }
public ActionResult Index() { var codeGeneratorResult = new CodeGeneratorResult(); codeGeneratorResult.DatabaseMetadata = null; codeGeneratorResult.UserMessage = "Hi, dude, Generate the code of selected table \"Controller, Service, Repository and the SQL\" :)"; codeGeneratorResult.UserMessageState = UserMessageState.Welcome; return(View(codeGeneratorResult)); }
public AfterAttemptEvent(CodeGeneratorResult result) { Result = new CodeGeneratorResult { Reason = result.Reason, Retries = result.Retries, Value = result.Value, Success = result.Success }; }
public CodeGeneratorResult GetPathToTemplate(string className) { CodeGeneratorResult result = new CodeGeneratorResult(); templateDir = Preferences.GetString(Preferences.Key.TemplateDir); if (string.IsNullOrEmpty(templateDir) || !Directory.Exists(templateDir)) { result = SearchTemplateDirectory(result); if (result.NoSuccess) { return(result); } } else { string classSpecificTemplate = Path.Combine(templateDir, className + ".txt"); if (File.Exists(classSpecificTemplate)) { TemplateConfig.TemplatePath = classSpecificTemplate; return(result); } else { string defaultTemplate = Path.Combine(templateDir, config.GetDefaultTemplateFileName()); if (File.Exists(defaultTemplate)) { TemplateConfig.TemplatePath = defaultTemplate; return(result); } else { result = SearchTemplateDirectory(result); if (result.NoSuccess) { return(result); } } } } string defaultTemplate2 = Path.Combine(templateDir, config.GetDefaultTemplateFileName()); if (!File.Exists(defaultTemplate2)) { return(result.SetError("Default Template Not Found", "The default template file " + config.GetDefaultTemplateFileName() + " could not be found. Path: " + defaultTemplate2)); } TemplateConfig.TemplatePath = defaultTemplate2; return(result); }
/// <summary> /// Create a new AnimatorAccess component for the specified game object and saves it to targetCodeFile. The /// caller is responsible for ensuring that there is not yet a component existing with the same name. /// </summary> /// <param name="go">Go.</param> /// <param name="targetCodeFile">Target code file.</param> public void Create(GameObject go, string targetCodeFile) { ClassElementsBuilder gen = new ClassElementsBuilder(go, targetCodeFile); CodeGeneratorResult result = gen.PrepareCodeGeneration(false); if (result.Error) { EditorUtility.DisplayDialog(result.ErrorTitle, result.ErrorText, "OK"); return; } result = gen.GenerateCode(); if (result.Success) { BackupAndSave(gen.Code, targetCodeFile); EditorStatusObserver.RegisterForPostProcessing(gen.FullClassName); } }
public void TestAnimatorAccessGenerator(GameObject go) { ClassElementsBuilder a = new ClassElementsBuilder(go); CodeGeneratorResult r = a.PrepareCodeGeneration(true); if (!r.Error) { r = a.GenerateCode(); if (r.Success) { WriteToFile(a.Code, "/Users/kay/tmp/TimeMachine.ignore/Trash/New.cs"); } } else { Logger.Warning(r); } }
CodeGeneratorResult SearchTemplateDirectory(CodeGeneratorResult result) { templateDir = ""; TemplateConfig.TemplatePath = ""; string searchRoot = Path.Combine(Application.dataPath, Manager.SharedInstance.InstallDir); Logger.Debug("Searching for default template in " + searchRoot); string[] files = Directory.GetFiles(searchRoot, config.GetDefaultTemplateFileName(), SearchOption.AllDirectories); if (files.Length == 0) { // fallback, scan all directories under Assets folder files = Directory.GetFiles(Application.dataPath, config.GetDefaultTemplateFileName(), SearchOption.AllDirectories); } if (files.Length == 0) { return(result.SetError("Template Directory Not Found", "The default template " + config.GetDefaultTemplateFileName() + "could not be found anywhere under your Assets directory.")); } else if (files.Length > 1) { string rootDir = Path.Combine(Manager.SharedInstance.InstallDir, config.PathToTemplateDirectory); Logger.Debug("More than one default template found. Searching the best match i.e. path contains [" + rootDir + "] "); foreach (string item in files) { if (item.Contains(rootDir)) { TemplateConfig.TemplatePath = item; break; } } if (string.IsNullOrEmpty(TemplateConfig.TemplatePath)) { TemplateConfig.TemplatePath = files [0]; Logger.Info("More than one default template found but non of them matching the path " + rootDir); } } else { TemplateConfig.TemplatePath = files [0]; } templateDir = Path.GetDirectoryName(TemplateConfig.TemplatePath); Logger.Info("Template directory found, using " + templateDir); Preferences.SetString(Preferences.Key.TemplateDir, templateDir); return(result); }
public async Task GenerateCode(CodeGeneratorResult codeGeneratorResult) { DatabaseMetadata databaseMetaData = new DatabaseMetadata(); databaseMetaData = await GetDatabaseMetaDataAsync(codeGeneratorResult, databaseMetaData); CodeProducerHelper.CodeGeneratorResult = codeGeneratorResult; CodeProducerHelper.DatabaseMetadata = databaseMetaData; var tasks = new List <Task>(); // Database related code. if (databaseMetaData.DatabaseType == DatabaseType.MsSql || databaseMetaData.DatabaseType == DatabaseType.UnKnown) { tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateSaveOrUpdateStoredProcedure(); })); tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateSqlRepository(); })); tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateStoredProcExecutionCode(); })); } else if (databaseMetaData.DatabaseType == DatabaseType.MySql) { tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateMySqlSaveOrUpdateStoredProcedure(); })); tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenereateMySqlRepository(); })); } // c# code for both database. tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateWebApiController(); })); tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateTableServices(); })); tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateTableItem(); })); tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateNewInstance(); })); tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateAspMvcControllerClass(); })); await Task.WhenAll(tasks); var tableName = codeGeneratorResult.ModifiedTableName.ToStr(codeGeneratorResult.SelectedTable); codeGeneratorResult = CodeProducerHelper.CodeGeneratorResult; codeGeneratorResult.DatabaseMetadata = databaseMetaData; codeGeneratorResult.UserMessage = tableName + " table codes are created. You made it dude, Congratulation :)"; codeGeneratorResult.UserMessageState = UserMessageState.Success; }
/// <summary> /// Initialises templateEngine and builds newClass and existingClass. /// </summary> /// <returns>The classes.</returns> CodeGeneratorResult BuildClasses() { TemplateLookup templateLookup = new TemplateLookup(config); CodeGeneratorResult result = templateLookup.GetPathToTemplate(className); if (result.Success) { result = templateEngine.Prepare(templateLookup.TemplateConfig); if (result.NoSuccess) { return(result); } newClass = builder.Build(); if (newClass.IsEmpty()) { return(result.SetError("No Input", "The input seems to be invalid. Check that there are any states or parameter to process.")); } Logger.Debug("New: " + newClass); if (!existingClassBuilder.HasType()) { Logger.Info("Generating source for " + className + " the very first time"); } try { existingClassBuilder.MethodBinding = BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.NonPublic; existingClassBuilder.MethodInfoFilter = (MethodInfo mi) => mi.Name.StartsWith("Is") || mi.Name.StartsWith("Set") || mi.Name.StartsWith("Get") || mi.Name == "IdToName" || mi.Name == "Update" || mi.Name == "FixedUpdate"; existingClass = existingClassBuilder.Build(); // little bit dirty hack: we don't want special methods like Update to participate in the regular // workflow i.e. mark as obsolete to be regenerated once with code throwing NotImplementedException. // So if settings have changed, mark them as obsolete to force their removal List <GenericMethodCodeElement> updateMethods = existingClass.Methods.FindAll( (GenericMethodCodeElement m) => m.Name == "Update" || m.Name == "FixedUpdate"); updateMethods.ForEach((GenericMethodCodeElement m) => m.Obsolete = true); } catch (System.Exception ex) { Logger.Warning(ex.Message + "\n" + ex.StackTrace); result.SetError("Error", "Oops. An unexpected error occurred. Details" + ex.Message + "\n" + ex.StackTrace); } } return(result); }
public async Task FillGridView(CodeGeneratorResult codeGeneratorResult) { var task = Task.Factory.StartNew(() => { var databaseMetaData = new DatabaseMetadata(); if (!String.IsNullOrEmpty(codeGeneratorResult.ConnectionString)) { databaseMetaData = this.GetAllTablesFromCache(codeGeneratorResult.ConnectionString); TableRepository.GetSelectedTableMetaData(databaseMetaData, codeGeneratorResult.SelectedTable); } else if (!String.IsNullOrEmpty(codeGeneratorResult.MySqlConnectionString)) { databaseMetaData = this.GetAllMySqlTables(codeGeneratorResult.MySqlConnectionString); TableRepository.GetSelectedMysqlTableMetaData(databaseMetaData, codeGeneratorResult.SelectedTable); } codeGeneratorResult.DatabaseMetadata = databaseMetaData; }); codeGeneratorResult.UserMessage = codeGeneratorResult.SelectedTable + " table metadata is populated to GridView. You are so close, Do not give up until you make it, dude :)"; codeGeneratorResult.UserMessageState = UserMessageState.Success; await task; }
public ValueTask <CodeGeneratorResult> Transform(CodeGeneratorResult result) { if (result.Value.Length != 2) { return(new ValueTask <CodeGeneratorResult>(new CodeGeneratorResult { Value = null, Reason = FailureReasonType.Transform, Retries = result.Retries, Success = false })); } var adjective = adjectives[result.Value[0]]; var name = names[result.Value[1]]; return(new ValueTask <CodeGeneratorResult>(new CodeGeneratorResult { Value = $"{adjective}_{name}", Reason = result.Reason, Retries = result.Retries, Success = result.Success })); }
public void ParseSqlStatement() { string txt = @" USE [TestEY] GO /****** Object: Table [dbo].[Products] Script Date: 4/28/2018 12:53:17 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Products]( [Id] [int] IDENTITY(1,1) NOT NULL, [StoreId] [int] NULL, [ProductCategoryId] [int] NOT NULL, [BrandId] [int] NULL, [RetailerId] [int] NULL, [ProductCode] [nvarchar](50) NULL, [Name] [nvarchar](500) NOT NULL, [Description] [nvarchar](max) NULL, [Type] [nvarchar](50) NULL, [MainPage] [bit] NULL, [State] [bit] NULL, [Ordering] [int] NULL, [CreatedDate] [datetime2](7) NOT NULL, [ImageState] [bit] NULL, [UpdatedDate] [datetime2](7) NOT NULL, [Price] [float] NOT NULL, [Discount] [float] NOT NULL, [UnitsInStock] [int] NULL, [TotalRating] [int] NULL, [VideoUrl] [nvarchar](1500) NULL, CONSTRAINT [PK_Products_1] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[Products] ADD CONSTRAINT [DF_Products_CreatedDate] DEFAULT (getdate()) FOR [CreatedDate] GO ALTER TABLE [dbo].[Products] ADD CONSTRAINT [DF_Products_UpdatedDate] DEFAULT (getdate()) FOR [UpdatedDate] GO "; String mySql = @" CREATE TABLE `urunler` ( `id` int(11) NOT NULL AUTO_INCREMENT, `baslik_tr` varchar(255) DEFAULT NULL, `keywords_tr` varchar(255) DEFAULT NULL, `katID` varchar(11) DEFAULT '0', `ozet_tr` text, `detay_tr` text, `sira` int(11) DEFAULT '1000', `tarih` datetime DEFAULT NULL, `durum` tinyint(1) DEFAULT NULL, `baslik_en` varchar(255) DEFAULT NULL, `keywords_en` varchar(255) DEFAULT NULL, `ozet_en` text, `detay_en` text, `seo` varchar(255) DEFAULT NULL, `tip` int(4) DEFAULT '1' COMMENT '1: motor, 2: yelken', `link` varchar(255) DEFAULT NULL, `vitrin` int(1) DEFAULT '0', `image` varchar(255) DEFAULT NULL, `youtube` varchar(255) DEFAULT NULL, `fiyat` double DEFAULT NULL, `tamam` varchar(255) CHARACTER SET utf8 COLLATE utf8_turkish_ci DEFAULT NULL, `baslik_de` varchar(255) DEFAULT NULL, `keywords_de` varchar(255) DEFAULT NULL, `ozet_de` text, `detay_de` text, `adres_de` text, `online` tinyint(1) DEFAULT NULL, `ColorID` int(11) DEFAULT NULL, `RegionID` int(11) DEFAULT NULL, `GrapeID` int(11) DEFAULT NULL, `yemek_tercihi_tr` text, `haftanin` tinyint(1) DEFAULT NULL, `yemek_tercihi_en` text, `stok` varchar(255) DEFAULT NULL, `yeni` tinyint(1) DEFAULT NULL, `yil` varchar(255) DEFAULT NULL, `miktar` varchar(255) DEFAULT NULL, `eski_fiyat` varchar(255) DEFAULT NULL, `alkol_orani` varchar(255) DEFAULT NULL, `kdv` varchar(255) DEFAULT NULL, `encok` tinyint(1) DEFAULT NULL, `harita` text CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL, `baslik_ar` varchar(255) DEFAULT NULL, `keywords_ar` varchar(255) DEFAULT NULL, `ozet_ar` text, `detay_ar` text, `baslik_ru` varchar(255) DEFAULT NULL, `keywords_ru` varchar(255) DEFAULT NULL, `ozet_ru` text, `detay_ru` text, `teknik` text, `renk` varchar(255) DEFAULT NULL, `kilit` varchar(255) DEFAULT NULL, `kaplama` varchar(255) DEFAULT NULL, `aksesuar` varchar(255) DEFAULT NULL, `aksesuarr` varchar(255) DEFAULT NULL, `markaID` int(11) DEFAULT NULL, `sektorID` int(11) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; "; mySql = @"CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) ); "; // Create new stopwatch. Stopwatch stopwatch = new Stopwatch(); // Begin timing. stopwatch.Start(); var metadata = SqlParserHelper.ParseSqlCreateStatement(txt); // Stop timing. stopwatch.Stop(); // Write result. Console.WriteLine("Time elapsed: {0}", stopwatch.ElapsedMilliseconds); var r = new CodeGeneratorResult(); r.ModifiedTableName = "NwmProducts"; CodeProducerHelper CodeProducerHelper = new CodeProducerHelper(); CodeProducerHelper.DatabaseMetadata = metadata; CodeProducerHelper.CodeGeneratorResult = r; CodeProducerHelper.GenerateTableItem(); CodeProducerHelper.GenerateSaveOrUpdateStoredProcedure(); Console.WriteLine(r.SqlSaveOrUpdateStoredProc); }