private static SeparatedSyntaxList <ParameterSyntax> RemoveDefaultValuesFromComplexTypeParameters(SeparatedSyntaxList <ParameterSyntax> parameters)
        {
            // asp.net web api does not support controller method parameters that are:
            //  1) reference types with default values set to 'null'
            //  2) enums with any default values
            // therefore remove all default values from complex type parameters
            // also the auto gen client files will include the default values so ok to remove them for enums
            // otherwise perhaps need to auto gen enum as a string (and parse it) or as a nullable type

            bool IsComplexTypeWithDefaultValue(ParameterSyntax parameter)
            {
                var param           = new SeparatedSyntaxList <ParameterSyntax>().Add(parameter);
                var isComplexType   = ComplexTypesGenerator.FindComplexTypes(param).Any();
                var hasDefaultValue = parameter.Default != null;

                return(isComplexType && hasDefaultValue);
            }

            // split up complex type parameters into two lists: 1) has default values 2) all others
            var parametersGroupByDefaults = parameters.ToLookup(IsComplexTypeWithDefaultValue);
            var defaultValParameters      = parametersGroupByDefaults[true].ToList();
            var otherParameters           = parametersGroupByDefaults[false];

            if (!defaultValParameters.Any())
            {
                return(parameters);
            }

            // remove default values
            var removedDefaultParameters = defaultValParameters
                                           .Select(parameter =>
            {
                parameter = IsComplexTypeWithDefaultValue(parameter)
                        ? parameter.WithDefault(null)
                        : parameter;

                return(parameter);
            });

            // combine modified parameters no longer with default values back with other params
            var newParameters = new SeparatedSyntaxList <ParameterSyntax>();

            newParameters = newParameters.AddRange(otherParameters);
            var insertIndex = ParametersGenerator.FindIndexBeforeFirstOptionalParam(newParameters);

            newParameters = newParameters.InsertRange(insertIndex, removedDefaultParameters);

            return(newParameters);
        }
示例#2
0
        private static IEnumerable <StatementSyntax> CreateStartStatements(IEnumerable <string> parameterNames,
                                                                           SeparatedSyntaxList <ParameterSyntax> wcfParameters)
        {
            var statements = parameterNames
                             .Select(parameterName =>
            {
                var variableName = parameterName;
                var variableType = ParametersGenerator.FindParameterType(wcfParameters, parameterName);

                var statement            = $"{variableName} = default({variableType});";
                var statementDeclaration = SyntaxFactory.ParseStatement(statement);

                return(statementDeclaration);
            });

            return(statements);
        }
示例#3
0
        private static IEnumerable <StatementSyntax> CreateStartStatements(IEnumerable <string> argumentNames, SeparatedSyntaxList <ParameterSyntax> wcfParameters)
        {
            // arguments with 'out' keywords requires separate local variable declarations to be passed to wcf method
            // i.e. the complex class properties cannot be used as arguments with 'out' keyword...must use separate variable

            var statements = argumentNames
                             .Select(argumentName =>
            {
                var variableName = argumentName;
                var variableType = ParametersGenerator.FindParameterType(wcfParameters, argumentName);

                var statement            = $"{variableType} {variableName};";
                var statementDeclaration = SyntaxFactory.ParseStatement(statement);

                return(statementDeclaration);
            });

            return(statements);
        }
示例#4
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);
        }
示例#5
0
 public override string[] AllParameters()
 {
     return(ParametersGenerator.OrderCombination(parameters));
 }