========
Overview
========

Clang Tools are standalone command line (and potentially GUI) tools
designed for use by C++ developers who are already using and enjoying
Clang as their compiler. These tools provide developer-oriented
functionality such as fast syntax checking, automatic formatting,
refactoring, etc.

Only a couple of the most basic and fundamental tools are kept in the
primary Clang Subversion project. The rest of the tools are kept in a
side-project so that developers who don't want or need to build them
don't. If you want to get access to the extra Clang Tools repository,
simply check it out into the tools tree of your Clang checkout and
follow the usual process for building and working with a combined
LLVM/Clang checkout:

-  With Subversion:

   -  ``cd llvm/tools/clang/tools``
   -  ``svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra``

-  Or with Git:

   -  ``cd llvm/tools/clang/tools``
   -  ``git clone http://llvm.org/git/clang-tools-extra.git extra``

This document describes a high-level overview of the organization of
Clang Tools within the project as well as giving an introduction to some
of the more important tools. However, it should be noted that this
document is currently focused on Clang and Clang Tool developers, not on
end users of these tools.

Clang Tools Organization
========================

Clang Tools are CLI or GUI programs that are intended to be directly
used by C++ developers. That is they are *not* primarily for use by
Clang developers, although they are hopefully useful to C++ developers
who happen to work on Clang, and we try to actively dogfood their
functionality. They are developed in three components: the underlying
infrastructure for building a standalone tool based on Clang, core
shared logic used by many different tools in the form of refactoring and
rewriting libraries, and the tools themselves.

The underlying infrastructure for Clang Tools is the
:doc:`LibTooling <LibTooling>` platform. See its documentation for much
more detailed information about how this infrastructure works. The
common refactoring and rewriting toolkit-style library is also part of
LibTooling organizationally.

A few Clang Tools are developed along side the core Clang libraries as
examples and test cases of fundamental functionality. However, most of
the tools are developed in a side repository to provide easy separation
from the core libraries. We intentionally do not support public
libraries in the side repository, as we want to carefully review and
find good APIs for libraries as they are lifted out of a few tools and
into the core Clang library set.

Regardless of which repository Clang Tools' code resides in, the
development process and practices for all Clang Tools are exactly those
of Clang itself. They are entirely within the Clang *project*,
regardless of the version control scheme.

Core Clang Tools
================

The core set of Clang tools that are within the main repository are
tools that very specifically complement, and allow use and testing of
*Clang* specific functionality.

``clang-check``
---------------

:doc:`ClangCheck` combines the LibTooling framework for running a
Clang tool with the basic Clang diagnostics by syntax checking specific files
in a fast, command line interface. It can also accept flags to re-display the
diagnostics in different formats with different flags, suitable for use driving
an IDE or editor. Furthermore, it can be used in fixit-mode to directly apply
fixit-hints offered by clang. See :doc:`HowToSetupToolingForLLVM` for
instructions on how to setup and used `clang-check`.

``clang-format``
~~~~~~~~~~~~~~~~

Clang-format is both a :doc:`library <LibFormat>` and a :doc:`stand-alone tool
<ClangFormat>` with the goal of automatically reformatting C++ sources files
according to configurable style guides.  To do so, clang-format uses Clang's
``Lexer`` to transform an input file into a token stream and then changes all
the whitespace around those tokens.  The goal is for clang-format to serve both
as a user tool (ideally with powerful IDE integrations) and as part of other
refactoring tools, e.g. to do a reformatting of all the lines changed during a
renaming.

``clang-modernize``
~~~~~~~~~~~~~~~~~~~
``clang-modernize`` migrates C++ code to use C++11 features where appropriate.
Currently it can:

* convert loops to range-based for loops;

* convert null pointer constants (like ``NULL`` or ``0``) to C++11 ``nullptr``;

* replace the type specifier in variable declarations with the ``auto`` type specifier;

* add the ``override`` specifier to applicable member functions.

Extra Clang Tools
=================

As various categories of Clang Tools are added to the extra repository,
they'll be tracked here. The focus of this documentation is on the scope
and features of the tools for other tool developers; each tool should
provide its own user-focused documentation.

Ideas for new Tools
===================

* C++ cast conversion tool.  Will convert C-style casts (``(type) value``) to
  appropriate C++ cast (``static_cast``, ``const_cast`` or
  ``reinterpret_cast``).
* Non-member ``begin()`` and ``end()`` conversion tool.  Will convert
  ``foo.begin()`` into ``begin(foo)`` and similarly for ``end()``, where
  ``foo`` is a standard container.  We could also detect similar patterns for
  arrays.
* ``make_shared`` / ``make_unique`` conversion.  Part of this transformation
  can be incorporated into the ``auto`` transformation.  Will convert

  .. code-block:: c++

    std::shared_ptr<Foo> sp(new Foo);
    std::unique_ptr<Foo> up(new Foo);

    func(std::shared_ptr<Foo>(new Foo), bar());

  into:

  .. code-block:: c++

    auto sp = std::make_shared<Foo>();
    auto up = std::make_unique<Foo>(); // In C++14 mode.

    // This also affects correctness.  For the cases where bar() throws,
    // make_shared() is safe and the original code may leak.
    func(std::make_shared<Foo>(), bar());

* ``tr1`` removal tool.  Will migrate source code from using TR1 library
  features to C++11 library.  For example:

  .. code-block:: c++

    #include <tr1/unordered_map>
    int main()
    {
        std::tr1::unordered_map <int, int> ma;
        std::cout << ma.size () << std::endl;
        return 0;
    }

  should be rewritten to:

  .. code-block:: c++

    #include <unordered_map>
    int main()
    {
        std::unordered_map <int, int> ma;
        std::cout << ma.size () << std::endl;
        return 0;
    }

* A tool to remove ``auto``.  Will convert ``auto`` to an explicit type or add
  comments with deduced types.  The motivation is that there are developers
  that don't want to use ``auto`` because they are afraid that they might lose
  control over their code.

* C++14: less verbose operator function objects (`N3421
  <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3421.htm>`_).
  For example:

  .. code-block:: c++

    sort(v.begin(), v.end(), greater<ValueType>());

  should be rewritten to:

  .. code-block:: c++

    sort(v.begin(), v.end(), greater<>());

