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