[include-cleaner] Include-cleaner library structure, and simplistic AST walking.
Include-cleaner is a library that uses the clang AST and preprocessor to
determine which headers are used. It will be used in clang-tidy, in
clangd, in a standalone tool at least for testing, and in out-of-tree tools.
Roughly, it walks the AST, finds referenced decls, maps these to
used sourcelocations, then to FileEntrys, then matching these against #includes.
However there are many wrinkles: dealing with macros, standard library
symbols, umbrella headers, IWYU directives etc.
It is not built on the C++20 modules concept of usage, to allow:
- use with existing non-modules codebases
- a flexible API embeddable in clang-tidy, clangd, and other tools
- avoiding a chicken-and-egg problem where include cleanups are needed
before modules can be adopted
This library is based on existing functionality in clangd that provides
an unused-include warning. However it has design changes:
- it accommodates diagnosing missing includes too (this means tracking
where references come from, not just the set of targets)
- it more clearly separates the different mappings
(symbol => location => header => include) for better testing
- it handles special cases like standard library symbols and IWYU directives
more elegantly by adding unified Location and Header types instead of
side-tables
- it will support some customization of policy where necessary (e.g.
for style questions of what constitutes a use, or to allow
both missing-include and unused-include modes to be conservative)
This patch adds the basic directory structure under clang-tools-extra
and a skeleton version of the AST traversal, which will be the central
piece.
A more end-to-end prototype is in https://reviews.llvm.org/D122677
RFC: https://discourse.llvm.org/t/rfc-lifting-include-cleaner-missing-unused-include-detection-out-of-clangd/61228
Differential Revision: https://reviews.llvm.org/D124164
2022-04-13 21:13:34 +02:00
|
|
|
import lit.llvm
|
|
|
|
|
|
|
|
lit.llvm.initialize(lit_config, config)
|
|
|
|
lit.llvm.llvm_config.use_default_substitutions()
|
|
|
|
|
|
|
|
config.name = "ClangIncludeCleaner"
|
|
|
|
config.suffixes = [".test", ".c", ".cpp"]
|
|
|
|
config.excludes = ["Inputs"]
|
|
|
|
config.test_format = lit.formats.ShTest(not lit.llvm.llvm_config.use_lit_shell)
|
|
|
|
config.test_source_root = config.clang_include_cleaner_source_dir + "/test"
|
|
|
|
config.test_exec_root = config.clang_include_cleaner_binary_dir + "/test"
|
|
|
|
|
|
|
|
config.environment["PATH"] = os.path.pathsep.join(
|
|
|
|
(config.clang_tools_dir, config.llvm_tools_dir, config.environment["PATH"])
|
|
|
|
)
|
2022-10-04 16:36:15 +02:00
|
|
|
|
|
|
|
# It is not realistically possible to account for all options that could
|
|
|
|
# possibly be present in system and user configuration files, so disable
|
|
|
|
# default configs for the test runs.
|
|
|
|
config.environment["CLANG_NO_DEFAULT_CONFIG"] = "1"
|