public CodeGenResult Generate() { try { NewContext(); var modelsScript = ""; foreach (var param in _modelsGeneratorInputs) { modelsScript += GenerateModelSourceCode(param) + "\n"; } var usings = CurrentContext.GetNamespaces(); if (usings.Contains(_namespaceStr)) { usings.Remove(_namespaceStr); } modelsScript = CodeGenExtensions.WrapClass(modelsScript, _namespaceStr, usings); var res = new CodeGenResult { Context = CurrentContext, CSharpCode = modelsScript }; return(res); } catch (Exception ex) { throw new CodeGenException($"Exception in {GetType().Name}.", ex); } }
private static bool CompileIntegerDivision(CodeGen codeGen, ILinkingInfo linkingInfo, Type type, Register leftReg, ExpressionResult rightExpr) { var rightReg = type.OtherVolatileIntRegister(leftReg, Register64.RAX, Register64.RDX); rightExpr.GenerateMoveTo(rightReg, type, codeGen, linkingInfo); if (!leftReg.IsSameRegister(Register64.RAX)) { codeGen.Mov(Register64.RAX, leftReg.AsR64()); } var typeIsByte = type.SizeOf() == 1; var typeIsSigned = type.IsSignedInteger(); if (typeIsByte) { if (typeIsSigned) { codeGen.Movsx(Register64.RAX, Register8.AL); } else { codeGen.Movzx(Register64.RAX, Register8.AL); } } else { codeGen.Xor(Register64.RDX, Register64.RDX); if (typeIsSigned) { codeGen.Test(Register64.RAX, Register64.RAX); codeGen.Jns(CodeGenExtensions.InstructionLength(gen => gen.Not(Register64.RDX))); codeGen.Not(Register64.RDX); } } if (type.IsSignedInteger()) { codeGen.Idiv(rightReg); } else { codeGen.Div(rightReg); } return(typeIsByte); }
public void Test() { const string Source = @" //Use types from different namespaces and assemblies. public class GenClass1 { public int Num { get; set; }=100; public Stream SomeProp1 { get; set; } public List<string> SomeProp2 { get; set; } public Task<Dictionary<string, MemberInfo>> SomeMethod1(){ return null; } } "; //Easy manage depemdensies. var ctx = new SourceFileContext(); ctx.UsedType(typeof(int)); ctx.UsedType(typeof(Stream)); ctx.UsedType(typeof(List <string>)); //Works with generic parameters automatically. ctx.UsedType(typeof(Task <Dictionary <string, MemberInfo> >)); //Add namespace and usings. var source = CodeGenExtensions.WrapClass( Source, "MyNamespace", ctx.GetNamespaces() ); var compilerInputData = new CompilerInputData() { CSharpCode = source, ReferencedAssemblies = ctx.GetAssemblies() }; var assembly = Compiler.Compile(compilerInputData); var type = assembly.GetType("MyNamespace.GenClass1"); dynamic modelInstance = Activator.CreateInstance(type); int num = modelInstance.Num; Assert.AreEqual(100, num); }