private static CilDocumentSyntax Build(
     IDerivedBuilder<CilDocumentSyntax> builder,
     ILogging logging,
     CilDocumentSyntax context)
 {
     return builder.Build(logging, context);
 }
Esempio n. 2
0
 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;
        }
Esempio n. 4
0
        public CilDocumentSyntax Generate(CilDocumentSyntax docCode)
        {
            // Impl placeholder
            foreach (var plannedClass in plan)
            {
                docCode = GenerateImpl(plannedClass, docCode);
            }

            return(docCode);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
 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();
        }
Esempio n. 10
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());
        }
Esempio n. 11
0
 protected override CilDocumentSyntax DoGenerate(CilDocumentSyntax docCode)
 {
     return(Generate(docCode));
 }
Esempio n. 12
0
 protected abstract CilDocumentSyntax DoGenerate(CilDocumentSyntax docCode);
Esempio n. 13
0
 public static CilDocumentSyntax Do(this CilDocumentSyntax @this, Pipe <CilDocumentSyntax> action)
 {
     return(action(@this));
 }