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 }