public static string TransformMethodNameIfDuplicate(IDictionary <string, string> duplicateMethodNamesMap, string wcfMethodName, SeparatedSyntaxList <ParameterSyntax> wcfParameters)
        {
            // replace method name with unique method name if its a duplicate (i.e. overload)
            var methodId = MethodNamesMapper.MapToMethodId(wcfMethodName, wcfParameters.ToFullString());

            var modifiedMethodName = duplicateMethodNamesMap.ContainsKey(methodId)
                ? duplicateMethodNamesMap[methodId]
                : wcfMethodName;

            return(modifiedMethodName);
        }
        public static Dictionary <string, string> CreateMappings(IEnumerable <MethodDeclarationSyntax> wcfMethods)
        {
            // maps method IDs for duplicate (i.e. overload) methods with unique method names
            var namesMap = new Dictionary <string, string>();

            var duplicateMethodGroups = FindDuplicateMethodGroupsByName(wcfMethods);

            if (!duplicateMethodGroups.Any())
            {
                return(namesMap);
            }

            foreach (var duplicateMethods in duplicateMethodGroups)
            {
                var maxParametersCount      = duplicateMethods.Max(d => d.ParameterList.Parameters.Count);
                var parametersIndexes       = Enumerable.Range(0, maxParametersCount + 1);
                var unavailableMethodNames  = new HashSet <string>();
                var allParameterNamesCounts = GetAllParameterNamesCounts(duplicateMethods);

                // go through each duplicate named method starting with the ones with the lowest parameters usage count
                // and then add a unique name to each method based on its parameters as compared against the usage count of all others
                // ideally try to keep the method names as short as possible
                foreach (var parametersIndex in parametersIndexes)
                {
                    var filteredByParamCountMethods = duplicateMethods.Where(method => method.ParameterList.Parameters.Count == parametersIndex);

                    foreach (var method in filteredByParamCountMethods)
                    {
                        var methodName        = method.Identifier.ToFullString();
                        var defaultMethodName = methodName;

                        var parameters     = method.ParameterList.Parameters;
                        var parameterNames = GetParameterNames(parameters);
                        var methodId       = MethodNamesMapper.MapToMethodId(methodName, parameters.ToFullString());

                        // run through each method name assignment rule
                        if (AssignDefaultNameToFirstMethod(parameterNames, parametersIndex, defaultMethodName, unavailableMethodNames, namesMap, methodId))
                        {
                            continue;
                        }

                        if (AssignMethodNameUsingUniqueParameter(parameterNames, allParameterNamesCounts, defaultMethodName, unavailableMethodNames, namesMap, methodId))
                        {
                            continue;
                        }

                        AssignMethodNameUsingAnyParameters(parameterNames, allParameterNamesCounts, defaultMethodName, unavailableMethodNames, namesMap, methodId);
                    }
                }
            }

            return(namesMap);
        }
        private static MethodDeclarationSyntax FindWcfServiceMethodByMethodId(MethodDeclarationSyntax wcfClientMethod, IEnumerable <MethodDeclarationSyntax> wcfServiceMethods)
        {
            // find method by combo of method name + parameter names/types

            var clientMethodName = wcfClientMethod.Identifier.ValueText;
            var clientParameters = wcfClientMethod.ParameterList.Parameters;
            var clientMethodId   = MethodNamesMapper.MapToMethodId(clientMethodName, clientParameters.ToFullString());

            var wcfServiceMethod = wcfServiceMethods
                                   .SingleOrDefault(serviceMethod =>
            {
                var serviceMethodName  = serviceMethod.Identifier.ValueText;
                var serviceParams      = serviceMethod.ParameterList.Parameters;
                var serviceParameterId = MethodNamesMapper.MapToMethodId(serviceMethodName, serviceParams.ToFullString());

                return(serviceParameterId == clientMethodId);
            });

            return(wcfServiceMethod);
        }