Beispiel #1
0
        static ArgumentSignatureMatch Match(IList <FunctionArgumentSignature> argumentSignatures, IList <Expression> arguments)
        {
            int count = argumentSignatures.Count;

            if (count != arguments.Count)
            {
                return(ArgumentSignatureMatch.None);
            }

            bool exactMatch = true;

            for (int i = 0; i < count; i++)
            {
                FunctionArgumentSignature argumentSignature = argumentSignatures[i];
                Expression argument = arguments[i];

                if (argumentSignature.PassByReference != (argument is VariableReference))
                {
                    return(ArgumentSignatureMatch.None);
                }

                if (argumentSignature.DataType != argument.ResultType)
                {
                    exactMatch = false;
                    if (argumentSignature.PassByReference ||
                        !(argumentSignature.DataType == DataType.Real &&
                          argument.ResultType == DataType.Integer))
                    {
                        return(ArgumentSignatureMatch.None);
                    }
                }
            }

            return(exactMatch ? ArgumentSignatureMatch.Exact : ArgumentSignatureMatch.Compatible);
        }
        internal static FunctionSignature Read(MethodInfo method)
        {
            // check whether the method has a FunctionAttribute
            FunctionAttribute attribute = ReflectionUtilities.GetFirstAttribute <FunctionAttribute>(method, false);

            if (attribute == null)
            {
                return(null);
            }

            // get the result type of the function
            DataType resultType;
            Type     returnType = method.ReturnType;

            if (returnType == typeof(void))
            {
                resultType = DataType.None;
            }
            else
            {
                resultType = DataTypes.GetDataType(returnType);
                if (resultType == DataType.None)
                {
                    return(null);
                }
            }

            // get the function arguments
            ParameterInfo[] parameterInfos             = method.GetParameters();
            List <FunctionArgumentSignature> arguments = new List <FunctionArgumentSignature>(parameterInfos.Length);

            foreach (ParameterInfo parameterInfo in parameterInfos)
            {
                FunctionArgumentSignature argument = FunctionArgumentSignature.Read(parameterInfo);
                if (argument != null)
                {
                    arguments.Add(argument);
                }
                else
                {
                    return(null);
                }
            }

            return(new FunctionSignature(method, attribute.Name, resultType, new ReadOnlyCollection <FunctionArgumentSignature>(arguments)));
        }