private static SyntaxNodeOrToken WithParameter(
            KeyValuePair <string, Argument> argumentDefinition)
        {
            var argumentName = argumentDefinition.Key.ToFieldArgumentName();
            var argument     = argumentDefinition.Value;
            var typeName     = CodeModel.SelectTypeName(argument.Type);

            return(Parameter(Identifier(argumentName))
                   .WithType(ParseTypeName(typeName)));
        }
        private SyntaxNodeOrToken WithArgument(KeyValuePair <string, Argument> argumentDefinition)
        {
            var rawArgumentName = argumentDefinition.Key;
            var argument        = argumentDefinition.Value;
            var typeName        = CodeModel.SelectTypeName(argument.Type);

            var isInputObject = argument.Type.Unwrap() is InputObjectType;

            string getArgumentMethodName;

            if (isInputObject)
            {
                if (argument.Type is List)
                {
                    typeName = CodeModel.SelectTypeName(argument.Type.Unwrap());
                    getArgumentMethodName = nameof(ResolverContextExtensions.GetObjectArgumentList);
                }
                else
                {
                    getArgumentMethodName = nameof(ResolverContextExtensions.GetObjectArgument);
                }
            }
            else
            {
                getArgumentMethodName = nameof(ResolverContextExtensions.GetArgument);
            }

            var getArgumentValue = InvocationExpression(
                MemberAccessExpression(
                    SyntaxKind.SimpleMemberAccessExpression,
                    IdentifierName("context"),
                    GenericName(
                        Identifier(getArgumentMethodName))
                    .WithTypeArgumentList(
                        TypeArgumentList(
                            SingletonSeparatedList <TypeSyntax>(
                                IdentifierName(typeName))))))
                                   .WithArgumentList(
                ArgumentList(
                    SingletonSeparatedList(
                        Argument(LiteralExpression(
                                     SyntaxKind.StringLiteralExpression,
                                     Literal(rawArgumentName))))));

            return(Argument(getArgumentValue));
        }