| =================== | 
 | Clang-Include-Fixer | 
 | =================== | 
 |  | 
 | .. contents:: | 
 |  | 
 | One of the major nuisances of C++ compared to other languages is the manual | 
 | management of ``#include`` directives in any file. | 
 | :program:`clang-include-fixer` addresses one aspect of this problem by providing | 
 | an automated way of adding ``#include`` directives for missing symbols in one | 
 | translation unit. | 
 |  | 
 | While inserting missing ``#include``, :program:`clang-include-fixer` adds | 
 | missing namespace qualifiers to all instances of an unidentified symbol if | 
 | the symbol is missing some prefix namespace qualifiers. | 
 |  | 
 | Setup | 
 | ===== | 
 |  | 
 | To use :program:`clang-include-fixer` two databases are required. Both can be | 
 | generated with existing tools. | 
 |  | 
 | - Compilation database. Contains the compiler commands for any given file in a | 
 |   project and can be generated by CMake, see `How To Setup Tooling For LLVM`_. | 
 | - Symbol index. Contains all symbol information in a project to match a given | 
 |   identifier to a header file. | 
 |  | 
 | Ideally both databases (``compile_commands.json`` and | 
 | ``find_all_symbols_db.yaml``) are linked into the root of the source tree they | 
 | correspond to. Then the :program:`clang-include-fixer` can automatically pick | 
 | them up if called with a source file from that tree. Note that by default | 
 | ``compile_commands.json`` as generated by CMake does not include header files, | 
 | so only implementation files can be handled by tools. | 
 |  | 
 | .. _How To Setup Tooling For LLVM: https://clang.llvm.org/docs/HowToSetupToolingForLLVM.html | 
 |  | 
 | Creating a Symbol Index From a Compilation Database | 
 | --------------------------------------------------- | 
 |  | 
 | The include fixer contains :program:`find-all-symbols`, a tool to create a | 
 | symbol database in YAML format from a compilation database by parsing all | 
 | source files listed in it. The following list of commands shows how to set up a | 
 | database for LLVM, any project built by CMake should follow similar steps. | 
 |  | 
 | .. code-block:: console | 
 |  | 
 |   $ cd path/to/llvm-build | 
 |   $ ninja find-all-symbols // build find-all-symbols tool. | 
 |   $ ninja clang-include-fixer // build clang-include-fixer tool. | 
 |   $ ls compile_commands.json # Make sure compile_commands.json exists. | 
 |     compile_commands.json | 
 |   $ path/to/llvm/source/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/run-find-all-symbols.py | 
 |     ... wait as clang indexes the code base ... | 
 |   $ ln -s $PWD/find_all_symbols_db.yaml path/to/llvm/source/ # Link database into the source tree. | 
 |   $ ln -s $PWD/compile_commands.json path/to/llvm/source/ # Also link compilation database if it's not there already. | 
 |   $ cd path/to/llvm/source | 
 |   $ /path/to/clang-include-fixer -db=yaml path/to/file/with/missing/include.cpp | 
 |     Added #include "foo.h" | 
 |  | 
 | Integrate with Vim | 
 | ------------------ | 
 | To run `clang-include-fixer` on a potentially unsaved buffer in Vim. Add the | 
 | following key binding to your ``.vimrc``: | 
 |  | 
 | .. code-block:: console | 
 |  | 
 |   noremap <leader>cf :pyf path/to/llvm/source/clang-tools-extra/clang-include-fixer/tool/clang-include-fixer.py<cr> | 
 |  | 
 | This enables `clang-include-fixer` for NORMAL and VISUAL mode. Change | 
 | `<leader>cf` to another binding if you need clang-include-fixer on a different | 
 | key. The `<leader> key | 
 | <http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_3)#Map_leader>`_ | 
 | is a reference to a specific key defined by the mapleader variable and is bound | 
 | to backslash by default. | 
 |  | 
 | Make sure vim can find :program:`clang-include-fixer`: | 
 |  | 
 | - Add the path to :program:`clang-include-fixer` to the PATH environment variable. | 
 | - Or set ``g:clang_include_fixer_path`` in vimrc: ``let g:clang_include_fixer_path=path/to/clang-include-fixer`` | 
 |  | 
 | You can customize the number of headers being shown by setting | 
 | ``let g:clang_include_fixer_maximum_suggested_headers=5`` | 
 |  | 
 | Customized settings in `.vimrc`: | 
 |  | 
 | - ``let g:clang_include_fixer_path = "clang-include-fixer"`` | 
 |  | 
 |   Set clang-include-fixer binary file path. | 
 |  | 
 | - ``let g:clang_include_fixer_maximum_suggested_headers = 3`` | 
 |  | 
 |   Set the maximum number of ``#includes`` to show. Default is 3. | 
 |  | 
 | - ``let g:clang_include_fixer_increment_num = 5`` | 
 |  | 
 |   Set the increment number of #includes to show every time when pressing ``m``. | 
 |   Default is 5. | 
 |  | 
 | - ``let g:clang_include_fixer_jump_to_include = 0`` | 
 |  | 
 |   Set to 1 if you want to jump to the new inserted ``#include`` line. Default is | 
 |   0. | 
 |  | 
 | - ``let g:clang_include_fixer_query_mode = 0`` | 
 |  | 
 |   Set to 1 if you want to insert ``#include`` for the symbol under the cursor. | 
 |   Default is 0. Compared to normal mode, this mode won't parse the source file | 
 |   and only search the symbol from database, which is faster than normal mode. | 
 |  | 
 | See ``clang-include-fixer.py`` for more details. | 
 |  | 
 | Integrate with Emacs | 
 | -------------------- | 
 | To run `clang-include-fixer` on a potentially unsaved buffer in Emacs. | 
 | Ensure that Emacs finds ``clang-include-fixer.el`` by adding the directory | 
 | containing the file to the ``load-path`` and requiring the `clang-include-fixer` | 
 | in your ``.emacs``: | 
 |  | 
 | .. code-block:: console | 
 |  | 
 |  (add-to-list 'load-path "path/to/llvm/source/clang-tools-extra/clang-include-fixer/tool/" | 
 |  (require 'clang-include-fixer) | 
 |  | 
 | Within Emacs the tool can be invoked with the command | 
 | ``M-x clang-include-fixer``. This will insert the header that defines the | 
 | first undefined symbol; if there is more than one header that would define the | 
 | symbol, the user is prompted to select one. | 
 |  | 
 | To include the header that defines the symbol at point, run | 
 | ``M-x clang-include-fixer-at-point``. | 
 |  | 
 | Make sure Emacs can find :program:`clang-include-fixer`: | 
 |  | 
 | - Either add the parent directory of :program:`clang-include-fixer` to the PATH | 
 |   environment variable, or customize the Emacs user option | 
 |   ``clang-include-fixer-executable`` to point to the file name of the program. | 
 |  | 
 | How it Works | 
 | ============ | 
 |  | 
 | To get the most information out of Clang at parse time, | 
 | :program:`clang-include-fixer` runs in tandem with the parse and receives | 
 | callbacks from Clang's semantic analysis. In particular it reuses the existing | 
 | support for typo corrections. Whenever Clang tries to correct a potential typo | 
 | it emits a callback to the include fixer which then looks for a corresponding | 
 | file. At this point rich lookup information is still available, which is not | 
 | available in the AST at a later stage. | 
 |  | 
 | The identifier that should be typo corrected is then sent to the database, if a | 
 | header file is returned it is added as an include directive at the top of the | 
 | file. | 
 |  | 
 | Currently :program:`clang-include-fixer` only inserts a single include at a | 
 | time to avoid getting caught in follow-up errors. If multiple `#include` | 
 | additions are desired the program can be rerun until a fix-point is reached. |