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] _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits