Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 3
0
        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());
        }
Ejemplo n.º 4
0
 public static WantArgsBase Do(this WantArgsBase @this, Pipe <WantArgsBase> action)
 {
     return(action(@this));
 }