private static async Task <IEnumerable <MemberDeclarationSyntax> > CreateMethods(string controllerName, MethodDeclarationSyntax wcfMethod, string wcfClassName, IDictionary <string, string> duplicateMethodNamesMap, bool isAsmx) { var members = new List <MemberDeclarationSyntax>(); var wcfMethodName = wcfMethod.Identifier.ValueText; var wcfParameters = wcfMethod.ParameterList.Parameters; // create method & parameter names var methodName = DuplicateMethodNamesGenerator.TransformMethodNameIfDuplicate(duplicateMethodNamesMap, wcfMethodName, wcfParameters); var parameters = ServiceCodeParametersGenerator.CreateParameters(wcfParameters); parameters = ServiceCodeMultipleComplexTypesGenerator.TransformMultipleComplexTypeParameters(parameters, methodName); // create service type for method comment var serviceType = ServiceNamesMapper.GetServiceTypeName(isAsmx); // create http verb var httpVerb = CreateHttpVerb(wcfMethodName, parameters); // create route name var routeUriTemplate = ServiceNamesMapper.MapToRouteUriTemplate(controllerName, methodName); // create return type var wcfReturnType = wcfMethod .ReturnType .NormalizeWhitespace() .ToFullString(); var returnType = ServiceCodeOutKeywordGenerator.TransformOutKeywordReturnType(wcfReturnType, wcfParameters, methodName); // create method block arguments var arguments = CreateWcfArguments(wcfParameters); arguments = ServiceCodeMultipleComplexTypesGenerator.TransformMultipleComplexTypeArguments(arguments, wcfParameters, methodName); // create method block var block = CreateMethodBlock(wcfClassName, wcfMethodName, arguments, returnType); block = ServiceCodeOutKeywordGenerator.TransformBlockWithOutKeyword(block, wcfParameters, arguments, methodName); // create new method var method = await CreateMethodDeclaration(methodName, httpVerb, routeUriTemplate, parameters, block, returnType, serviceType); // add nested class model if have multiple complex params var className = ComplexTypeNamesMapper.MapToServiceComplexClassType(methodName); var complexClass = await MultipleComplexTypesGenerator.CreateClassFromComplexTypes(wcfParameters, className); if (complexClass != null) { complexClass = ServiceCodeOutKeywordGenerator.TransformComplexClassWithOutKeyword(complexClass, wcfParameters, wcfReturnType); members.Add(complexClass); } // add new method members.Add(method); return(members); }
public static string TransformOutKeywordReturnType(string wcfReturnType, SeparatedSyntaxList <ParameterSyntax> wcfParameters, string wcfMethodName) { var isVoidReturnType = wcfReturnType == "void"; if (!OutKeywordGenerator.AnyHaveOutKeyword(wcfParameters) || isVoidReturnType) { return(wcfReturnType); } var complexVariableName = ComplexTypeNamesMapper.MapToServiceComplexClassType(wcfMethodName); var returnType = complexVariableName; return(returnType); }
public static SeparatedSyntaxList <ParameterSyntax> TransformMultipleComplexTypeParameters(SeparatedSyntaxList <ParameterSyntax> originalParameters, string methodName) { // handle if parameters have more two or more (i.e. multiple) complex types var complexParameters = MultipleComplexTypesGenerator.FindMultipleComplexTypesOrOutKeyword(originalParameters); if (!complexParameters.Any()) { return(originalParameters); } var parameters = new SeparatedSyntaxList <ParameterSyntax>(); // remove all complex types from parameters var complexNames = complexParameters .Select(complex => complex.Identifier.ToFullString()); var filteredParameters = originalParameters .Where(parameter => { var name = parameter.Identifier.ToFullString(); return(complexNames.All(complexName => complexName != name)); }); parameters = parameters.AddRange(filteredParameters); // add single complex class type parameter var complexType = ComplexTypeNamesMapper.MapToServiceComplexClassType(methodName); var complexParameterName = ComplexTypeNamesMapper.MapToComplexClassParameterName(methodName); var complexTypeClass = SyntaxFactory.Parameter(SyntaxFactory.Identifier(complexParameterName)) .WithType(SyntaxFactory.IdentifierName(complexType)); // insert complex type before any optional parameters with default values // otherwise insert at the end var insertIndex = ParametersGenerator.FindIndexBeforeFirstOptionalParam(parameters); parameters = parameters.Insert(insertIndex, complexTypeClass); return(parameters); }