Exemple #1
0
        /// <summary>Implements the visitor pattern for the function.</summary>
        /// <returns>The implemented visitor pattern.</returns>
        /// <param name="functionMetadata">The function metadata.</param>
        protected override EdmFunction VisitFunction(EdmFunction functionMetadata)
        {
            List <TypeUsage> typeUsageList = new List <TypeUsage>(functionMetadata.Parameters.Count);

            foreach (FunctionParameter parameter in functionMetadata.Parameters)
            {
                TypeUsage typeUsage = this.VisitTypeUsage(parameter.TypeUsage);
                typeUsageList.Add(typeUsage);
            }
            if (DataSpace.SSpace == functionMetadata.DataSpace)
            {
                EdmFunction function = (EdmFunction)null;
                if (this._metadata.TryGetFunction(functionMetadata.Name, functionMetadata.NamespaceName, typeUsageList.ToArray(), false, functionMetadata.DataSpace, out function) && function != null)
                {
                    return(function);
                }
            }
            else
            {
                IList <EdmFunction> functionOverloads;
                if (this._perspective.TryGetFunctionByName(functionMetadata.NamespaceName, functionMetadata.Name, false, out functionOverloads))
                {
                    bool        isAmbiguous;
                    EdmFunction edmFunction = FunctionOverloadResolver.ResolveFunctionOverloads(functionOverloads, (IList <TypeUsage>)typeUsageList, false, out isAmbiguous);
                    if (!isAmbiguous && edmFunction != null)
                    {
                        return(edmFunction);
                    }
                }
            }
            throw new ArgumentException(Strings.Cqt_Copier_FunctionNotFound((object)TypeHelpers.GetFullName(functionMetadata.NamespaceName, functionMetadata.Name)));
        }
        /// <summary>Implements the visitor pattern for the function.</summary>
        /// <returns>The implemented visitor pattern.</returns>
        /// <param name="functionMetadata">The function metadata.</param>
        protected override EdmFunction VisitFunction(EdmFunction functionMetadata)
        {
            var paramTypes = new List <TypeUsage>(functionMetadata.Parameters.Count);

            foreach (var funcParam in functionMetadata.Parameters)
            {
                var mappedParamType = VisitTypeUsage(funcParam.TypeUsage);
                paramTypes.Add(mappedParamType);
            }

            if (DataSpace.SSpace
                == functionMetadata.DataSpace)
            {
                EdmFunction foundFunc = null;
                if (_metadata.TryGetFunction(
                        functionMetadata.Name,
                        functionMetadata.NamespaceName,
                        paramTypes.ToArray(),
                        false /* ignoreCase */,
                        functionMetadata.DataSpace,
                        out foundFunc)
                    &&
                    foundFunc != null)
                {
                    return(foundFunc);
                }
            }
            else
            {
                // Find the function or function import.
                IList <EdmFunction> candidateFunctions;
                if (_perspective.TryGetFunctionByName(
                        functionMetadata.NamespaceName, functionMetadata.Name, /*ignoreCase:*/ false, out candidateFunctions))
                {
                    Debug.Assert(
                        null != candidateFunctions && candidateFunctions.Count > 0,
                        "Perspective.TryGetFunctionByName returned true with null/empty function result list");

                    bool isAmbiguous;
                    var  retFunc = FunctionOverloadResolver.ResolveFunctionOverloads(
                        candidateFunctions, paramTypes, /*isGroupAggregateFunction:*/ false, out isAmbiguous);
                    if (!isAmbiguous
                        &&
                        retFunc != null)
                    {
                        return(retFunc);
                    }
                }
            }

            throw new ArgumentException(
                      Strings.Cqt_Copier_FunctionNotFound(TypeHelpers.GetFullName(functionMetadata.NamespaceName, functionMetadata.Name)));
        }