Exemplo n.º 1
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public NewStructExpression(IOperand[] constructorArguments = null)
        {
            m_StatementScope = StatementScope.Current;

            m_StructType           = TypeTemplate.Resolve <TStruct>();
            m_ConstructorArguments = (constructorArguments ?? new IOperand[0]);

            if (m_ConstructorArguments.Length > 0)
            {
                var argumentTypes = m_ConstructorArguments.Select(arg => arg.OperandType).ToArray();
                m_Constructor = m_StructType.GetConstructor(argumentTypes);

                if (m_Constructor == null)
                {
                    throw new ArgumentException("Could not find constructor with specified argument types.");
                }

                foreach (var argument in m_ConstructorArguments.Reverse())
                {
                    m_StatementScope.Consume(argument);
                }
            }

            m_StatementScope.RegisterExpressionStatement(this);
        }
Exemplo n.º 2
0
    internal static string GenerateRecord(TypeTemplate template, TypeTemplate[] templates)
    {
        var cls = template.ClassName.Split('.');

        var nameSpace = string.Join(".", cls.Take(cls.Length - 1));
        var className = cls.Last();


        var rt = new StringBuilder();

        rt.AppendLine("using System;\r\nusing Esiur.Resource;\r\nusing Esiur.Core;\r\nusing Esiur.Data;\r\nusing Esiur.Net.IIP;");
        rt.AppendLine($"namespace { nameSpace} {{");

        if (template.Annotation != null)
        {
            rt.AppendLine($"[Annotation({ToLiteral(template.Annotation)})]");
        }

        rt.AppendLine($"[Public] public class {className} : IRecord {{");


        foreach (var p in template.Properties)
        {
            var ptTypeName = GetTypeName(p.ValueType, templates);
            rt.AppendLine($"public {ptTypeName} {p.Name} {{ get; set; }}");
            rt.AppendLine();
        }

        rt.AppendLine("\r\n}\r\n}");

        return(rt.ToString());
    }
Exemplo n.º 3
0
    internal static string GenerateEnum(TypeTemplate template, TypeTemplate[] templates)
    {
        var cls = template.ClassName.Split('.');

        var nameSpace = string.Join(".", cls.Take(cls.Length - 1));
        var className = cls.Last();

        var rt = new StringBuilder();

        rt.AppendLine("using System;\r\nusing Esiur.Resource;\r\nusing Esiur.Core;\r\nusing Esiur.Data;\r\nusing Esiur.Net.IIP;");
        rt.AppendLine($"namespace { nameSpace} {{");

        if (template.Annotation != null)
        {
            rt.AppendLine($"[Annotation({ToLiteral(template.Annotation)})]");
        }

        rt.AppendLine($"[Public] public enum {className} {{");

        rt.AppendLine(String.Join(",\r\n", template.Constants.Select(x => $"{x.Name}={x.Value}")));

        rt.AppendLine("\r\n}\r\n}");

        return(rt.ToString());
    }
Exemplo n.º 4
0
 public MemberTemplate(TypeTemplate template, byte index, string name, bool inherited)
 {
     Template  = template;
     Index     = index;
     Name      = name;
     Inherited = inherited;
 }
Exemplo n.º 5
0
 public EventTemplate(TypeTemplate template, byte index, string name, bool inherited, RepresentationType argumentType, string annotation = null, bool listenable = false)
     : base(template, index, name, inherited)
 {
     this.Annotation   = annotation;
     this.Listenable   = listenable;
     this.ArgumentType = argumentType;
 }
Exemplo n.º 6
0
            public void Emit(ILGenerator il, IOperand <int> lengthOperand)
            {
                lengthOperand.EmitTarget(il);
                lengthOperand.EmitLoad(il);

                il.Emit(OpCodes.Newarr, TypeTemplate.Resolve <TElement>());
            }
Exemplo n.º 7
0
            //-------------------------------------------------------------------------------------------------------------------------------------------------

            public override void DefineMemberBody()
            {
                var typedGetterDefinition = (GetterBodyDefinition as Action <IHappilMethodBody <T>, HappilArgument <TIndex1> >);
                var typedSetterDefinition = (SetterBodyDefinition as Action <IVoidHappilMethodBody, HappilArgument <TIndex1>, HappilArgument <T> >);

                using (TypeTemplate.CreateScope(
                           typeof(TypeTemplate.TIndex1), OwnerProperty.Declaration.GetIndexParameters()[0].ParameterType))
                {
                    if (typedGetterDefinition != null)
                    {
                        using ((GetterMethod as IHappilMember).CreateTypeTemplateScope())
                        {
                            using (GetterMethod.CreateBodyScope())
                            {
                                typedGetterDefinition(GetterMethod.GetMethodBody <T>(), new HappilArgument <TIndex1>(GetterMethod, 1));
                            }
                        }
                    }

                    if (typedSetterDefinition != null)
                    {
                        using ((SetterMethod as IHappilMember).CreateTypeTemplateScope())
                        {
                            using (SetterMethod.CreateBodyScope())
                            {
                                typedSetterDefinition(SetterMethod, new HappilArgument <TIndex1>(SetterMethod, 1), new HappilArgument <T>(SetterMethod, 2));
                            }
                        }
                    }
                }
            }
