clang-tidy: work with angle brackets and external projects

Also fix the readme

Change-Id: I422dff5536bf01d43983621aa01035bd77ac0252
This commit is contained in:
Jade Lovelace 2024-05-23 15:16:10 -07:00 committed by jade
parent d1fa446454
commit 745b5d3d4f
3 changed files with 32 additions and 23 deletions

View file

@ -44,32 +44,41 @@ void FixIncludesCallbacks::LexedFileChanged(FileID, LexedFileChangeReason,
} }
void FixIncludesCallbacks::InclusionDirective( void FixIncludesCallbacks::InclusionDirective(
SourceLocation, const Token &, StringRef, bool, SourceLocation, const Token &, StringRef FileName, bool IsAngled,
CharSourceRange FilenameRange, OptionalFileEntryRef File, StringRef, CharSourceRange FilenameRange, OptionalFileEntryRef File, StringRef,
StringRef, const Module *, SrcMgr::CharacteristicKind) { StringRef, const Module *, SrcMgr::CharacteristicKind) {
if (Ignore) if (Ignore)
return; return;
// FIXME: this is kinda evil, but this is a one-time fixup // FIXME: this is kinda evil, but this is a one-time fixup
const std::string SourceDir = "src/"; const std::vector<std::string> SourceDirs = {"src/", "include/lix/"};
if (File && File->getNameAsRequested().contains(SourceDir)) { const auto Bracketize = [IsAngled](StringRef s) {
return IsAngled ? ("<" + s + ">").str() : ("\"" + s + "\"").str();
};
for (const auto &SourceDir : SourceDirs) {
const bool IsAlreadyFixed = FileName.starts_with("lix/lib");
if (File && File->getNameAsRequested().contains(SourceDir) &&
!IsAlreadyFixed) {
StringRef Name = File->getNameAsRequested(); StringRef Name = File->getNameAsRequested();
auto Idx = Name.find(SourceDir); auto Idx = Name.find(SourceDir);
assert(Idx != std::string::npos); assert(Idx != std::string::npos);
StringRef Suffix = Name.drop_front(Idx + SourceDir.length()); std::string Suffix = Name.drop_front(Idx + SourceDir.length()).str();
if (!Suffix.starts_with("lib")) { if (!Suffix.starts_with("lib")) {
llvm::dbgs() << "ignored: " << Suffix << "\n"; llvm::dbgs() << "ignored: " << Suffix << "\n";
return; return;
} }
Suffix = "lix/" + Suffix;
auto Diag = Check.diag(FilenameRange.getBegin(), auto Diag = Check.diag(FilenameRange.getBegin(),
"include needs to specify the source subdir"); "include needs to specify the source subdir");
Diag << FilenameRange Diag << FilenameRange
<< FixItHint::CreateReplacement(FilenameRange, << FixItHint::CreateReplacement(FilenameRange, Bracketize(Suffix));
("\"" + Suffix + "\"").str()); }
} }
} }

View file

@ -1,6 +1,6 @@
# Clang tidy lints for Nix # Clang tidy lints for Lix
This is a skeleton of a clang-tidy lints library for Nix. This is a skeleton of a clang-tidy lints library for Lix.
Currently there is one check (which is already obsolete as it has served its Currently there is one check (which is already obsolete as it has served its
goal and is there as an example), `HasPrefixSuffixCheck`. goal and is there as an example), `HasPrefixSuffixCheck`.
@ -10,13 +10,13 @@ goal and is there as an example), `HasPrefixSuffixCheck`.
One file: One file:
``` ```
ninja -C build && clang-tidy --checks='-*,nix-*' --load=build/libnix-clang-tidy.so -p ../compile_commands.json --fix ../src/libcmd/installables.cc ninja -C build && clang-tidy --checks='-*,lix-*' --load=build/liblix-clang-tidy.so -p ../compile_commands.json -header-filter '\.\./src/.*\.h' --fix ../src/libcmd/installables.cc
``` ```
Several files, in parallel: Several files, in parallel:
``` ```
ninja -C build && run-clang-tidy -checks='-*,nix-*' -load=build/libnix-clang-tidy.so -p .. -fix ../src | tee -a clang-tidy-result ninja -C build && run-clang-tidy -checks='-*,lix-*' -load=build/liblix-clang-tidy.so -p .. -header-filter '\.\./src/.*\.h' -fix ../src | tee -a clang-tidy-result
``` ```
## Resources ## Resources

View file

@ -22,10 +22,10 @@ Migration path:
To apply this migration automatically, remove all `<nix/>` from includes, so `#include <nix/expr.hh>` -> `#include <expr.hh>`. To apply this migration automatically, remove all `<nix/>` from includes, so `#include <nix/expr.hh>` -> `#include <expr.hh>`.
Then, the correct paths will be resolved from the tangled mess, and the clang-tidy automated fix will work. Then, the correct paths will be resolved from the tangled mess, and the clang-tidy automated fix will work.
Then run the following for out of tree projects: Then run the following for out of tree projects (header filter is set to only fix instances in headers in `../src` relative to the compiler's working directory, as would be the case in nix-eval-jobs or other things built with meson, e.g.):
```console ```console
lix_root=$HOME/lix lix_root=$HOME/lix
(cd $lix_root/clang-tidy && nix develop -c 'meson setup build && ninja -C build') (cd $lix_root/clang-tidy && nix develop -c 'meson setup build && ninja -C build')
run-clang-tidy -checks='-*,lix-fixincludes' -load=$lix_root/clang-tidy/build/liblix-clang-tidy.so -p build/ -fix src run-clang-tidy -checks='-*,lix-fixincludes' -load=$lix_root/clang-tidy/build/liblix-clang-tidy.so -p build/ -header-filter '\.\./src/.*\.h' -fix src
``` ```