blob: 015e734e740cf27f7b96e19f26806502e3abc3bc [file] [log] [blame]
Benjamin Kramerbfcab592016-05-11 09:44:10 +00001===================
2Clang-Include-Fixer
3===================
4
5.. contents::
6
7One of the major nuisances of C++ compared to other languages is the manual
8management of ``#include`` directives in any file.
9:program:`clang-include-fixer` addresses one aspect of this problem by providing
10an automated way of adding ``#include`` directives for missing symbols in one
11translation unit.
12
Haojian Wu499375c2016-07-27 13:17:16 +000013While inserting missing ``#include``, :program:`clang-include-fixer` adds
14missing namespace qualifiers to all instances of an unidentified symbol if
15the symbol is missing some prefix namespace qualifiers.
16
Benjamin Kramerbfcab592016-05-11 09:44:10 +000017Setup
18=====
19
20To use :program:`clang-include-fixer` two databases are required. Both can be
21generated with existing tools.
22
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`_.
Benjamin Kramera3d82332016-05-13 09:27:54 +000025- Symbol index. Contains all symbol information in a project to match a given
Benjamin Kramerbfcab592016-05-11 09:44:10 +000026 identifier to a header file.
27
28Ideally both databases (``compile_commands.json`` and
29``find_all_symbols_db.yaml``) are linked into the root of the source tree they
30correspond to. Then the :program:`clang-include-fixer` can automatically pick
31them 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,
33so only implementation files can be handled by tools.
34
35.. _How To Setup Tooling For LLVM: http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html
36
Benjamin Kramera3d82332016-05-13 09:27:54 +000037Creating a Symbol Index From a Compilation Database
Haojian Wu499375c2016-07-27 13:17:16 +000038---------------------------------------------------
Benjamin Kramerbfcab592016-05-11 09:44:10 +000039
40The include fixer contains :program:`find-all-symbols`, a tool to create a
41symbol database in YAML format from a compilation database by parsing all
42source files listed in it. The following list of commands shows how to set up a
43database for LLVM, any project built by CMake should follow similar steps.
44
45.. code-block:: console
46
47 $ cd path/to/llvm-build
Haojian Wue64cee82016-06-07 07:50:48 +000048 $ ninja find-all-symbols // build find-all-symbols tool.
49 $ ninja clang-include-fixer // build clang-include-fixer tool.
Benjamin Kramerbfcab592016-05-11 09:44:10 +000050 $ ls compile_commands.json # Make sure compile_commands.json exists.
51 compile_commands.json
52 $ path/to/llvm/source/tools/clang/tools/extra/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
Haojian Wue64cee82016-06-07 07:50:48 +000057 $ /path/to/clang-include-fixer -db=yaml path/to/file/with/missing/include.cpp
Benjamin Kramerbfcab592016-05-11 09:44:10 +000058 Added #include "foo.h"
59
Eric Liuc7f3b102016-05-18 14:10:16 +000060Integrate with Vim
Haojian Wu499375c2016-07-27 13:17:16 +000061------------------
Eric Liuc7f3b102016-05-18 14:10:16 +000062To run `clang-include-fixer` on a potentially unsaved buffer in Vim. Add the
63following key binding to your ``.vimrc``:
64
65.. code-block:: console
66
Kirill Bobyrevc4018e22016-07-27 14:23:47 +000067 noremap <leader>cf :pyf path/to/llvm/source/tools/clang/tools/extra/include-fixer/tool/clang-include-fixer.py<cr>
Eric Liuc7f3b102016-05-18 14:10:16 +000068
Kirill Bobyrevc4018e22016-07-27 14:23:47 +000069This 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
71key. The
72[``<leader> key``](http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_3)#Map_leader)
73is a reference to a specific key defined by the mapleader variable and is binded
74to backslash by default.
Eric Liuc7f3b102016-05-18 14:10:16 +000075
Haojian Wue64cee82016-06-07 07:50:48 +000076Make sure vim can find :program:`clang-include-fixer`:
77
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``
80
81You can customize the number of headers being shown by setting
82``let g:clang_include_fixer_maximum_suggested_headers=5``
83
Eric Liuc7f3b102016-05-18 14:10:16 +000084See ``clang-include-fixer.py`` for more details.
85
Benjamin Kramer57d070e2016-07-27 10:11:06 +000086Integrate with Emacs
87--------------------
88To run `clang-include-fixer` on a potentially unsaved buffer in Emacs.
89Ensure that Emacs finds ``clang-include-fixer.el`` by adding the directory containing the file to the ``load-path``
90and requiring the `clang-include-fixer` in your ```.emacs``:
91
92.. code-block:: console
93
94 (add-to-list 'load-path "path/to/llvm/source/tools/clang/tools/extra/include-fixer/tool/"
95 (require 'clang-include-fixer)
96
97Within Emacs the tool can be invoked with the command ``M-x clang-include-fixer``.
98
99Make sure Emacs can find :program:`clang-include-fixer`:
100
101- Add the path to :program:`clang-include-fixer` to the PATH environment variable.
102
103See ``clang-include-fixer.el`` for more details.
104
Benjamin Kramerbfcab592016-05-11 09:44:10 +0000105How it Works
106============
107
108To get the most information out of clang at parse time,
109:program:`clang-include-fixer` runs in tandem with the parse and receives
110callbacks from Clang's semantic analysis. In particular it reuses the existing
111support for typo corrections. Whenever Clang tries to correct a potential typo
112it emits a callback to the include fixer which then looks for a corresponding
113file. At this point rich lookup information is still available, which is not
114available in the AST at a later stage.
115
116The identifier that should be typo corrected is then sent to the database, if a
117header file is returned it is added as an include directive at the top of the
118file.
119
120Currently :program:`clang-include-fixer` only inserts a single include at a
121time to avoid getting caught in follow-up errors. If multiple `#include`
122additions are desired the program can be rerun until a fix-point is reached.