|  | =================== | 
|  | 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. |