Exemplo n.º 8
0
            public void Emit(ILGenerator il, IOperand <T> left, IOperand <Type> right)
            {
                var typeConstant = (right as Constant <Type>);

                if (object.ReferenceEquals(typeConstant, null))
                {
                    throw new NotSupportedException("Cast type must be a constant type known in advance.");
                }

                var fromType = left.OperandType;
                var castType = TypeTemplate.Resolve(typeConstant.Value);

                left.EmitTarget(il);
                left.EmitLoad(il);

                if (fromType.IsValueType)
                {
                    il.Emit(OpCodes.Box, fromType);
                }
                else
                {
                    il.Emit(OpCodes.Isinst, castType);

                    if (castType.IsNullableValueType())
                    {
                        il.Emit(OpCodes.Unbox_Any, castType);
                    }
                }
            }
Exemplo n.º 9
0
        private void WriteReader(ClassTemplate classTemplate, ModelTransferObject model)
        {
            IOptions     modelOptions = this.Options.Get(model);
            TypeTemplate objectType   = Code.Type(model.Name, model.Namespace);

            if (model.Namespace != classTemplate.Namespace.Name && model.Namespace != null)
            {
                classTemplate.AddUsing(model.Namespace);
            }
            classTemplate.WithUsing("Newtonsoft.Json")
            //.WithUsing("Newtonsoft.Json.Linq")
            .WithUsing("System.IO");

            classTemplate.AddMethod("Load", objectType)
            .FormatName(modelOptions)
            .WithParameter(Code.Type("string"), "fileName")
            .Static()
            .Code.AddLine(Code.Return(Code.Method("Parse", Code.Local("File").Method("ReadAllText", Code.Local("fileName")))));

            classTemplate.AddMethod("Parse", objectType)
            .FormatName(modelOptions)
            .WithParameter(Code.Type("string"), "json")
            .Static()
            .Code.AddLine(Code.Return(Code.Local("JsonConvert").GenericMethod("DeserializeObject", objectType, Code.Local("json"))));
        }
Exemplo n.º 10
0
        private void CreateTypeFiles()
        {
            foreach (var solution in StepInput.SDProject.Solutions.Values)
            {
                var sdRepository = solution.Repositories.SingleOrDefault(r => r.TargetFx.Identifier == StepInput.CurrentTargetFx.Identifier);
                if (sdRepository != null)
                {
                    foreach (var sdNamespace in sdRepository.GetAllNamespaces())
                    {
                        foreach (var sdType in sdNamespace.Types)
                        {
                            ExecuteOnStepMessage(string.Format("{0}: {1}", StepInput.ChmStrings.CreateType, sdType.Name));

                            var typeHtmlFile = Path.Combine(StepInput.TmpPath, sdType.Guid + ".html");

                            var template = new TypeTemplate {
                                SDType = sdType, SDRepository = sdRepository
                            };

                            if (!sdType.IsClassDiagramEmpty())
                            {
                                sdType.GetClassDiagram().ToPng(Path.Combine(StepInput.TmpPath, "diagrams", sdType.Guid + ".png"));
                            }

                            File.WriteAllText(typeHtmlFile, template.TransformText());
                        }
                    }
                }
            }
        }
Exemplo n.º 11
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private void WriteParentFieldInitialization()
        {
            using (TypeTemplate.CreateScope <TypeTemplate.TField>(m_Parent.ClosureClass.TypeBuilder))
            {
                m_ParentField.AsOperand <TypeTemplate.TField>(m_ClosureInstanceReference).Assign(m_Parent.m_ClosureInstanceReference.CastTo <TypeTemplate.TField>());
            }
        }
Exemplo n.º 12
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        internal override IDisposable CreateTypeTemplateScope()
        {
            var reflectionCache = DelegateShortcuts.GetReflectionCache(m_Declaration.EventHandlerType);

            return(TypeTemplate.CreateScope(
                       typeof(TypeTemplate.TEventHandler), m_Declaration.EventHandlerType,
                       typeof(TypeTemplate.TEventArgs), reflectionCache.Invoke.GetParameters()[1].ParameterType));
        }
