File indexing completed on 2024-05-12 05:52:05

0001 /*
0002     SPDX-FileCopyrightText: 2019 Mark Nauwelaerts <mark.nauwelaerts@gmail.com>
0003     SPDX-FileCopyrightText: 2022 Waqar Ahmed <waqar.17a@gmail.com>
0004     SPDX-License-Identifier: MIT
0005 */
0006 #pragma once
0007 
0008 #include <KConfigGroup>
0009 #include <QList>
0010 #include <QSet>
0011 #include <QString>
0012 
0013 class SessionDiagnosticSuppressions
0014 {
0015     // file -> suppression
0016     // (empty file matches any file)
0017     QHash<QString, QSet<QString>> m_suppressions;
0018     const QString ENTRY_PREFIX{QStringLiteral("File_")};
0019 
0020 public:
0021     void readSessionConfig(const KConfigGroup &cg)
0022     {
0023         const auto groups = cg.keyList();
0024         for (const auto &fkey : groups) {
0025             if (fkey.startsWith(ENTRY_PREFIX)) {
0026                 QString fname = fkey.mid(ENTRY_PREFIX.size());
0027                 QStringList entries = cg.readEntry(fkey, QStringList());
0028                 if (entries.size()) {
0029                     m_suppressions[fname] = {entries.begin(), entries.end()};
0030                 }
0031             }
0032         }
0033     }
0034 
0035     void writeSessionConfig(KConfigGroup &cg)
0036     {
0037         // clear existing entries
0038         cg.deleteGroup(QLatin1String());
0039         for (auto it = m_suppressions.begin(); it != m_suppressions.end(); ++it) {
0040             QStringList entries = it.value().values();
0041             if (entries.size()) {
0042                 cg.writeEntry(ENTRY_PREFIX + it.key(), entries);
0043             }
0044         }
0045     }
0046 
0047     void add(const QString &file, const QString &diagnostic)
0048     {
0049         m_suppressions[file].insert(diagnostic);
0050     }
0051 
0052     void remove(const QString &file, const QString &diagnostic)
0053     {
0054         auto it = m_suppressions.find(file);
0055         if (it != m_suppressions.end()) {
0056             it->remove(diagnostic);
0057         }
0058     }
0059 
0060     bool hasSuppression(const QString &file, const QString &diagnostic)
0061     {
0062         auto it = m_suppressions.find(file);
0063         if (it != m_suppressions.end()) {
0064             return it->contains(diagnostic);
0065         } else {
0066             return false;
0067         }
0068     }
0069 
0070     std::vector<QString> getSuppressions(const QString &file)
0071     {
0072         std::vector<QString> result;
0073 
0074         for (const auto &entry : {QString(), file}) {
0075             auto it = m_suppressions.find(entry);
0076             if (it != m_suppressions.end()) {
0077                 const auto ds = it.value();
0078                 for (const auto &d : ds) {
0079                     result.push_back(d);
0080                 }
0081             }
0082         }
0083         return result;
0084     }
0085 };