private WantArgsBase DefineArgs(WantArgsBase wantArgs) { this.inputArgs = new Ref <Args> [argTypes.Length]; for (int i = 0; i != inputArgs.Length; ++i) { var arg = wantArgs.Args.Generate(argNames[i]).GetRef(); wantArgs = wantArgs.Argument(wantArgs.Types.Import(argTypes[i]), arg.Def); inputArgs[i] = arg; } return(wantArgs); }
private WantArgsBase DefineArgs(WantArgsBase wantArgs) { this.inputArgs = new Ref<Args>[argTypes.Length]; for (int i = 0; i != inputArgs.Length; ++i) { var arg = wantArgs.Args.Generate(argNames[i]).GetRef(); wantArgs = wantArgs.Argument(wantArgs.Types.Import(argTypes[i]), arg.Def); inputArgs[i] = arg; } return wantArgs; }
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()); }
public static WantArgsBase Do(this WantArgsBase @this, Pipe <WantArgsBase> action) { return(action(@this)); }