Example #1
0
        /// <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);
        }