/// <summary> /// Match the parameters of the methodsymbol with the parameters of the method candidates /// </summary> /// <param name="symbol">The current method symbol</param> /// <param name="candidates">The method candidates</param> /// <returns>A list of matching members</returns> private (IEnumerable <IBaseConfigModel> matchedCandidates, Dictionary <Member, List <ParameterMatch> > parameterMatches) MatchMethodParameters(IMethodSymbol symbol, IEnumerable <IBaseConfigModel> candidates) { var matches = new List <IBaseConfigModel>(); var parameterMatches = new Dictionary <Member, List <ParameterMatch> >(); foreach (Member candidate in candidates) { var componentName = ((Component)candidate.Parent).Name; var parameterSymbols = symbol.Parameters; // If no parameters are defined, match is valid by default. if (candidate.Parameters.Count == 0) { matches.Add(candidate); } else { var methodParameterMatch = true; foreach (var parameter in candidate.Parameters) { var hasParameterMatch = false; foreach (var parameterSymbol in parameterSymbols) { var currentParameterMatch = SymbolMatcher.MatchMethodSymbolParameter(parameterSymbol, parameter, componentName); hasParameterMatch |= currentParameterMatch; if (currentParameterMatch && base.IsCustomAndParent(parameter.DataType, ((Component)candidate.Parent).Name)) { // add custom types to parametermatches, for easier mapping later on. if (!parameterMatches.ContainsKey(candidate)) { parameterMatches.Add(candidate, new List <ParameterMatch>()); } parameterMatches[candidate].Add(new ParameterMatch() { Parameter = parameter, ParameterSymbol = parameterSymbol }); } } methodParameterMatch &= hasParameterMatch; } if (methodParameterMatch) { matches.Add(candidate); } } } return(matches, parameterMatches); }