File indexing completed on 2024-05-12 05:51:44

0001 /*  This file is part of the Kate project.
0002  *
0003  *  SPDX-FileCopyrightText: 2017 Héctor Mesa Jiménez <hector@lcc.uma.es>
0004  *
0005  *  SPDX-License-Identifier: LGPL-2.0-or-later
0006  */
0007 
0008 #include "cppcheck.h"
0009 #include "kateproject.h"
0010 
0011 #include <KLocalizedString>
0012 #include <QRegularExpression>
0013 #include <QThread>
0014 
0015 KateProjectCodeAnalysisToolCppcheck::KateProjectCodeAnalysisToolCppcheck(QObject *parent)
0016     : KateProjectCodeAnalysisTool(parent)
0017 {
0018 }
0019 
0020 KateProjectCodeAnalysisToolCppcheck::~KateProjectCodeAnalysisToolCppcheck()
0021 {
0022 }
0023 
0024 QString KateProjectCodeAnalysisToolCppcheck::name() const
0025 {
0026     return i18n("Cppcheck (C++)");
0027 }
0028 
0029 QString KateProjectCodeAnalysisToolCppcheck::description() const
0030 {
0031     return i18n("Cppcheck is a static analysis tool for C/C++ code");
0032 }
0033 
0034 QString KateProjectCodeAnalysisToolCppcheck::fileExtensions() const
0035 {
0036     return QStringLiteral("cpp|cxx|cc|c++|c|tpp|txx");
0037 }
0038 
0039 QStringList KateProjectCodeAnalysisToolCppcheck::filter(const QStringList &files) const
0040 {
0041     // c++ files
0042     return files.filter(
0043         QRegularExpression(QStringLiteral("\\.(") + fileExtensions().replace(QStringLiteral("+"), QStringLiteral("\\+")) + QStringLiteral(")$")));
0044 }
0045 
0046 QString KateProjectCodeAnalysisToolCppcheck::path() const
0047 {
0048     return QStringLiteral("cppcheck");
0049 }
0050 
0051 QStringList KateProjectCodeAnalysisToolCppcheck::arguments()
0052 {
0053     QStringList _args;
0054 
0055     _args << QStringLiteral("-q") << QStringLiteral("-f") << QStringLiteral("-j") + QString::number(QThread::idealThreadCount())
0056           << QStringLiteral("--inline-suppr") << QStringLiteral("--enable=all")
0057           << QStringLiteral("--template={file}////{line}////{column}////{severity}////{id}////{message}") << QStringLiteral("--file-list=-");
0058 
0059     return _args;
0060 }
0061 
0062 QString KateProjectCodeAnalysisToolCppcheck::notInstalledMessage() const
0063 {
0064     return i18n("Please install 'cppcheck'.");
0065 }
0066 
0067 FileDiagnostics KateProjectCodeAnalysisToolCppcheck::parseLine(const QString &line) const
0068 {
0069     const QStringList elements = line.split(QLatin1String("////"), Qt::SkipEmptyParts);
0070     if (elements.size() < 4) {
0071         return {};
0072     }
0073 
0074     Diagnostic d;
0075     const auto url = QUrl::fromLocalFile(elements[0]);
0076     int ln = elements[1].toInt() - 1;
0077     int col = elements[2].toInt() - 1;
0078     d.range = KTextEditor::Range(ln, col, ln, col);
0079     d.source = QStringLiteral("cppcheck");
0080     d.code = elements[4];
0081     d.message = elements[5];
0082     if (elements[3].startsWith(QLatin1String("warn"))) {
0083         d.severity = DiagnosticSeverity::Warning;
0084     } else if (elements[3].startsWith(QLatin1String("error"))) {
0085         d.severity = DiagnosticSeverity::Error;
0086     } else {
0087         d.severity = DiagnosticSeverity::Information;
0088     }
0089     return {url, {d}};
0090 }
0091 
0092 QString KateProjectCodeAnalysisToolCppcheck::stdinMessages()
0093 {
0094     // filenames are written to stdin (--file-list=-)
0095 
0096     if (!m_project) {
0097         return QString();
0098     }
0099 
0100     auto &&fileList = filter(m_project->files());
0101     setActualFilesCount(fileList.size());
0102     return fileList.join(QLatin1Char('\n'));
0103 }