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 }