File indexing completed on 2024-05-12 04:39:07

0001 /*
0002     SPDX-FileCopyrightText: 2015 Sergey Kalinichev <kalinichev.so.0@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "clangsettingsmanager.h"
0008 
0009 #include <KConfigGroup>
0010 #include <KConfig>
0011 
0012 #include <interfaces/icore.h>
0013 #include <interfaces/isession.h>
0014 #include <interfaces/iproject.h>
0015 #include <custom-definesandincludes/idefinesandincludesmanager.h>
0016 #include <util/path.h>
0017 
0018 #include <project/projectmodel.h>
0019 
0020 using namespace KDevelop;
0021 
0022 namespace
0023 {
0024     const QString settingsGroup = QStringLiteral("Clang Settings");
0025 
0026     const QString macros = QStringLiteral("macros");
0027     const QString lookAhead = QStringLiteral("lookAhead");
0028 
0029     const QString forwardDeclare = QStringLiteral("forwardDeclare");
0030 
0031 AssistantsSettings readAssistantsSettings(KConfig* cfg)
0032 {
0033     auto grp = cfg->group(settingsGroup);
0034     AssistantsSettings settings;
0035 
0036     settings.forwardDeclare = grp.readEntry(forwardDeclare, true);
0037 
0038     return settings;
0039 }
0040 
0041 CodeCompletionSettings readCodeCompletionSettings(KConfig* cfg)
0042 {
0043     auto grp = cfg->group(settingsGroup);
0044     CodeCompletionSettings settings;
0045 
0046     settings.macros = grp.readEntry(macros, true);
0047     settings.lookAhead = grp.readEntry(lookAhead, false);
0048 
0049     return settings;
0050 }
0051 }
0052 
0053 ClangSettingsManager* ClangSettingsManager::self()
0054 {
0055     static ClangSettingsManager manager;
0056     return &manager;
0057 }
0058 
0059 AssistantsSettings ClangSettingsManager::assistantsSettings() const
0060 {
0061     auto cfg = ICore::self()->activeSession()->config();
0062     return readAssistantsSettings(cfg.data());
0063 }
0064 
0065 CodeCompletionSettings ClangSettingsManager::codeCompletionSettings() const
0066 {
0067     if (m_enableTesting) {
0068         CodeCompletionSettings settings;
0069         settings.lookAhead = true;
0070         settings.macros = true;
0071         return settings;
0072     }
0073 
0074     auto cfg = ICore::self()->activeSession()->config();
0075     return readCodeCompletionSettings(cfg.data());
0076 }
0077 
0078 ParserSettings ClangSettingsManager::parserSettings(KDevelop::ProjectBaseItem* item) const
0079 {
0080     return {IDefinesAndIncludesManager::manager()->parserArguments(item)};
0081 }
0082 
0083 ParserSettings ClangSettingsManager::parserSettings(const QString& path) const
0084 {
0085     return {IDefinesAndIncludesManager::manager()->parserArguments(path)};
0086 }
0087 
0088 ClangSettingsManager::ClangSettingsManager()
0089 {}
0090 
0091 bool ParserSettings::isCpp() const
0092 {
0093     return parserOptions.contains(QLatin1String("-std=c++")) || parserOptions.contains(QLatin1String("-std=gnu++"));
0094 }
0095 
0096 QVector<QByteArray> ParserSettings::toClangAPI() const
0097 {
0098     // TODO: This is not efficient.
0099     const auto list = parserOptions.splitRef(QLatin1Char(' '), Qt::SkipEmptyParts);
0100     QVector<QByteArray> result;
0101     result.reserve(list.size());
0102 
0103     std::transform(list.constBegin(), list.constEnd(),
0104                    std::back_inserter(result),
0105                    [] (const QStringRef &argument) { return argument.toUtf8(); });
0106 
0107     return result;
0108 }
0109 
0110 bool ParserSettings::operator==(const ParserSettings& rhs) const
0111 {
0112     return parserOptions == rhs.parserOptions;
0113 }