Exemplo n.º 13
0
 public FunctionTemplate(TypeTemplate template, byte index, string name, bool inherited, ArgumentTemplate[] arguments, RepresentationType returnType, string annotation = null)
     : base(template, index, name, inherited)
 {
     //this.IsVoid = isVoid;
     this.Arguments  = arguments;
     this.ReturnType = returnType;
     this.Annotation = annotation;
 }
Exemplo n.º 14
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public HappilOperand <TCast> CastTo <TCast>()
        {
            return(new HappilBinaryExpression <T, Type, TCast>(
                       OwnerMethod,
                       @operator: new BinaryOperators.OperatorCastOrThrow <T>(),
                       left: this,
                       right: new HappilConstant <Type>(TypeTemplate.Resolve <TCast>())));
        }
        public void TypeTemplateTest()
        {
            var type     = typeof(IDictionary <string, Func <object, DateTime, bool, Task <Guid> > >);
            var template = new TypeTemplate(type);
            var name     = template.ToString();

            Assert.Equal("System.Collections.Generic.IDictionary<System.String,System.Func<System.Object,System.DateTime,System.Boolean,System.Threading.Tasks.Task<System.Guid>>>", name);
        }
Exemplo n.º 16
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        protected override Type[] BuildTemplateActualTypePairs()
        {
            var pairs = new Type[m_ArgumentTypes.Length * 2];

            TypeTemplate.BuildArgumentsTypePairs(m_ArgumentTypes, pairs, arrayStartIndex: 0);

            return(pairs);
        }
 protected override void BuildArguments(TypeTemplate <Employee> config)
 {
     config
     .AddAllProperties().Except("DontLogMe", "Reports")
     .AddArgument(x => x.Company.Id)
     .AddArgument(x => x.Id)
     .AddArgument(x => x.SomeDate ?? DateTime.MinValue);
 }
