[clang-tools-extra] r323196 - [clang-tidy] Add -vfsoverlay flag
Ilya Biryukov via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 23 04:31:06 PST 2018
Author: ibiryukov
Date: Tue Jan 23 04:31:06 2018
New Revision: 323196
URL: http://llvm.org/viewvc/llvm-project?rev=323196&view=rev
Log:
[clang-tidy] Add -vfsoverlay flag
Summary:
It allows to remap and override files and directories on disk when
running clang-tidy. The intended use case for the flag is running
standalone clang-tidy binary for IDE and editor integration.
Patch by Vladimir Plyashkun.
Reviewers: alexfh, benlangmuir, ilya-biryukov
Reviewed By: ilya-biryukov
Subscribers: ilya-biryukov, cfe-commits
Tags: #clang-tools-extra
Differential Revision: https://reviews.llvm.org/D41535
Added:
clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/
clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/actual_header.h
clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/vfsoverlay.yaml
clang-tools-extra/trunk/test/clang-tidy/vfsoverlay.cpp
Modified:
clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp
clang-tools-extra/trunk/clang-tidy/ClangTidy.h
clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp
Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp?rev=323196&r1=323195&r2=323196&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp Tue Jan 23 04:31:06 2018
@@ -89,8 +89,9 @@ private:
class ErrorReporter {
public:
- ErrorReporter(ClangTidyContext &Context, bool ApplyFixes)
- : Files(FileSystemOptions()), DiagOpts(new DiagnosticOptions()),
+ ErrorReporter(ClangTidyContext &Context, bool ApplyFixes,
+ llvm::IntrusiveRefCntPtr<vfs::FileSystem> BaseFS)
+ : Files(FileSystemOptions(), BaseFS), DiagOpts(new DiagnosticOptions()),
DiagPrinter(new TextDiagnosticPrinter(llvm::outs(), &*DiagOpts)),
Diags(IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs), &*DiagOpts,
DiagPrinter),
@@ -474,8 +475,11 @@ ClangTidyOptions::OptionMap getCheckOpti
void runClangTidy(clang::tidy::ClangTidyContext &Context,
const CompilationDatabase &Compilations,
- ArrayRef<std::string> InputFiles, ProfileData *Profile) {
- ClangTool Tool(Compilations, InputFiles);
+ ArrayRef<std::string> InputFiles,
+ llvm::IntrusiveRefCntPtr<vfs::FileSystem> BaseFS,
+ ProfileData *Profile) {
+ ClangTool Tool(Compilations, InputFiles,
+ std::make_shared<PCHContainerOperations>(), BaseFS);
// Add extra arguments passed by the clang-tidy command-line.
ArgumentsAdjuster PerFileExtraArgumentsInserter =
@@ -546,8 +550,9 @@ void runClangTidy(clang::tidy::ClangTidy
}
void handleErrors(ClangTidyContext &Context, bool Fix,
- unsigned &WarningsAsErrorsCount) {
- ErrorReporter Reporter(Context, Fix);
+ unsigned &WarningsAsErrorsCount,
+ llvm::IntrusiveRefCntPtr<vfs::FileSystem> BaseFS) {
+ ErrorReporter Reporter(Context, Fix, BaseFS);
vfs::FileSystem &FileSystem =
*Reporter.getSourceManager().getFileManager().getVirtualFileSystem();
auto InitialWorkingDir = FileSystem.getCurrentWorkingDirectory();
Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.h?rev=323196&r1=323195&r2=323196&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/ClangTidy.h (original)
+++ clang-tools-extra/trunk/clang-tidy/ClangTidy.h Tue Jan 23 04:31:06 2018
@@ -227,6 +227,7 @@ ClangTidyOptions::OptionMap getCheckOpti
void runClangTidy(clang::tidy::ClangTidyContext &Context,
const tooling::CompilationDatabase &Compilations,
ArrayRef<std::string> InputFiles,
+ llvm::IntrusiveRefCntPtr<vfs::FileSystem> BaseFS,
ProfileData *Profile = nullptr);
// FIXME: This interface will need to be significantly extended to be useful.
@@ -236,7 +237,8 @@ void runClangTidy(clang::tidy::ClangTidy
/// Errors containing fixes are automatically applied and reformatted. If no
/// clang-format configuration file is found, the given \P FormatStyle is used.
void handleErrors(ClangTidyContext &Context, bool Fix,
- unsigned &WarningsAsErrorsCount);
+ unsigned &WarningsAsErrorsCount,
+ llvm::IntrusiveRefCntPtr<vfs::FileSystem> BaseFS);
/// \brief Serializes replacements into YAML and writes them to the specified
/// output stream.
Modified: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=323196&r1=323195&r2=323196&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Tue Jan 23 04:31:06 2018
@@ -209,6 +209,13 @@ options are specified.
cl::init(false),
cl::cat(ClangTidyCategory));
+static cl::opt<std::string> VfsOverlay("vfsoverlay", cl::desc(R"(
+Overlay the virtual filesystem described by file
+over the real file system.
+)"),
+ cl::value_desc("filename"),
+ cl::cat(ClangTidyCategory));
+
namespace clang {
namespace tidy {
@@ -330,6 +337,30 @@ static std::unique_ptr<ClangTidyOptionsP
OverrideOptions);
}
+llvm::IntrusiveRefCntPtr<vfs::FileSystem>
+getVfsOverlayFromFile(const std::string &OverlayFile) {
+ llvm::IntrusiveRefCntPtr<vfs::OverlayFileSystem> OverlayFS(
+ new vfs::OverlayFileSystem(vfs::getRealFileSystem()));
+ llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
+ OverlayFS->getBufferForFile(OverlayFile);
+ if (!Buffer) {
+ llvm::errs() << "Can't load virtual filesystem overlay file '"
+ << OverlayFile << "': " << Buffer.getError().message()
+ << ".\n";
+ return nullptr;
+ }
+
+ IntrusiveRefCntPtr<vfs::FileSystem> FS = vfs::getVFSFromYAML(
+ std::move(Buffer.get()), /*DiagHandler*/ nullptr, OverlayFile);
+ if (!FS) {
+ llvm::errs() << "Error: invalid virtual filesystem overlay file '"
+ << OverlayFile << "'.\n";
+ return nullptr;
+ }
+ OverlayFS->pushOverlay(FS);
+ return OverlayFS;
+}
+
static int clangTidyMain(int argc, const char **argv) {
CommonOptionsParser OptionsParser(argc, argv, ClangTidyCategory,
cl::ZeroOrMore);
@@ -401,6 +432,11 @@ static int clangTidyMain(int argc, const
llvm::cl::PrintHelpMessage(/*Hidden=*/false, /*Categorized=*/true);
return 0;
}
+ llvm::IntrusiveRefCntPtr<vfs::FileSystem> BaseFS(
+ VfsOverlay.empty() ? vfs::getRealFileSystem()
+ : getVfsOverlayFromFile(VfsOverlay));
+ if (!BaseFS)
+ return 1;
ProfileData Profile;
@@ -409,7 +445,7 @@ static int clangTidyMain(int argc, const
llvm::InitializeAllAsmParsers();
ClangTidyContext Context(std::move(OwningOptionsProvider));
- runClangTidy(Context, OptionsParser.getCompilations(), PathList,
+ runClangTidy(Context, OptionsParser.getCompilations(), PathList, BaseFS,
EnableCheckProfile ? &Profile : nullptr);
ArrayRef<ClangTidyError> Errors = Context.getErrors();
bool FoundErrors =
@@ -422,7 +458,8 @@ static int clangTidyMain(int argc, const
unsigned WErrorCount = 0;
// -fix-errors implies -fix.
- handleErrors(Context, (FixErrors || Fix) && !DisableFixes, WErrorCount);
+ handleErrors(Context, (FixErrors || Fix) && !DisableFixes, WErrorCount,
+ BaseFS);
if (!ExportFixes.empty() && !Errors.empty()) {
std::error_code EC;
Added: clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/actual_header.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/actual_header.h?rev=323196&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/actual_header.h (added)
+++ clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/actual_header.h Tue Jan 23 04:31:06 2018
@@ -0,0 +1 @@
+struct X {};
Added: clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/vfsoverlay.yaml
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/vfsoverlay.yaml?rev=323196&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/vfsoverlay.yaml (added)
+++ clang-tools-extra/trunk/test/clang-tidy/Inputs/vfsoverlay/vfsoverlay.yaml Tue Jan 23 04:31:06 2018
@@ -0,0 +1,12 @@
+{
+ 'version': 0,
+ 'roots': [
+ { 'name': 'OUT_DIR', 'type': 'directory',
+ 'contents': [
+ { 'name': 'not_real.h', 'type': 'file',
+ 'external-contents': 'INPUT_DIR/actual_header.h'
+ }
+ ]
+ }
+ ]
+}
Added: clang-tools-extra/trunk/test/clang-tidy/vfsoverlay.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/vfsoverlay.cpp?rev=323196&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/vfsoverlay.cpp (added)
+++ clang-tools-extra/trunk/test/clang-tidy/vfsoverlay.cpp Tue Jan 23 04:31:06 2018
@@ -0,0 +1,8 @@
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs/vfsoverlay:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay/vfsoverlay.yaml > %t.yaml
+// RUN: clang-tidy %s -checks='-*,modernize-use-nullptr' -vfsoverlay %t.yaml -- -I %t | FileCheck %s
+// REQUIRES: shell
+
+#include "not_real.h"
+
+X *ptr = 0;
+// CHECK: warning: use nullptr [modernize-use-nullptr]
More information about the cfe-commits
mailing list