public IAstMethodReference ResolveMethodGroup(AstMethodGroup group, IAstElement target, IList<IAstExpression> arguments) { var candidates = GetCandidates(group, target, arguments) .GroupBy(c => c.Item2) .OrderBy(g => g.Key) .First() .ToArray(); if (candidates.Length > 1) throw new NotImplementedException(string.Format("OverloadResolver: Ambiguous best match found for {0}: {1}.", @group.Name, string.Join(", ", candidates.AsEnumerable()))); if (candidates.Length == 0) throw new NotImplementedException("OverloadResolver: No match found for " + @group.Name); return candidates[0].Item1; }
private IEnumerable<Tuple<IAstMethodReference, int>> GetCandidates(AstMethodGroup @group, IAstElement target, IList<IAstExpression> arguments) { // little bit of cheating for now foreach (var method in @group.Methods) { var reflected = method as AstReflectedMethod; if (reflected == null) throw new NotImplementedException("OverloadResolver: Reference type " + method.GetType() + " is not yet supported."); var parameterTypes = reflected.Method.GetParameters().Select(p => p.ParameterType); var argumentTypes = arguments.Select(a => ((AstReflectedType)a.ExpressionType).ActualType); if (method.Location == MethodLocation.Extension) argumentTypes = new[] {((AstReflectedType)((IAstExpression)target).ExpressionType).ActualType}.Concat(argumentTypes); var match = GetOrMakeMatch(reflected, parameterTypes, argumentTypes); if (match != null) yield return match; } }
protected virtual void AppendMethodGroup(StringBuilder builder, AstMethodGroup methodGroup) { builder.Append(methodGroup); }