Exemplo n.º 18
0
        public void Write(GenericTypeTemplate template, IOutputCache output)
        {
            TypeTemplate keyType   = template.Types.First();
            TypeTemplate valueType = template.Types.Second();

            if (keyType.Name is "string" or "number")
            {
                output.Add($"{{ [key: {keyType.Name}]: {valueType.Name}; }}");
            }
Exemplo n.º 19
0
        //-------------------------------------------------------------------------------------------------------------------------------------------------

        private void WriteReturnValueCheck(MethodDecorationBuilder decoration)
        {
            decoration.OnReturnValue((w, retVal) => {
                using (TypeTemplate.CreateScope <TypeTemplate.TArgument>(m_ParameterInfo.ParameterType))
                {
                    WriteArgumentOrCollectionItemCheck(w, retVal.CastTo <TypeTemplate.TArgument>(), isOutput: true);
                }
            });
        }
Exemplo n.º 20
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public IDisposable CreateTypeTemplateScope()
        {
            if (m_TemplateActualTypePairs == null)
            {
                m_TemplateActualTypePairs = BuildTemplateActualTypePairs();
            }

            return(TypeTemplate.CreateScope(m_TemplateActualTypePairs));
        }
Exemplo n.º 21
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private Delegate CreateFactoryMethodDelegate(MethodInfo factoryMethod)
        {
            var parameters             = factoryMethod.GetParameters();
            var openDelegateType       = s_DelegatePrototypesByArgumentCount[parameters.Length];
            var delegateTypeParameters = parameters.Select(p => TypeTemplate.Resolve(p.ParameterType)).Concat(new[] { factoryMethod.ReturnType });
            var closedDelegateType     = openDelegateType.MakeGenericType(delegateTypeParameters.ToArray());

            return(Delegate.CreateDelegate(closedDelegateType, factoryMethod));
        }
Exemplo n.º 22
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        //internal void MakeInstanceMethod()
        //{
        //	var anonymousMethodFactory = (m_MethodFactory as AnonymousMethodFactory);

        //	if ( anonymousMethodFactory == null )
        //	{
        //		throw new InvalidOperationException("Method modifiers are mutable only for anonymous methods.");
        //	}

        //	anonymousMethodFactory.ChangeMethodAttributes(isStatic: false);
        //}

        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        //internal void HoistInClosure(ClosureDefinition closure)
        //{
        //	var anonymousMethodFactory = (m_MethodFactory as AnonymousMethodFactory);

        //	if ( anonymousMethodFactory == null )
        //	{
        //		throw new InvalidOperationException("Only anonymous method can be moved to a closure class.");
        //	}

        //	base.OwnerClass.MoveMember(this, destination: closure.ClosureClass);
        //	base.OwnerClass = closure.ClosureClass;

        //	anonymousMethodFactory.MethodMovedToClosure(closure.ClosureClass);

        //	m_Writers.Clear();
        //	m_Closure = closure;
        //}

        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        internal override IDisposable CreateTypeTemplateScope()
        {
            if (m_CachedTemplateTypePairs == null)
            {
                m_CachedTemplateTypePairs = Signature.BuildTemplateTypePairs();
            }

            return(TypeTemplate.CreateScope(m_CachedTemplateTypePairs));
        }
Exemplo n.º 23
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private void WriteCaptureFieldInitialization(OperandCapture capture)
        {
            using (TypeTemplate.CreateScope <TypeTemplate.TField>(capture.OperandType))
            {
                if (capture.SourceOperand.ShouldInitializeHoistedField)
                {
                    capture.HoistedField.AsOperand <TypeTemplate.TField>(m_ClosureInstanceReference).Assign(capture.SourceOperand.CastTo <TypeTemplate.TField>());
                }
            }
        }
Exemplo n.º 24
0
        //-------------------------------------------------------------------------------------------------------------------------------------------------

        private void WriteArgumentInputCheck(MethodDecorationBuilder decoration)
        {
            decoration.OnBefore(w => {
                using (TypeTemplate.CreateScope <TypeTemplate.TArgument>(m_ParameterInfo.ParameterType))
                {
                    var argument = w.Argument <TypeTemplate.TArgument>(m_ParameterInfo.Position + 1);
                    WriteArgumentOrCollectionItemCheck(w, argument, isOutput: false);
                }
            });
        }
Exemplo n.º 25
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        protected AnonymousDelegateOperand(ClassType ownerClass, Type[] argumentTypes, Type returnType)
        {
            m_OwnerClass     = ownerClass;
            m_HomeScopeBlock = StatementScope.Current.StatementBlock;
            m_Statements     = new StatementBlock();
            m_Signature      = new MethodSignature(
                isStatic: true,
                isPublic: false,
                argumentTypes: argumentTypes.Select(TypeTemplate.Resolve).ToArray(),
                returnType: returnType != null ? TypeTemplate.Resolve(returnType) : null);
        }
Exemplo n.º 26
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public IHappilOperand <TObject> New <TObject>(params IHappilOperand[] constructorArguments)
        {
            if (TypeTemplate.Resolve <TObject>().IsValueType)
            {
                return(new NewStructExpression <TObject>(constructorArguments));
            }
            else
            {
                return(new NewObjectExpression <TObject>(constructorArguments));
            }
        }
Exemplo n.º 27
0
            //-------------------------------------------------------------------------------------------------------------------------------------------------

            protected override IDisposable CreateTemplateScope(MethodInfo method)
            {
                var parameterTypes    = method.GetParameters().Select(p => p.ParameterType).ToArray();
                var templateTypePairs = new Type[2 * (1 + parameterTypes.Length)];

                templateTypePairs[0] = typeof(TypeTemplate.TReturn);
                templateTypePairs[1] = method.ReturnType;

                TypeTemplate.BuildArgumentsTypePairs(parameterTypes, templateTypePairs, arrayStartIndex: 2);
                return(TypeTemplate.CreateScope(templateTypePairs));
            }
        public void Should_build_argument_from_property_with_method_Call()
        {
            var typeTemplate = new TypeTemplate <Employee>();

            typeTemplate.AddArgument(x => x.Company.AsJson());

            var typeTemplateModel = typeTemplate.GetModel();

            typeTemplateModel.Arguments.Single().Name.Should().Be("CompanyAsJson");
            typeTemplateModel.Arguments.Single().Assignment.Should().Be("$this.Company.AsJson()");
        }
        public void Should_build_argument_from_property_with_datetime_coaless()
        {
            var typeTemplate = new TypeTemplate <Employee>();

            typeTemplate.AddArgument(x => (x.SomeDate ?? DateTime.MinValue));

            var typeTemplateModel = typeTemplate.GetModel();

            typeTemplateModel.Arguments.Single().Name.Should().Be("SomeDate");
            typeTemplateModel.Arguments.Single().Assignment.Should().Be("$this.SomeDate ?? DateTime.MinValue");
        }
        public void Should_build_argument_from_property_with_null_coaless()
        {
            var typeTemplate = new TypeTemplate <Employee>();

            typeTemplate.AddArgument(x => (x.Id ?? ""));

            var typeTemplateModel = typeTemplate.GetModel();

            typeTemplateModel.Arguments.Single().Assignment.Should().Be("Id");
            typeTemplateModel.Arguments.Single().Assignment.Should().Be("$this.Id ?? \"\"");
        }