private BindingTarget MakeSuccessfulBindingTarget(ApplicableCandidate result, List<ApplicableCandidate> potentialCandidates, NarrowingLevel level, CandidateSet targetSet) { return new BindingTarget( _methodName, _actualArguments.VisibleCount, result.Method, level, GetRestrictedArgs(result, potentialCandidates, targetSet.Arity) ); }
private void AddTarget(MethodCandidate target) { int count = target.ParameterCount; CandidateSet set; if (!_candidateSets.TryGetValue(count, out set)) { set = new CandidateSet(count); _candidateSets[count] = set; } set.Add(target); }
internal BindingTarget MakeBindingTarget(CandidateSet targetSet) { List<CallFailure> failures = null; List<CallFailure> nameBindingFailures = null; // get candidates whose named arguments can be bind to the parameters: var potential = EnsureMatchingNamedArgs(targetSet.Candidates, ref nameBindingFailures); if (potential.Count == 0) { return MakeFailedBindingTarget(nameBindingFailures.ToArray()); } // go through all available narrowing levels selecting candidates. for (NarrowingLevel level = _minLevel; level <= _maxLevel; level++) { if (failures != null) { failures.Clear(); } // only allow candidates whose non-collapsed arguments are convertible to the parameter types: var applicable = SelectCandidatesWithConvertibleArgs(potential, level, ref failures); if (applicable.Count == 0) { continue; } else if (applicable.Count == 1) { return MakeSuccessfulBindingTarget(applicable[0], potential, level, targetSet); } // see if collapsed arguments be converted to the corresponding element types: applicable = SelectCandidatesWithConvertibleCollapsedArgs(applicable, level, ref failures); if (applicable.Count == 0) { continue; } else if (applicable.Count == 1) { return MakeSuccessfulBindingTarget(applicable[0], potential, level, targetSet); } var bestCandidate = SelectBestCandidate(applicable, level); if (bestCandidate != null) { return MakeSuccessfulBindingTarget(bestCandidate, potential, level, targetSet); } else { return MakeAmbiguousBindingTarget(applicable); } } Debug.Assert(failures != null); if (nameBindingFailures != null) { failures.AddRange(nameBindingFailures); } return MakeFailedBindingTarget(failures.ToArray()); }
private CandidateSet BuildExpandedTargetSet(int count) { var set = new CandidateSet(count); if (_paramsCandidates != null) { foreach (MethodCandidate maker in _paramsCandidates) { MethodCandidate target = maker.MakeParamsExtended(count, _argNames); if (target != null) { set.Add(target); } } } return set; }