forked from qt-creator/qt-creator
Clangd: Add per-project settings
Users might want to use clangd for certain project, but not for others. Change-Id: Id29ce3349f0acd359cf7c824ece073b147ed2280 Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -30,6 +30,7 @@
|
||||
#include "cpptoolsreuse.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <projectexplorer/project.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/qtcassert.h>
|
||||
@@ -63,10 +64,12 @@ static QString skipIndexingBigFilesKey()
|
||||
static QString indexerFileSizeLimitKey()
|
||||
{ return QLatin1String(Constants::CPPTOOLS_INDEXER_FILE_SIZE_LIMIT); }
|
||||
|
||||
static QString clangdSettingsKey() { return QLatin1String("ClangdSettings"); }
|
||||
static QString useClangdKey() { return QLatin1String("UseClangd"); }
|
||||
static QString clangdPathKey() { return QLatin1String("ClangdPath"); }
|
||||
static QString clangdIndexingKey() { return QLatin1String("ClangdIndexing"); }
|
||||
static QString clangdThreadLimitKey() { return QLatin1String("ClangdThreadLimit"); }
|
||||
static QString clangdUseGlobalSettingsKey() { return QLatin1String("useGlobalSettings"); }
|
||||
|
||||
static FilePath g_defaultClangdFilePath;
|
||||
static FilePath fallbackClangdFilePath()
|
||||
@@ -323,37 +326,29 @@ void ClangdSettings::setDefaultClangdPath(const Utils::FilePath &filePath)
|
||||
g_defaultClangdFilePath = filePath;
|
||||
}
|
||||
|
||||
FilePath ClangdSettings::clangdFilePath()
|
||||
FilePath ClangdSettings::clangdFilePath() const
|
||||
{
|
||||
if (!instance().m_data.executableFilePath.isEmpty())
|
||||
return instance().m_data.executableFilePath;
|
||||
if (!m_data.executableFilePath.isEmpty())
|
||||
return m_data.executableFilePath;
|
||||
return fallbackClangdFilePath();
|
||||
}
|
||||
|
||||
void ClangdSettings::setData(const Data &data)
|
||||
{
|
||||
if (data != instance().m_data) {
|
||||
instance().m_data = data;
|
||||
instance().saveSettings();
|
||||
if (this == &instance() && data != m_data) {
|
||||
m_data = data;
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
void ClangdSettings::loadSettings()
|
||||
{
|
||||
QSettings * const s = Core::ICore::settings();
|
||||
m_data.useClangd = s->value(useClangdKey(), false).toBool();
|
||||
m_data.executableFilePath = FilePath::fromString(s->value(clangdPathKey()).toString());
|
||||
m_data.enableIndexing = s->value(clangdIndexingKey(), true).toBool();
|
||||
m_data.workerThreadLimit = s->value(clangdThreadLimitKey(), 0).toInt();
|
||||
m_data.fromMap(Core::ICore::settings()->value(clangdSettingsKey()).toMap());
|
||||
}
|
||||
|
||||
void ClangdSettings::saveSettings()
|
||||
{
|
||||
QSettings * const s = Core::ICore::settings();
|
||||
s->setValue(useClangdKey(), useClangd());
|
||||
s->setValue(clangdPathKey(), m_data.executableFilePath.toString());
|
||||
s->setValue(clangdIndexingKey(), m_data.enableIndexing);
|
||||
s->setValue(clangdThreadLimitKey(), m_data.workerThreadLimit);
|
||||
Core::ICore::settings()->setValue(clangdSettingsKey(), m_data.toMap());
|
||||
}
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
@@ -363,3 +358,66 @@ void ClangdSettings::setClangdFilePath(const Utils::FilePath &filePath)
|
||||
instance().m_data.executableFilePath = filePath;
|
||||
}
|
||||
#endif
|
||||
|
||||
ClangdProjectSettings::ClangdProjectSettings(ProjectExplorer::Project *project) : m_project(project)
|
||||
{
|
||||
loadSettings();
|
||||
}
|
||||
|
||||
ClangdSettings ClangdProjectSettings::settings() const
|
||||
{
|
||||
if (m_useGlobalSettings)
|
||||
return ClangdSettings::instance();
|
||||
return ClangdSettings(m_customSettings);
|
||||
}
|
||||
|
||||
void ClangdProjectSettings::setSettings(const ClangdSettings::Data &data)
|
||||
{
|
||||
m_customSettings = data;
|
||||
saveSettings();
|
||||
}
|
||||
|
||||
void ClangdProjectSettings::setUseGlobalSettings(bool useGlobal)
|
||||
{
|
||||
m_useGlobalSettings = useGlobal;
|
||||
saveSettings();
|
||||
}
|
||||
|
||||
void ClangdProjectSettings::loadSettings()
|
||||
{
|
||||
if (!m_project)
|
||||
return;
|
||||
const QVariantMap data = m_project->namedSettings(clangdSettingsKey()).toMap();
|
||||
m_useGlobalSettings = data.value(clangdUseGlobalSettingsKey(), true).toBool();
|
||||
if (!m_useGlobalSettings)
|
||||
m_customSettings.fromMap(data);
|
||||
}
|
||||
|
||||
void ClangdProjectSettings::saveSettings()
|
||||
{
|
||||
if (!m_project)
|
||||
return;
|
||||
QVariantMap data;
|
||||
if (!m_useGlobalSettings)
|
||||
data = m_customSettings.toMap();
|
||||
data.insert(clangdUseGlobalSettingsKey(), m_useGlobalSettings);
|
||||
m_project->setNamedSettings(clangdSettingsKey(), data);
|
||||
}
|
||||
|
||||
QVariantMap ClangdSettings::Data::toMap() const
|
||||
{
|
||||
QVariantMap map;
|
||||
map.insert(useClangdKey(), useClangd);
|
||||
map.insert(clangdPathKey(), executableFilePath.toString());
|
||||
map.insert(clangdIndexingKey(), enableIndexing);
|
||||
map.insert(clangdThreadLimitKey(), workerThreadLimit);
|
||||
return map;
|
||||
}
|
||||
|
||||
void ClangdSettings::Data::fromMap(const QVariantMap &map)
|
||||
{
|
||||
useClangd = map.value(useClangdKey(), false).toBool();
|
||||
executableFilePath = FilePath::fromString(map.value(clangdPathKey()).toString());
|
||||
enableIndexing = map.value(clangdIndexingKey(), true).toBool();
|
||||
workerThreadLimit = map.value(clangdThreadLimitKey(), 0).toInt();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user