[PATCH] D124164: [include-cleaner] Include-cleaner library structure, and simplistic AST walking.
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 21 05:46:11 PDT 2022
sammccall created this revision.
sammccall added reviewers: kbobyrev, CJ-Johnson.
Herald added subscribers: usaxena95, kadircet, mgrang, mgorny.
Herald added a project: All.
sammccall requested review of this revision.
Herald added subscribers: cfe-commits, ilya-biryukov.
Herald added projects: clang, clang-tools-extra.
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
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D124164
Files:
clang-tools-extra/CMakeLists.txt
clang-tools-extra/include-cleaner/CMakeLists.txt
clang-tools-extra/include-cleaner/README.md
clang-tools-extra/include-cleaner/lib/AnalysisInternal.h
clang-tools-extra/include-cleaner/lib/CMakeLists.txt
clang-tools-extra/include-cleaner/lib/WalkAST.cpp
clang-tools-extra/include-cleaner/test/CMakeLists.txt
clang-tools-extra/include-cleaner/test/Unit/lit.cfg.py
clang-tools-extra/include-cleaner/test/Unit/lit.site.cfg.py.in
clang-tools-extra/include-cleaner/test/lit.cfg.py
clang-tools-extra/include-cleaner/test/lit.site.cfg.py.in
clang-tools-extra/include-cleaner/unittests/CMakeLists.txt
clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
clang/include/clang/Testing/TestAST.h
clang/lib/Testing/TestAST.cpp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124164.424168.patch
Type: text/x-patch
Size: 15291 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220421/7b1d9d7a/attachment-0001.bin>
More information about the cfe-commits
mailing list