aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSergio Martins <smartins@kde.org>2019-08-04 18:21:40 +0100
committerSergio Martins <smartins@kde.org>2019-08-04 18:21:40 +0100
commit7a3d9cc18d96d22f8f3613396fc21a03f7f023d4 (patch)
tree938c91af96a3c3048bd91b3db8f13919554cfdaf /src
parent3af178f500c91bd34d98b1c1ea82fd5baf4b95c7 (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.cpp8
-rw-r--r--src/Clazy.h2
-rw-r--r--src/ClazyContext.cpp18
-rw-r--r--src/ClazyContext.h2
-rw-r--r--src/ClazyStandaloneMain.cpp12
-rw-r--r--src/FixItExporter.cpp23
-rw-r--r--src/FixItExporter.h8
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