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); }