private static CilDocumentSyntax Build( IDerivedBuilder<CilDocumentSyntax> builder, ILogging logging, CilDocumentSyntax context) { return builder.Build(logging, context); }
private static CilDocumentSyntax Build( IDerivedBuilder <CilDocumentSyntax> builder, ILogging logging, CilDocumentSyntax context) { return(builder.Build(logging, context)); }
public CilDocumentSyntax Generate(CilDocumentSyntax docCode) { // Impl placeholder foreach (var plannedClass in plan) { docCode = GenerateImpl(plannedClass, docCode); } return docCode; }
public CilDocumentSyntax Generate(CilDocumentSyntax docCode) { // Impl placeholder foreach (var plannedClass in plan) { docCode = GenerateImpl(plannedClass, docCode); } return(docCode); }
private bool DoRebuild(ref Assembly resource) { using (var stream = new MemoryStream(4096)) { var backend = new CecilBackend(); CilSyntax context = backend; CilDocumentSyntax docCode = context .BeginDocument() .Assembly(assemblyName) .EndAssembly() .AssemblyExtern(context.ResolutionScopeNs.DefineReferencedAssemblyName(new Name1("mscorlib"))) .Version(4, 0, 0, 0) .PublicKeyToken(new Bytes(new byte[] { 0xB7, 0x7A, 0x5C, 0x56, 0x19, 0x34, 0xE0, 0x89 })) .EndAssemblyExtern() ; docCode = DoGenerate(docCode); if (docCode == null) { return(false); } docCode.EndDocument(); var writer = backend as IAssemblyWriter; if (writer == null) { throw new InvalidOperationException("Backend does not support assembly writing"); } #if false var path = Path.Combine(Environment.CurrentDirectory, assemblyName + ".dll"); writer.Write(path); assembly = Assembly.LoadFrom(path); #else writer.Write(stream); assembly = Assembly.Load(stream.GetBuffer()); #endif } return(true); }
protected override CilDocumentSyntax DoGenerate(CilDocumentSyntax docCode) { return(docCode .Class_().Public.Named(typeName) .Method() .Public.Static .Returning(docCode.Types.Import(resultType)) .Named(methodName) .BeginArgs() .Do(DefineArgs) .EndArgs() .BeginBody() .Do(il => codeBuilder(il, inputArgs)) .EndBody() .EndClass() ); }
protected override CilDocumentSyntax DoGenerate(CilDocumentSyntax docCode) { return docCode .Class_().Public.Named(typeName) .Method() .Public.Static .Returning(docCode.Types.Import(resultType)) .Named(methodName) .BeginArgs() .Do(DefineArgs) .EndArgs() .BeginBody() .Do(il => codeBuilder(il, inputArgs)) .EndBody() .EndClass() ; }
protected override CilDocumentSyntax DoGenerate(CilDocumentSyntax docCode) { return Generate(docCode); }
private CilDocumentSyntax GenerateImpl(PlannedClass entry, CilDocumentSyntax cil) { ClassExtendsSyntax wantBaseClass = cil.Class_() .Public .Named(entry.ClassName) ; var baseClassRef = cil.Types.Import(entry.BaseClass); ClassImplementsSyntax wantContract = wantBaseClass .Extends(baseClassRef); var baseCtor = entry.BaseClass.GetConstructor(Type.EmptyTypes); Ref<Methods> baseCtorRef; if (baseCtor != null) { baseCtorRef = cil.Methods.Import(baseCtor); } else { baseCtorRef = null; } foreach (Type c in entry.Contracts) { wantContract = wantContract.Implements(cil.Types.Import(c)); } ClassSyntax classCode = wantContract; classCode = classCode .Method() .Public.Instance .Returning(classCode.Types.Void) .Named(".ctor") .BeginArgs().EndArgs() .BeginBody() .Do(il => { if (baseCtorRef != null) { il = il .Ldarg(0) .Callvirt(baseCtorRef); } return il; }) .Ret() .EndBody() ; foreach (var method in entry.Methods) { WantArgsBase wantArgs = classCode.Method() .Private.Hidebysig.Newslot .Virtual.Final.Instance .Returning(classCode.Types.Import(method.ReturnType)) .Named(method.DeclaringType + "." + method.Name) .BeginArgs(); foreach (var parameter in method.GetParameters()) { wantArgs = wantArgs.Argument( classCode.Types.Import(parameter.ParameterType), wantArgs.Args.Generate(parameter.Name)); } var emit = wantArgs.EndArgs().BeginBody(); emit = emit.Override(emit.Methods.Import(method)); emit = EmitFactoryCode( emit, entry, method.ReturnType, !forceNonNullResult(method)); classCode = emit.Ret().EndBody(); } return classCode.EndClass(); }
private CilDocumentSyntax GenerateImpl(PlannedClass entry, CilDocumentSyntax cil) { ClassExtendsSyntax wantBaseClass = cil.Class_() .Public .Named(entry.ClassName) ; var baseClassRef = cil.Types.Import(entry.BaseClass); ClassImplementsSyntax wantContract = wantBaseClass .Extends(baseClassRef); var baseCtor = entry.BaseClass.GetConstructor(Type.EmptyTypes); Ref <Methods> baseCtorRef; if (baseCtor != null) { baseCtorRef = cil.Methods.Import(baseCtor); } else { baseCtorRef = null; } foreach (Type c in entry.Contracts) { wantContract = wantContract.Implements(cil.Types.Import(c)); } ClassSyntax classCode = wantContract; classCode = classCode .Method() .Public.Instance .Returning(classCode.Types.Void) .Named(".ctor") .BeginArgs().EndArgs() .BeginBody() .Do(il => { if (baseCtorRef != null) { il = il .Ldarg(0) .Callvirt(baseCtorRef); } return(il); }) .Ret() .EndBody() ; foreach (var method in entry.Methods) { WantArgsBase wantArgs = classCode.Method() .Private.Hidebysig.Newslot .Virtual.Final.Instance .Returning(classCode.Types.Import(method.ReturnType)) .Named(method.DeclaringType + "." + method.Name) .BeginArgs(); foreach (var parameter in method.GetParameters()) { wantArgs = wantArgs.Argument( classCode.Types.Import(parameter.ParameterType), wantArgs.Args.Generate(parameter.Name)); } var emit = wantArgs.EndArgs().BeginBody(); emit = emit.Override(emit.Methods.Import(method)); emit = EmitFactoryCode( emit, entry, method.ReturnType, !forceNonNullResult(method)); classCode = emit.Ret().EndBody(); } return(classCode.EndClass()); }
protected override CilDocumentSyntax DoGenerate(CilDocumentSyntax docCode) { return(Generate(docCode)); }
protected abstract CilDocumentSyntax DoGenerate(CilDocumentSyntax docCode);
public static CilDocumentSyntax Do(this CilDocumentSyntax @this, Pipe <CilDocumentSyntax> action) { return(action(@this)); }