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); }