private string GenerateTables(CodeDomProvider codeDomProvider, CodeGeneratorOptions options, CodeGenerationInfo generationInfo) { var sb = new StringBuilder(); using (var sw = new StringWriter(sb)) { var codeGenerator = codeDomProvider.CreateGenerator(sw); var compileUnit = new CodeCompileUnit(); compileUnit.AddCustomInclude($"{generationInfo.RelativePath}reader/include/crema/inidata"); compileUnit.AddCustomInclude($"{generationInfo.Prefix}types{generationInfo.Postfix}"); compileUnit.AddCustomInclude($"{generationInfo.RelativePath}crema_base"); var codeNamespace = new CodeNamespace(generationInfo.Namespace); codeNamespace.Imports.Add(new CodeNamespaceImport(generationInfo.ReaderNamespace)); CremaDataClassCreator.Create(codeNamespace, generationInfo); compileUnit.Namespaces.Add(codeNamespace); codeGenerator.GenerateCodeFromCompileUnit(compileUnit, sw, options); } return(sb.ToString()); }
private static void CreateConstructorFromTable(CodeTypeDeclaration classType, TableInfo tableInfo, CodeGenerationInfo generationInfo) { var cc = new CodeConstructor(); cc.Attributes = MemberAttributes.Public; cc.Name = tableInfo.TableName; cc.Parameters.Add(generationInfo.ReaderNamespace, "itable&", "table"); //cc.BaseConstructorArgs.Add("table"); //cc.AddConstructorStatement(string.Format("{0}(table)", CodeGenerationInfo.CremaTableName)); // verify hashValue { var css = CreateCompareTypeStatement(classType, tableInfo, generationInfo); var tst = CremaDataClassCreator.CreateTryCatchStatement(classType, css, generationInfo); cc.Statements.Add(css); } { var table = new CodeVariableReferenceExpression("table"); var dataSet = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(table, "dataset")); var tables = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(dataSet, "tables")); foreach (var item in generationInfo.GetChilds(tableInfo)) { var tableName = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(table, "name")); var childName = new CodeBinaryOperatorExpression(tableName, CodeBinaryOperatorType.Add, new CodePrimitiveExpression("." + item.TableName)); var childTable = new CodeIndexerExpression(tables, childName); var childField = new CodeFieldReferenceExpression(thisRef, item.TableName); var instance = new CodeObjectCreateExpression(item.GetCodeType(CodeType.None), childTable); cc.Statements.AddAssign(childField, instance); //cc.AddConstructorStatement(string.Format("{0}(table.dataset().tables()[\"{1}\"])", item.GetFieldName(), item.GetUniqueName())); } } { var table = new CodeVariableReferenceExpression("table"); var readFromFile = new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "ReadFromTable"); var methodInvoke = new CodeMethodInvokeExpression(readFromFile, table); cc.Statements.Add(methodInvoke); } // SetRelations { var table = new CodeVariableReferenceExpression("table"); foreach (var item in generationInfo.GetChilds(tableInfo)) { var setRelations = new CodeMethodReferenceExpression(thisRef, "SetRelations"); var field = new CodeFieldPointerExpression(thisRef, item.TableName); var rows = new CodePropertyReferenceExpression(field, "Rows"); var codeTypeRef = new CodeTypeReferenceExpression(tableInfo.GetRowCodeType(CodeType.None)); var setChildAction = new CodePropertyReferenceExpression(null, tableInfo.TableName + "Set" + item.TableName); var tableName = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(table, "name")); var childName = new CodeBinaryOperatorExpression(tableName, CodeBinaryOperatorType.Add, new CodePrimitiveExpression("." + item.TableName)); var setRelationsInvoke = new CodeMethodInvokeExpression(setRelations, childName, rows, setChildAction); cc.Statements.Add(setRelationsInvoke); } } classType.Members.Add(cc); }