Exemple #1
0
        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;
        }
Exemple #2
0
        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);
 }