File indexing completed on 2024-04-28 16:57:50

0001 /*
0002   This file is part of the clazy static checker.
0003 
0004     Copyright (C) 2019 Christian Gagneraud <chgans@gmail.com>
0005 
0006     This library is free software; you can redistribute it and/or
0007     modify it under the terms of the GNU Library General Public
0008     License as published by the Free Software Foundation; either
0009     version 2 of the License, or (at your option) any later version.
0010 
0011     This library is distributed in the hope that it will be useful,
0012     but WITHOUT ANY WARRANTY; without even the implied warranty of
0013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014     Library General Public License for more details.
0015 
0016     You should have received a copy of the GNU Library General Public License
0017     along with this library; see the file COPYING.LIB.  If not, write to
0018     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0019     Boston, MA 02110-1301, USA.
0020 */
0021 
0022 #ifndef CLAZY_FIX_IT_EXPORTER_H
0023 #define CLAZY_FIX_IT_EXPORTER_H
0024 
0025 #include <clang/Basic/Diagnostic.h>
0026 #include <clang/Tooling/Core/Diagnostic.h>
0027 
0028 namespace clang {
0029 class FixItOptions;
0030 }
0031 
0032 class FixItExporter
0033     : public clang::DiagnosticConsumer
0034 {
0035 public:
0036     explicit FixItExporter(clang::DiagnosticsEngine &DiagEngine, clang::SourceManager &SourceMgr,
0037                            const clang::LangOptions &LangOpts, const std::string &exportFixes,
0038                            bool isClazyStandalone);
0039 
0040     ~FixItExporter() override;
0041 
0042     bool IncludeInDiagnosticCounts() const override;
0043 
0044     void BeginSourceFile(const clang::LangOptions &LangOpts,
0045                          const clang::Preprocessor *PP = nullptr) override;
0046 
0047     void EndSourceFile() override;
0048 
0049     void HandleDiagnostic(clang::DiagnosticsEngine::Level DiagLevel,
0050                           const clang::Diagnostic &Info) override;
0051 
0052     void Export();
0053 
0054     /// Emit a diagnostic via the adapted diagnostic client.
0055     void Diag(clang::SourceLocation Loc, unsigned DiagID);
0056 
0057 private:
0058     clang::DiagnosticsEngine &DiagEngine;
0059     clang::SourceManager &SourceMgr;
0060     const clang::LangOptions &LangOpts;
0061     const std::string exportFixes;
0062     DiagnosticConsumer *Client = nullptr;
0063     std::unique_ptr<DiagnosticConsumer> Owner;
0064     bool m_recordNotes = false;
0065     clang::tooling::Diagnostic ConvertDiagnostic(const clang::Diagnostic &Info);
0066     clang::tooling::Replacement ConvertFixIt(const clang::FixItHint &Hint);
0067 };
0068 
0069 #endif // CLAZY_FIX_IT_EXPORTER_H