Bump version to 19.1.0git
[llvm-project.git] / clang-tools-extra / docs / clang-include-fixer.rst
blob7d1fd9ed70e77150d785000daa9b51062d19656c
1 ===================
2 Clang-Include-Fixer
3 ===================
5 .. contents::
7 One of the major nuisances of C++ compared to other languages is the manual
8 management of ``#include`` directives in any file.
9 :program:`clang-include-fixer` addresses one aspect of this problem by providing
10 an automated way of adding ``#include`` directives for missing symbols in one
11 translation unit.
13 While inserting missing ``#include``, :program:`clang-include-fixer` adds
14 missing namespace qualifiers to all instances of an unidentified symbol if
15 the symbol is missing some prefix namespace qualifiers.
17 Setup
18 =====
20 To use :program:`clang-include-fixer` two databases are required. Both can be
21 generated with existing tools.
23 - Compilation database. Contains the compiler commands for any given file in a
24   project and can be generated by CMake, see `How To Setup Tooling For LLVM`_.
25 - Symbol index. Contains all symbol information in a project to match a given
26   identifier to a header file.
28 Ideally both databases (``compile_commands.json`` and
29 ``find_all_symbols_db.yaml``) are linked into the root of the source tree they
30 correspond to. Then the :program:`clang-include-fixer` can automatically pick
31 them up if called with a source file from that tree. Note that by default
32 ``compile_commands.json`` as generated by CMake does not include header files,
33 so only implementation files can be handled by tools.
35 .. _How To Setup Tooling For LLVM: https://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
37 Creating a Symbol Index From a Compilation Database
38 ---------------------------------------------------
40 The include fixer contains :program:`find-all-symbols`, a tool to create a
41 symbol database in YAML format from a compilation database by parsing all
42 source files listed in it. The following list of commands shows how to set up a
43 database for LLVM, any project built by CMake should follow similar steps.
45 .. code-block:: console
47   $ cd path/to/llvm-build
48   $ ninja find-all-symbols // build find-all-symbols tool.
49   $ ninja clang-include-fixer // build clang-include-fixer tool.
50   $ ls compile_commands.json # Make sure compile_commands.json exists.
51     compile_commands.json
52   $ path/to/llvm/source/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/run-find-all-symbols.py
53     ... wait as clang indexes the code base ...
54   $ ln -s $PWD/find_all_symbols_db.yaml path/to/llvm/source/ # Link database into the source tree.
55   $ ln -s $PWD/compile_commands.json path/to/llvm/source/ # Also link compilation database if it's not there already.
56   $ cd path/to/llvm/source
57   $ /path/to/clang-include-fixer -db=yaml path/to/file/with/missing/include.cpp
58     Added #include "foo.h"
60 Integrate with Vim
61 ------------------
62 To run `clang-include-fixer` on a potentially unsaved buffer in Vim. Add the
63 following key binding to your ``.vimrc``:
65 .. code-block:: console
67   noremap <leader>cf :pyf path/to/llvm/source/clang-tools-extra/clang-include-fixer/tool/clang-include-fixer.py<cr>
69 This enables `clang-include-fixer` for NORMAL and VISUAL mode. Change
70 `<leader>cf` to another binding if you need clang-include-fixer on a different
71 key. The `<leader> key
72 <http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_3)#Map_leader>`_
73 is a reference to a specific key defined by the mapleader variable and is bound
74 to backslash by default.
76 Make sure vim can find :program:`clang-include-fixer`:
78 - Add the path to :program:`clang-include-fixer` to the PATH environment variable.
79 - Or set ``g:clang_include_fixer_path`` in vimrc: ``let g:clang_include_fixer_path=path/to/clang-include-fixer``
81 You can customize the number of headers being shown by setting
82 ``let g:clang_include_fixer_maximum_suggested_headers=5``
84 Customized settings in `.vimrc`:
86 - ``let g:clang_include_fixer_path = "clang-include-fixer"``
88   Set clang-include-fixer binary file path.
90 - ``let g:clang_include_fixer_maximum_suggested_headers = 3``
92   Set the maximum number of ``#includes`` to show. Default is 3.
94 - ``let g:clang_include_fixer_increment_num = 5``
96   Set the increment number of #includes to show every time when pressing ``m``.
97   Default is 5.
99 - ``let g:clang_include_fixer_jump_to_include = 0``
101   Set to 1 if you want to jump to the new inserted ``#include`` line. Default is
102   0.
104 - ``let g:clang_include_fixer_query_mode = 0``
106   Set to 1 if you want to insert ``#include`` for the symbol under the cursor.
107   Default is 0. Compared to normal mode, this mode won't parse the source file
108   and only search the symbol from database, which is faster than normal mode.
110 See ``clang-include-fixer.py`` for more details.
112 Integrate with Emacs
113 --------------------
114 To run `clang-include-fixer` on a potentially unsaved buffer in Emacs.
115 Ensure that Emacs finds ``clang-include-fixer.el`` by adding the directory
116 containing the file to the ``load-path`` and requiring the `clang-include-fixer`
117 in your ``.emacs``:
119 .. code-block:: console
121  (add-to-list 'load-path "path/to/llvm/source/clang-tools-extra/clang-include-fixer/tool/"
122  (require 'clang-include-fixer)
124 Within Emacs the tool can be invoked with the command
125 ``M-x clang-include-fixer``. This will insert the header that defines the
126 first undefined symbol; if there is more than one header that would define the
127 symbol, the user is prompted to select one.
129 To include the header that defines the symbol at point, run
130 ``M-x clang-include-fixer-at-point``.
132 Make sure Emacs can find :program:`clang-include-fixer`:
134 - Either add the parent directory of :program:`clang-include-fixer` to the PATH
135   environment variable, or customize the Emacs user option
136   ``clang-include-fixer-executable`` to point to the file name of the program.
138 How it Works
139 ============
141 To get the most information out of Clang at parse time,
142 :program:`clang-include-fixer` runs in tandem with the parse and receives
143 callbacks from Clang's semantic analysis. In particular it reuses the existing
144 support for typo corrections. Whenever Clang tries to correct a potential typo
145 it emits a callback to the include fixer which then looks for a corresponding
146 file. At this point rich lookup information is still available, which is not
147 available in the AST at a later stage.
149 The identifier that should be typo corrected is then sent to the database, if a
150 header file is returned it is added as an include directive at the top of the
151 file.
153 Currently :program:`clang-include-fixer` only inserts a single include at a
154 time to avoid getting caught in follow-up errors. If multiple `#include`
155 additions are desired the program can be rerun until a fix-point is reached.