lix/subprojects/lix-clang-tidy
jade a5f0954c29 clang-tidy: write a lint for charptr_cast
This lets us ensure that nobody is putting in new reinterpret_cast
instances where they could safely use charptr_cast instead.

Change-Id: I6358a3934c8133c7150042635843bdbb6b9218d4
2024-08-08 14:53:17 -07:00
..
.clang-format build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00
.editorconfig build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00
CharPtrCast.cc clang-tidy: write a lint for charptr_cast 2024-08-08 14:53:17 -07:00
CharPtrCast.hh clang-tidy: write a lint for charptr_cast 2024-08-08 14:53:17 -07:00
default.nix build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00
FixIncludes.cc build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00
FixIncludes.hh build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00
HasPrefixSuffix.cc build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00
HasPrefixSuffix.hh build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00
LixClangTidyChecks.cc clang-tidy: write a lint for charptr_cast 2024-08-08 14:53:17 -07:00
meson.build clang-tidy: write a lint for charptr_cast 2024-08-08 14:53:17 -07:00
meson.options build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00
README.md build: implement clang-tidy using our plugin 2024-08-04 20:41:19 -07:00

Clang tidy lints for Lix

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 goal and is there as an example), HasPrefixSuffixCheck.

Running fixes/checks

One file:

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:

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

Developing new checks

Put something like so in myquery.txt:

set traversal     IgnoreUnlessSpelledInSource
# ^ Ignore implicit AST nodes. May need to use AsIs depending on how you are
# working.
set bind-root     true
# ^ true unless you use any .bind("foo") commands
set print-matcher true
enable output     dump
match callExpr(callee(functionDecl(hasName("hasPrefix"))), optionally(hasArgument( 0, cxxConstructExpr(hasDeclaration(functionDecl(hasParameter(0, parmVarDecl(hasType(asString("const char *"))).bind("meow2"))))))))

Then run, e.g. clang-query --preload hasprefix.query -p compile_commands.json src/libcmd/installables.cc.

With this you can iterate a query before writing it in C++ and suffering from C++.

Tips and tricks for the C++

There is a function dump() on many things that will dump to stderr. Also llvm::errs() lets you print to stderr.

When I wrote HasPrefixSuffixCheck, I was not really able to figure out how the structured replacement system was supposed to work. In principle you can describe the replacement with a nice DSL. Look up the Stencil system in Clang for details.