[include-cleaner] Avoid a caching issue when running --edit mode on multiple files.
authorHaojian Wu <hokein.wu@gmail.com>
Thu, 13 Jul 2023 12:03:24 +0000 (14:03 +0200)
committerHaojian Wu <hokein.wu@gmail.com>
Tue, 18 Jul 2023 11:21:23 +0000 (13:21 +0200)
Snapshot all analysing files before running the tool, this makes sure
that we analyse all files statelessly and avoid the FileManager caching issue
when running `-edit` on multiple files.

Differential Revision: https://reviews.llvm.org/D155195

clang-tools-extra/include-cleaner/tool/IncludeCleaner.cpp

index ae4d1e9..193fdae 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Regex.h"
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/raw_ostream.h"
@@ -270,12 +271,24 @@ int main(int argc, const char **argv) {
       }
     }
   }
+
+  clang::tooling::ClangTool Tool(OptionsParser->getCompilations(),
+                                 OptionsParser->getSourcePathList());
+  std::vector<std::unique_ptr<llvm::MemoryBuffer>> Buffers;
+  for (const auto &File : OptionsParser->getSourcePathList()) {
+    auto Content = llvm::MemoryBuffer::getFile(File);
+    if (!Content) {
+      llvm::errs() << "Error: can't read file '" << File
+                   << "': " << Content.getError().message() << "\n";
+      return 1;
+    }
+    Buffers.push_back(std::move(Content.get()));
+    Tool.mapVirtualFile(File, Buffers.back()->getBuffer());
+  }
+
   auto HeaderFilter = headerFilter();
   if (!HeaderFilter)
     return 1; // error already reported.
   ActionFactory Factory(HeaderFilter);
-  return clang::tooling::ClangTool(OptionsParser->getCompilations(),
-                                   OptionsParser->getSourcePathList())
-             .run(&Factory) ||
-         Errors != 0;
+  return Tool.run(&Factory) || Errors != 0;
 }