clang-tidy: work with angle brackets and external projects
Also fix the readme
Change-Id: I422dff5536bf01d43983621aa01035bd77ac0252
This commit is contained in:
parent
d1fa446454
commit
745b5d3d4f
|
@ -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());
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
```
|
```
|
||||||
|
|
Loading…
Reference in a new issue