[clang-tools-extra] [clang-tidy] Exclude Files Not Present in the Compile Database (PR #120325)

via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 17 14:57:32 PST 2024


https://github.com/wonbinbk updated https://github.com/llvm/llvm-project/pull/120325

>From 8af4a17a150d20f18be3111c7519b7e1f29ea129 Mon Sep 17 00:00:00 2001
From: "thai.phan" <thaiphd at gmail.com>
Date: Wed, 18 Dec 2024 11:32:09 +1300
Subject: [PATCH] [clang-tidy] Exclude Files Not Present in the Compile
 Database

A change list may include files that are not part of the compile
database, which can cause clang-tidy to fail (e.g., due to missing
included headers). To prevent false negatives, we should skip processing
these files.
---
 .../clang-tidy/tool/clang-tidy-diff.py        | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py b/clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py
index 62cb4297c50f75..00a8c98506216b 100755
--- a/clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py
+++ b/clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py
@@ -35,6 +35,7 @@
 import tempfile
 import threading
 import traceback
+from pathlib import Path
 
 try:
     import yaml
@@ -124,6 +125,19 @@ def merge_replacement_files(tmpdir, mergefile):
         open(mergefile, "w").close()
 
 
+def get_compiling_file_list(compiledb : Path) -> list[Path]:
+    """ Read a compile_commands.json database and return a list of file paths """
+    file_list = []
+    with open(compiledb) as db_file:
+        db_json = json.load(db_file)
+        for entry in db_json:
+            if "file" not in entry:
+                continue
+            if entry["file"] not in file_list:
+                file_list.append(Path(entry["file"]))
+    return file_list
+
+
 def main():
     parser = argparse.ArgumentParser(
         description="Run clang-tidy against changed files, and "
@@ -243,6 +257,12 @@ def main():
 
     args = parser.parse_args(argv)
 
+    # Read compile_commands.json database to extract a compiling file list
+    current_dir = Path(__file__).parent.resolve()
+    compile_commands_json = (current_dir / args.build_path) if args.build_path else current_dir
+    compile_commands_json = (compile_commands_json / "compile_commands.json")
+    compiling_files = get_compiling_file_list(compile_commands_json)
+
     # Extract changed lines for each file.
     filename = None
     lines_by_file = {}
@@ -260,6 +280,10 @@ def main():
             if not re.match("^%s$" % args.iregex, filename, re.IGNORECASE):
                 continue
 
+        # Skip any files not in the compiling list
+        if (current_dir / filename) not in compiling_files:
+            continue
+
         match = re.search(r"^@@.*\+(\d+)(,(\d+))?", line)
         if match:
             start_line = int(match.group(1))



More information about the cfe-commits mailing list