Ejemplo n.º 1
0
        public void VisitApplication(TypedExpressions.Application d)
        {
            d.Left.AcceptVisitor(this);
            d.Right.AcceptVisitor(this);

            var functionType = typeConverter.Convert(d.LeftType);
            var callMethod = typeof(IFunction<,>).GetMethod(Constants.CallMethodName);

            body.Emit(OpCodes.Callvirt, TypeBuilder.GetMethod(functionType, callMethod));
        }
Ejemplo n.º 2
0
        public void VisitComposition(TypedExpressions.Composition d)
        {
            d.Right.AcceptVisitor(this);
            d.Left.AcceptVisitor(this);

            var leftType = typeConverter.Convert(d.LeftType);
            var middleType = typeConverter.Convert(d.MiddleType);
            var rightType = typeConverter.Convert(d.RightType);

            var defCtor = typeof(CompositeFunction<,,>).GetConstructors()[0];
            var ctor = TypeBuilder.GetConstructor(typeof(CompositeFunction<,,>).MakeGenericType(leftType, middleType, rightType), defCtor);

            body.Emit(OpCodes.Newobj, ctor);
        }
Ejemplo n.º 3
0
        public void VisitOutr(TypedExpressions.Outr d)
        {
            var leftType = typeConverter.Convert(d.LeftType);
            var rightType = typeConverter.Convert(d.RightType);

            var defCtor = typeof(OutrFunction<,>).GetConstructors()[0];
            var ctor = TypeBuilder.GetConstructor(typeof(OutrFunction<,>).MakeGenericType(leftType, rightType), defCtor);

            body.Emit(OpCodes.Newobj, ctor);
        }
Ejemplo n.º 4
0
        public void VisitIdentity(TypedExpressions.Identity d)
        {
            var type = typeConverter.Convert(d.Type);

            var defCtor = typeof(IdentityFunction<>).GetConstructors()[0];
            var ctor = TypeBuilder.GetConstructor(typeof(IdentityFunction<>).MakeGenericType(type), defCtor);

            body.Emit(OpCodes.Newobj, ctor);
        }
Ejemplo n.º 5
0
 public void VisitVariable(TypedExpressions.Variable d)
 {
 }
Ejemplo n.º 6
0
 public void VisitApplication(TypedExpressions.Application d)
 {
     d.Left.AcceptVisitor(this);
     d.Right.AcceptVisitor(this);
 }
Ejemplo n.º 7
0
 public void VisitAbstraction(TypedExpressions.Abstraction d)
 {
     d.PointFreeExpression.AcceptVisitor(this);
 }
Ejemplo n.º 8
0
        public void VisitUncurry(TypedExpressions.Uncurried d)
        {
            d.Function.AcceptVisitor(this);

            var first = typeConverter.Convert(d.First);
            var second = typeConverter.Convert(d.Second);
            var output = typeConverter.Convert(d.Output);

            var defCtor = typeof(UncurriedFunction<,,>).GetConstructors()[0];
            var ctor = TypeBuilder.GetConstructor(typeof(UncurriedFunction<,,>).MakeGenericType(first, second, output), defCtor);

            body.Emit(OpCodes.Newobj, ctor);
        }
Ejemplo n.º 9
0
 public void VisitOutl(TypedExpressions.Outl d)
 {
 }
Ejemplo n.º 10
0
 public void VisitInr(TypedExpressions.Inr d)
 {
 }
Ejemplo n.º 11
0
 public void VisitInl(TypedExpressions.Inl d)
 {
 }
Ejemplo n.º 12
0
 public void VisitIdentity(TypedExpressions.Identity d)
 {
 }
Ejemplo n.º 13
0
 public void VisitConst(TypedExpressions.Const d)
 {
     d.Value.AcceptVisitor(this);
 }
Ejemplo n.º 14
0
 public void VisitComposition(TypedExpressions.Composition d)
 {
     d.Left.AcceptVisitor(this);
     d.Right.AcceptVisitor(this);
 }
Ejemplo n.º 15
0
 public void VisitCase(TypedExpressions.Case d)
 {
     d.Left.AcceptVisitor(this);
     d.Right.AcceptVisitor(this);
 }
Ejemplo n.º 16
0
        public void VisitSplit(TypedExpressions.Split d)
        {
            d.Left.AcceptVisitor(this);
            d.Right.AcceptVisitor(this);

            var inputType = typeConverter.Convert(d.InputType);
            var leftType = typeConverter.Convert(d.LeftType);
            var rightType = typeConverter.Convert(d.RightType);

            var defCtor = typeof(SplitFunction<,,>).GetConstructors()[0];
            var ctor = TypeBuilder.GetConstructor(typeof(SplitFunction<,,>).MakeGenericType(inputType, leftType, rightType), defCtor);

            body.Emit(OpCodes.Newobj, ctor);
        }
Ejemplo n.º 17
0
        public void VisitSynonym(TypedExpressions.DataSynonym d)
        {
            var method = runtimeContainer.Resolve(d.Identifier);

            if (d.TypeParameters.Any())
            {
                var typeParameters = new Type[d.TypeParameters.Count];

                for (int i = 0; i < typeParameters.Length; i++)
                {
                    typeParameters[i] = typeConverter.Convert(d.TypeParameters.Values.ElementAt(i));
                }

                var genericMethod = method.MakeGenericMethod(typeParameters);

                body.Emit(OpCodes.Call, genericMethod);
            }
            else
            {
                body.Emit(OpCodes.Call, method);
            }
        }
Ejemplo n.º 18
0
 public void VisitOutr(TypedExpressions.Outr d)
 {
 }
Ejemplo n.º 19
0
 public void VisitVariable(TypedExpressions.Variable d)
 {
     throw new CompilerException(string.Format(ErrorMessages.UnexpectedVariable, d.Name));
 }
Ejemplo n.º 20
0
 public void VisitSplit(TypedExpressions.Split d)
 {
     d.Left.AcceptVisitor(this);
     d.Right.AcceptVisitor(this);
 }
Ejemplo n.º 21
0
 public void VisitSynonym(TypedExpressions.DataSynonym d)
 {
 }
Ejemplo n.º 22
0
 public void VisitUncurry(TypedExpressions.Uncurried d)
 {
     d.Function.AcceptVisitor(this);
 }
Ejemplo n.º 23
0
        public void VisitConst(TypedExpressions.Const d)
        {
            d.Value.AcceptVisitor(this);

            var dom = typeConverter.Convert(d.InputType);
            var cod = typeConverter.Convert(d.OutputType);

            var defCtor = typeof(ConstantFunction<,>).GetConstructors()[0];
            var ctor = TypeBuilder.GetConstructor(typeof(ConstantFunction<,>).MakeGenericType(dom, cod), defCtor);

            body.Emit(OpCodes.Newobj, ctor);
        }
Ejemplo n.º 24
0
 public void VisitAbstraction(TypedExpressions.Abstraction d)
 {
     d.Body.AcceptVisitor(this);
     d.PointFreeExpression = VariableElimination.Visit(d.Body, d.Variable, d.VariableType, container);
 }