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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }