diff options
author | Sergio Martins <smartins@kde.org> | 2019-08-04 18:21:40 +0100 |
---|---|---|
committer | Sergio Martins <smartins@kde.org> | 2019-08-04 18:21:40 +0100 |
commit | 7a3d9cc18d96d22f8f3613396fc21a03f7f023d4 (patch) | |
tree | 938c91af96a3c3048bd91b3db8f13919554cfdaf /src | |
parent | 3af178f500c91bd34d98b1c1ea82fd5baf4b95c7 (diff) |
Fix -export-fixes on clazy-standalone with multiple files
TUDiag was being exported multiple times rewriting the same file.
Export at the end only.
BUG: 409983
Diffstat (limited to 'src')
-rw-r--r-- | src/Clazy.cpp | 8 | ||||
-rw-r--r-- | src/Clazy.h | 2 | ||||
-rw-r--r-- | src/ClazyContext.cpp | 18 | ||||
-rw-r--r-- | src/ClazyContext.h | 2 | ||||
-rw-r--r-- | src/ClazyStandaloneMain.cpp | 12 | ||||
-rw-r--r-- | src/FixItExporter.cpp | 23 | ||||
-rw-r--r-- | src/FixItExporter.h | 8 |
7 files changed, 54 insertions, 19 deletions
diff --git a/src/Clazy.cpp b/src/Clazy.cpp index 5f47a1bf..fd3343e1 100644 --- a/src/Clazy.cpp +++ b/src/Clazy.cpp @@ -238,7 +238,7 @@ bool ClazyASTAction::ParseArgs(const CompilerInstance &ci, const std::vector<std if (parseArgument("help", args)) { m_context = new ClazyContext(ci, headerFilter, ignoreDirs, - exportFixesFilename, ClazyContext::ClazyOption_None); + exportFixesFilename, {}, ClazyContext::ClazyOption_None); PrintHelp(llvm::errs()); return true; } @@ -264,7 +264,7 @@ bool ClazyASTAction::ParseArgs(const CompilerInstance &ci, const std::vector<std if (parseArgument("export-fixes", args)) exportFixesFilename = args.at(0); - m_context = new ClazyContext(ci, headerFilter, ignoreDirs, exportFixesFilename, m_options); + m_context = new ClazyContext(ci, headerFilter, ignoreDirs, exportFixesFilename, {}, m_options); // This argument is for debugging purposes const bool dbgPrintRequestedChecks = parseArgument("print-requested-checks", args); @@ -370,19 +370,21 @@ ClazyStandaloneASTAction::ClazyStandaloneASTAction(const string &checkList, const string &headerFilter, const string &ignoreDirs, const string &exportFixesFilename, + const std::vector<string> &translationUnitPaths, ClazyContext::ClazyOptions options) : clang::ASTFrontendAction() , m_checkList(checkList.empty() ? "level1" : checkList) , m_headerFilter(headerFilter.empty() ? getEnvVariable("CLAZY_HEADER_FILTER") : headerFilter) , m_ignoreDirs(ignoreDirs.empty() ? getEnvVariable("CLAZY_IGNORE_DIRS") : ignoreDirs) , m_exportFixesFilename(exportFixesFilename) + , m_translationUnitPaths(translationUnitPaths) , m_options(options) { } unique_ptr<ASTConsumer> ClazyStandaloneASTAction::CreateASTConsumer(CompilerInstance &ci, llvm::StringRef) { - auto context = new ClazyContext(ci, m_headerFilter, m_ignoreDirs, m_exportFixesFilename, m_options); + auto context = new ClazyContext(ci, m_headerFilter, m_ignoreDirs, m_exportFixesFilename, m_translationUnitPaths, m_options); auto astConsumer = new ClazyASTConsumer(context); auto cm = CheckManager::instance(); diff --git a/src/Clazy.h b/src/Clazy.h index 13dbad90..ccf1e934 100644 --- a/src/Clazy.h +++ b/src/Clazy.h @@ -86,6 +86,7 @@ public: const std::string &headerFilter, const std::string &ignoreDirs, const std::string &exportFixesFilename, + const std::vector<std::string> &translationUnitPaths, ClazyContext::ClazyOptions = ClazyContext::ClazyOption_None); protected: std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(clang::CompilerInstance &ci, llvm::StringRef) override; @@ -94,6 +95,7 @@ private: const std::string m_headerFilter; const std::string m_ignoreDirs; const std::string m_exportFixesFilename; + const std::vector<std::string> m_translationUnitPaths; const ClazyContext::ClazyOptions m_options; }; diff --git a/src/ClazyContext.cpp b/src/ClazyContext.cpp index 33d7dccf..5e824c54 100644 --- a/src/ClazyContext.cpp +++ b/src/ClazyContext.cpp @@ -38,13 +38,15 @@ using namespace clang; ClazyContext::ClazyContext(const clang::CompilerInstance &compiler, const string &headerFilter, const string &ignoreDirs, - string exportFixesFilename, ClazyOptions opts) + string exportFixesFilename, + const std::vector<string> &translationUnitPaths, ClazyOptions opts) : ci(compiler) , astContext(ci.getASTContext()) , sm(ci.getSourceManager()) , m_noWerror(getenv("CLAZY_NO_WERROR") != nullptr) // Allows user to make clazy ignore -Werror , options(opts) , extraOptions(clazy::splitString(getenv("CLAZY_EXTRA_OPTIONS"), ',')) + , m_translationUnitPaths(translationUnitPaths) { if (!headerFilter.empty()) headerFilterRegex = std::unique_ptr<llvm::Regex>(new llvm::Regex(headerFilter)); @@ -60,7 +62,9 @@ ClazyContext::ClazyContext(const clang::CompilerInstance &compiler, exportFixesFilename = fileEntry->getName().str() + ".clazy.yaml"; } - exporter = new FixItExporter(ci.getDiagnostics(), sm, ci.getLangOpts(), exportFixesFilename); + const bool isClazyStandalone = !translationUnitPaths.empty(); + exporter = new FixItExporter(ci.getDiagnostics(), sm, ci.getLangOpts(), + exportFixesFilename, isClazyStandalone); } } @@ -70,8 +74,16 @@ ClazyContext::~ClazyContext() delete accessSpecifierManager; delete parentMap; + static unsigned long count = 0; + count++; + if (exporter) { - exporter->Export(); + // With clazy-standalone we use the same YAML file for all translation-units, so only + // write out the last one. With clazy-plugin there's a YAML file per translation unit. + const bool isClazyPlugin = m_translationUnitPaths.empty(); + const bool isLast = count == m_translationUnitPaths.size(); + if (isLast || isClazyPlugin) + exporter->Export(); delete exporter; } diff --git a/src/ClazyContext.h b/src/ClazyContext.h index db8ec1e8..69219d2f 100644 --- a/src/ClazyContext.h +++ b/src/ClazyContext.h @@ -71,6 +71,7 @@ public: const std::string &headerFilter, const std::string &ignoreDirs, std::string exportFixesFilename, + const std::vector<std::string> &translationUnitPaths, ClazyOptions = ClazyOption_None); ~ClazyContext(); @@ -179,6 +180,7 @@ public: clang::Decl *lastDecl = nullptr; std::unique_ptr<llvm::Regex> headerFilterRegex; std::unique_ptr<llvm::Regex> ignoreDirsRegex; + const std::vector<std::string> m_translationUnitPaths; }; #endif diff --git a/src/ClazyStandaloneMain.cpp b/src/ClazyStandaloneMain.cpp index 7d454daa..b9af72d7 100644 --- a/src/ClazyStandaloneMain.cpp +++ b/src/ClazyStandaloneMain.cpp @@ -78,8 +78,11 @@ class ClazyToolActionFactory : public clang::tooling::FrontendActionFactory { public: - ClazyToolActionFactory() - : FrontendActionFactory() {} + ClazyToolActionFactory(std::vector<std::string> paths) + : FrontendActionFactory() + , m_paths(std::move(paths)) + { + } FrontendAction *create() override { @@ -106,8 +109,9 @@ public: // TODO: We need to agregate the fixes with previous run return new ClazyStandaloneASTAction(s_checks.getValue(), s_headerFilter.getValue(), s_ignoreDirs.getValue(), s_exportFixes.getValue(), - options); + m_paths, options); } + std::vector<std::string> m_paths; }; int main(int argc, const char **argv) @@ -115,5 +119,5 @@ int main(int argc, const char **argv) CommonOptionsParser optionsParser(argc, argv, s_clazyCategory); ClangTool tool(optionsParser.getCompilations(), optionsParser.getSourcePathList()); - return tool.run(new ClazyToolActionFactory()); + return tool.run(new ClazyToolActionFactory(optionsParser.getSourcePathList())); } diff --git a/src/FixItExporter.cpp b/src/FixItExporter.cpp index c8d6b505..d3a55806 100644 --- a/src/FixItExporter.cpp +++ b/src/FixItExporter.cpp @@ -31,13 +31,26 @@ using namespace clang; +static clang::tooling::TranslationUnitDiagnostics& getTuDiag() +{ + static clang::tooling::TranslationUnitDiagnostics s_tudiag; + return s_tudiag; +} + FixItExporter::FixItExporter(DiagnosticsEngine &DiagEngine, SourceManager &SourceMgr, - const LangOptions &LangOpts, const std::string &exportFixes) + const LangOptions &LangOpts, const std::string &exportFixes, + bool isClazyStandalone) : DiagEngine(DiagEngine) , SourceMgr(SourceMgr) , LangOpts(LangOpts) , exportFixes(exportFixes) + , m_isClazyStandalone(isClazyStandalone) { + if (!isClazyStandalone) { + // When using clazy as plugin each translation unit fixes goes to a separate YAML file + getTuDiag().Diagnostics.clear(); + } + Owner = DiagEngine.takeClient(); Client = DiagEngine.getClient(); DiagEngine.setClient(this, false); @@ -56,7 +69,7 @@ void FixItExporter::BeginSourceFile(const LangOptions &LangOpts, const Preproces const auto id = SourceMgr.getMainFileID(); const auto entry = SourceMgr.getFileEntryForID(id); - TUDiag.MainSourceFile = entry->getName(); + getTuDiag().MainSourceFile = entry->getName(); } bool FixItExporter::IncludeInDiagnosticCounts() const @@ -145,7 +158,7 @@ void FixItExporter::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const D Diag(Info.getLocation(), diag::note_fixit_failed); } } - TUDiag.Diagnostics.push_back(ToolingDiag); + getTuDiag().Diagnostics.push_back(ToolingDiag); m_recordNotes = true; } // FIXME: We do not receive notes. @@ -154,7 +167,7 @@ void FixItExporter::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const D const auto FileName = SourceMgr.getFilename(Info.getLocation()); llvm::errs() << "Handling Note for " << FileName.str() << "\n"; #endif - auto diags = TUDiag.Diagnostics.back(); + auto diags = getTuDiag().Diagnostics.back(); auto diag = ConvertDiagnostic(Info); diags.Notes.append(1, diag.Message); } @@ -168,7 +181,7 @@ void FixItExporter::Export() std::error_code EC; llvm::raw_fd_ostream OS(exportFixes, EC, llvm::sys::fs::F_None); llvm::yaml::Output YAML(OS); - YAML << TUDiag; + YAML << getTuDiag(); } void FixItExporter::Diag(SourceLocation Loc, unsigned DiagID) diff --git a/src/FixItExporter.h b/src/FixItExporter.h index 7bb5d87a..a3d1f555 100644 --- a/src/FixItExporter.h +++ b/src/FixItExporter.h @@ -33,8 +33,9 @@ class FixItExporter : public clang::DiagnosticConsumer { public: - FixItExporter(clang::DiagnosticsEngine &DiagEngine, clang::SourceManager &SourceMgr, - const clang::LangOptions &LangOpts, const std::string &exportFixes); + explicit FixItExporter(clang::DiagnosticsEngine &DiagEngine, clang::SourceManager &SourceMgr, + const clang::LangOptions &LangOpts, const std::string &exportFixes, + bool isClazyStandalone); ~FixItExporter() override; @@ -60,11 +61,10 @@ private: const std::string exportFixes; DiagnosticConsumer *Client = nullptr; std::unique_ptr<DiagnosticConsumer> Owner; - clang::tooling::TranslationUnitDiagnostics TUDiag; bool m_recordNotes = false; clang::tooling::Diagnostic ConvertDiagnostic(const clang::Diagnostic &Info); clang::tooling::Replacement ConvertFixIt(const clang::FixItHint &Hint); - + const bool m_isClazyStandalone; }; #endif // CLAZY_FIX_IT_EXPORTER_H |