Example #1
0
        PluginResult NewCallOpNode(ref ExpressionNode Node)
        {
            var OpNode = Node as OpExpressionNode;
            var Op     = OpNode.Operator;
            var Ch     = OpNode.Children;

            var Ok = true;

            for (var i = 1; i < Ch.Length; i++)
            {
                if (!(Ch[i] is ConstExpressionNode))
                {
                    Ok = false;
                    break;
                }
            }

            // ------------------------------------------------------------------------------------
            var IdCh0 = Ch[0] as IdExpressionNode;

            if (IdCh0 != null && IdCh0.Identifier is Function && Ok)
            {
                var Func     = IdCh0.Identifier as Function;
                var FuncType = Func.TypeOfSelf.RealId as TypeOfFunction;
                var RetType  = FuncType.RetType;
                var Name     = Func.AssemblyNameWithoutDecorations;
                var RetValue = (ConstValue)null;

                if (Name != null && Name.StartsWith("_System_Math_"))
                {
                    if (Ch.Length == 2)
                    {
                        var Param0Node   = Ch[1] as ConstExpressionNode;
                        var Param0RealId = Param0Node.Type.RealId;
                        var Param0Value  = Param0Node.Value;

                        if (!(Param0RealId is NumberType))
                        {
                            return(PluginResult.Succeeded);
                        }

                        if (Name == "_System_Math_Abs")
                        {
                            RetValue = Param0Value;
                            if (Param0RealId is FloatType)
                            {
                                var FractionValue = Param0Value as DoubleValue;
                                FractionValue.Value = Math.Abs(FractionValue.Value);
                            }
                            else
                            {
                                var IntegerValue = Param0Value as IntegerValue;
                                IntegerValue.Value = BigInteger.Abs(IntegerValue.Value);
                            }
                        }
                        else if (Name == "_System_Math_Sqrt")
                        {
                            if (Param0RealId is FloatType)
                            {
                                RetValue = Param0Value;
                                var FractionValue = Param0Value as DoubleValue;
                                FractionValue.Value = Math.Sqrt(FractionValue.Value);
                            }
                            else
                            {
                                var IntegerValue = Param0Value as IntegerValue;
                                RetValue = new DoubleValue(Math.Sqrt((double)IntegerValue.Value));
                            }
                        }
                        else if (Name == "_System_Math_Sign")
                        {
                            RetValue = Param0Value;
                            if (Param0RealId is FloatType)
                            {
                                var FractionValue = Param0Value as DoubleValue;
                                FractionValue.Value = Math.Sign(FractionValue.Value);
                            }
                            else
                            {
                                var IntegerValue = Param0Value as IntegerValue;
                                if (IntegerValue.Value < 0)
                                {
                                    IntegerValue.Value = -1;
                                }
                                else if (IntegerValue.Value > 0)
                                {
                                    IntegerValue.Value = 1;
                                }
                                else
                                {
                                    IntegerValue.Value = 0;
                                }
                            }
                        }
                        else if (Name == "_System_Math_Log")
                        {
                            RetValue = new DoubleValue(Math.Log(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Log2")
                        {
                            RetValue = new DoubleValue(Math.Log(Param0Value.Double, 2));
                        }
                        else if (Name == "_System_Math_Log10")
                        {
                            Param0Value = new DoubleValue(Math.Log10(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Exp")
                        {
                            RetValue = new DoubleValue(Math.Exp(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Pow2")
                        {
                            Param0Value = new DoubleValue(Math.Pow(2, Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Sin")
                        {
                            RetValue = new DoubleValue(Math.Sin(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Cos")
                        {
                            RetValue = new DoubleValue(Math.Cos(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Tan")
                        {
                            RetValue = new DoubleValue(Math.Tan(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Asin")
                        {
                            RetValue = new DoubleValue(Math.Asin(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Acos")
                        {
                            RetValue = new DoubleValue(Math.Acos(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Atan")
                        {
                            RetValue = new DoubleValue(Math.Atan(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Sinh")
                        {
                            RetValue = new DoubleValue(Math.Sinh(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Cosh")
                        {
                            RetValue = new DoubleValue(Math.Cosh(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Tanh")
                        {
                            RetValue = new DoubleValue(Math.Tanh(Param0Value.Double));
                        }
                        else if (Name == "_System_Math_Asinh")
                        {
                            var X = Param0Value.Double;
                            RetValue = new DoubleValue(Math.Log(X + Math.Sqrt(X * X + 1)));
                        }
                        else if (Name == "_System_Math_Acosh")
                        {
                            var X = Param0Value.Double;
                            RetValue = new DoubleValue(Math.Log(X + Math.Sqrt(X * X - 1)));
                        }
                        else if (Name == "_System_Math_Atanh")
                        {
                            var X = Param0Value.Double;
                            RetValue = new DoubleValue(0.5d * Math.Log((1 + X) / (1 - X)));
                        }
                    }
                    else if (Ch.Length == 3)
                    {
                        var Param0Node   = Ch[1] as ConstExpressionNode;
                        var Param0RealId = Param0Node.Type.RealId;
                        var Param0Value  = Param0Node.Value;

                        var Param1Node   = Ch[2] as ConstExpressionNode;
                        var Param1RealId = Param1Node.Type.RealId;
                        var Param1Value  = Param1Node.Value;

                        if (!(Param0RealId is NumberType && Param1RealId is NumberType))
                        {
                            return(PluginResult.Succeeded);
                        }

                        if (Name == "_System_Math_Pow")
                        {
                            var X = Param0Value.Double;
                            var Y = Param1Value.Double;
                            RetValue = new DoubleValue(Math.Pow(X, Y));
                        }
                        else if (Name == "_System_Math_Log")
                        {
                            var X = Param0Value.Double;
                            var Y = Param1Value.Double;
                            RetValue = new DoubleValue(Math.Log(X, Y));
                        }
                        else if (Name == "_System_Math_Atan2")
                        {
                            var X = Param0Value.Double;
                            var Y = Param1Value.Double;
                            RetValue = new DoubleValue(Math.Atan2(X, Y));
                        }
                    }
                }

                if (RetValue != null)
                {
                    Node = RetValue.ToExpression(Parent, RetType, Node.Code);
                    return(Node == null ? PluginResult.Failed : PluginResult.Ready);
                }
            }

            return(PluginResult.Succeeded);
        }