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