[clang-tools-extra] [clang-tidy] Export fixes from check_clang_tidy.py (PR #88186)
Edwin Vane via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 12 11:55:33 PDT 2024
https://github.com/revane updated https://github.com/llvm/llvm-project/pull/88186
>From 0c1f7d83c765a6c829543db9719420f7bf7eb02d Mon Sep 17 00:00:00 2001
From: Edwin Vane <revane at google.com>
Date: Tue, 9 Apr 2024 16:07:52 -0400
Subject: [PATCH] [clang-tidy] Export fixes from check_clang_tidy.py
Makes it possible to export fixes from running llvm-lit on a clang-tidy
test. To enable, modify the RUN invocation directly in the test with the
new -export-fixes flag. llvm-lit will report the test passed and fixes
can be found in the file specified to the -export flag.
---
clang-tools-extra/docs/ReleaseNotes.rst | 2 +
.../test/clang-tidy/check_clang_tidy.py | 74 ++++++++++++++-----
2 files changed, 57 insertions(+), 19 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index b66be44e9f8a6f..1405fb0df1f8dd 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -100,6 +100,8 @@ Improvements to clang-tidy
- Improved :program:`run-clang-tidy.py` script. Added argument `-source-filter`
to filter source files from the compilation database, via a RegEx. In a
similar fashion to what `-header-filter` does for header files.
+- Improved :program:`check_clang_tidy.py` script. Added argument `-export-fixes`
+ to aid in clang-tidy and test development.
New checks
^^^^^^^^^^
diff --git a/clang-tools-extra/test/clang-tidy/check_clang_tidy.py b/clang-tools-extra/test/clang-tidy/check_clang_tidy.py
index 53ffca0bad8d06..6d4b466afa691a 100755
--- a/clang-tools-extra/test/clang-tidy/check_clang_tidy.py
+++ b/clang-tools-extra/test/clang-tidy/check_clang_tidy.py
@@ -8,25 +8,35 @@
#
# ===------------------------------------------------------------------------===#
-r"""
+"""
ClangTidy Test Helper
=====================
-This script runs clang-tidy in fix mode and verify fixes, messages or both.
+This script is used to simplify writing, running, and debugging tests compatible
+with llvm-lit. By default it runs clang-tidy in fix mode and uses FileCheck to
+verify messages and/or fixes.
+
+For debugging, with --export-fixes, the tool simply exports fixes to a provided
+file and does not run FileCheck.
-Usage:
- check_clang_tidy.py [-resource-dir=<resource-dir>] \
- [-assume-filename=<file-with-source-extension>] \
- [-check-suffix=<comma-separated-file-check-suffixes>] \
- [-check-suffixes=<comma-separated-file-check-suffixes>] \
- [-std=c++(98|11|14|17|20)[-or-later]] \
- <source-file> <check-name> <temp-file> \
- -- [optional clang-tidy arguments]
+Extra arguments, those after the first -- if any, are passed to either
+clang-tidy or clang:
+* Arguments between the first -- and second -- are clang-tidy arguments.
+ * May be only whitespace if there are no clang-tidy arguments.
+ * clang-tidy's --config would go here.
+* Arguments after the second -- are clang arguments
+
+Examples
+--------
-Example:
// RUN: %check_clang_tidy %s llvm-include-order %t -- -- -isystem %S/Inputs
-Notes:
+or
+
+ // RUN: %check_clang_tidy %s llvm-include-order --export-fixes=fixes.yaml %t -std=c++20
+
+Notes
+-----
-std=c++(98|11|14|17|20)-or-later:
This flag will cause multiple runs within the same check_clang_tidy
execution. Make sure you don't have shared state across these runs.
@@ -34,6 +44,7 @@
import argparse
import os
+import pathlib
import re
import subprocess
import sys
@@ -88,6 +99,7 @@ def __init__(self, args, extra_args):
self.has_check_fixes = False
self.has_check_messages = False
self.has_check_notes = False
+ self.export_fixes = args.export_fixes
self.fixes = MessagePrefix("CHECK-FIXES")
self.messages = MessagePrefix("CHECK-MESSAGES")
self.notes = MessagePrefix("CHECK-NOTES")
@@ -181,7 +193,13 @@ def run_clang_tidy(self):
[
"clang-tidy",
self.temp_file_name,
- "-fix",
+ ]
+ + [
+ "-fix"
+ if self.export_fixes is None
+ else "--export-fixes=" + self.export_fixes
+ ]
+ + [
"--checks=-*," + self.check_name,
]
+ self.clang_tidy_extra_args
@@ -255,12 +273,14 @@ def check_notes(self, clang_tidy_output):
def run(self):
self.read_input()
- self.get_prefixes()
+ if self.export_fixes is None:
+ self.get_prefixes()
self.prepare_test_inputs()
clang_tidy_output = self.run_clang_tidy()
- self.check_fixes()
- self.check_messages(clang_tidy_output)
- self.check_notes(clang_tidy_output)
+ if self.export_fixes is None:
+ self.check_fixes()
+ self.check_messages(clang_tidy_output)
+ self.check_notes(clang_tidy_output)
def expand_std(std):
@@ -284,7 +304,11 @@ def csv(string):
def parse_arguments():
- parser = argparse.ArgumentParser()
+ parser = argparse.ArgumentParser(
+ prog=pathlib.Path(__file__).stem,
+ description=__doc__,
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ )
parser.add_argument("-expect-clang-tidy-error", action="store_true")
parser.add_argument("-resource-dir")
parser.add_argument("-assume-filename")
@@ -298,7 +322,19 @@ def parse_arguments():
type=csv,
help="comma-separated list of FileCheck suffixes",
)
- parser.add_argument("-std", type=csv, default=["c++11-or-later"])
+ parser.add_argument(
+ "-export-fixes",
+ default=None,
+ type=str,
+ metavar="file",
+ help="A file to export fixes into instead of fixing.",
+ )
+ parser.add_argument(
+ "-std",
+ type=csv,
+ default=["c++11-or-later"],
+ help="Passed to clang. Special -or-later values are expanded.",
+ )
return parser.parse_known_args()
More information about the cfe-commits
mailing list