forked from qt-creator/qt-creator
clangd: add setting for document update timeout
Change-Id: I4fae2cdff022f6f29566c0316a8ade51d3482466 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -759,6 +759,7 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir)
|
|||||||
setAutoRequestCodeActions(false); // clangd sends code actions inside diagnostics
|
setAutoRequestCodeActions(false); // clangd sends code actions inside diagnostics
|
||||||
setProgressTitleForToken(indexingToken(), tr("Parsing C/C++ Files (clangd)"));
|
setProgressTitleForToken(indexingToken(), tr("Parsing C/C++ Files (clangd)"));
|
||||||
setCurrentProject(project);
|
setCurrentProject(project);
|
||||||
|
setDocumentChangeUpdateThreshold(d->settings.documentUpdateThreshold);
|
||||||
|
|
||||||
const auto textMarkCreator = [this](const Utils::FilePath &filePath,
|
const auto textMarkCreator = [this](const Utils::FilePath &filePath,
|
||||||
const Diagnostic &diag) { return new ClangdTextMark(filePath, diag, this); };
|
const Diagnostic &diag) { return new ClangdTextMark(filePath, diag, this); };
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ static QString useClangdKey() { return QLatin1String("UseClangd"); }
|
|||||||
static QString clangdPathKey() { return QLatin1String("ClangdPath"); }
|
static QString clangdPathKey() { return QLatin1String("ClangdPath"); }
|
||||||
static QString clangdIndexingKey() { return QLatin1String("ClangdIndexing"); }
|
static QString clangdIndexingKey() { return QLatin1String("ClangdIndexing"); }
|
||||||
static QString clangdThreadLimitKey() { return QLatin1String("ClangdThreadLimit"); }
|
static QString clangdThreadLimitKey() { return QLatin1String("ClangdThreadLimit"); }
|
||||||
|
static QString clangdDocumentThresholdKey() { return QLatin1String("ClangdDocumentThreshold"); }
|
||||||
static QString clangdUseGlobalSettingsKey() { return QLatin1String("useGlobalSettings"); }
|
static QString clangdUseGlobalSettingsKey() { return QLatin1String("useGlobalSettings"); }
|
||||||
|
|
||||||
static FilePath g_defaultClangdFilePath;
|
static FilePath g_defaultClangdFilePath;
|
||||||
@@ -402,6 +403,7 @@ QVariantMap ClangdSettings::Data::toMap() const
|
|||||||
map.insert(clangdPathKey(), executableFilePath.toString());
|
map.insert(clangdPathKey(), executableFilePath.toString());
|
||||||
map.insert(clangdIndexingKey(), enableIndexing);
|
map.insert(clangdIndexingKey(), enableIndexing);
|
||||||
map.insert(clangdThreadLimitKey(), workerThreadLimit);
|
map.insert(clangdThreadLimitKey(), workerThreadLimit);
|
||||||
|
map.insert(clangdDocumentThresholdKey(), documentUpdateThreshold);
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,4 +413,5 @@ void ClangdSettings::Data::fromMap(const QVariantMap &map)
|
|||||||
executableFilePath = FilePath::fromString(map.value(clangdPathKey()).toString());
|
executableFilePath = FilePath::fromString(map.value(clangdPathKey()).toString());
|
||||||
enableIndexing = map.value(clangdIndexingKey(), true).toBool();
|
enableIndexing = map.value(clangdIndexingKey(), true).toBool();
|
||||||
workerThreadLimit = map.value(clangdThreadLimitKey(), 0).toInt();
|
workerThreadLimit = map.value(clangdThreadLimitKey(), 0).toInt();
|
||||||
|
documentUpdateThreshold = map.value(clangdDocumentThresholdKey(), 500).toInt();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ public:
|
|||||||
int workerThreadLimit = 0;
|
int workerThreadLimit = 0;
|
||||||
bool useClangd = false;
|
bool useClangd = false;
|
||||||
bool enableIndexing = true;
|
bool enableIndexing = true;
|
||||||
|
int documentUpdateThreshold = 500;
|
||||||
};
|
};
|
||||||
|
|
||||||
ClangdSettings(const Data &data) : m_data(data) {}
|
ClangdSettings(const Data &data) : m_data(data) {}
|
||||||
@@ -123,6 +124,7 @@ public:
|
|||||||
Utils::FilePath clangdFilePath() const;
|
Utils::FilePath clangdFilePath() const;
|
||||||
bool indexingEnabled() const { return m_data.enableIndexing; }
|
bool indexingEnabled() const { return m_data.enableIndexing; }
|
||||||
int workerThreadLimit() const { return m_data.workerThreadLimit; }
|
int workerThreadLimit() const { return m_data.workerThreadLimit; }
|
||||||
|
int documentUpdateThreshold() const { return m_data.documentUpdateThreshold; }
|
||||||
|
|
||||||
void setData(const Data &data);
|
void setData(const Data &data);
|
||||||
Data data() const { return m_data; }
|
Data data() const { return m_data; }
|
||||||
@@ -149,7 +151,8 @@ inline bool operator==(const ClangdSettings::Data &s1, const ClangdSettings::Dat
|
|||||||
return s1.useClangd == s2.useClangd
|
return s1.useClangd == s2.useClangd
|
||||||
&& s1.executableFilePath == s2.executableFilePath
|
&& s1.executableFilePath == s2.executableFilePath
|
||||||
&& s1.workerThreadLimit == s2.workerThreadLimit
|
&& s1.workerThreadLimit == s2.workerThreadLimit
|
||||||
&& s1.enableIndexing == s2.enableIndexing;
|
&& s1.enableIndexing == s2.enableIndexing
|
||||||
|
&& s1.documentUpdateThreshold == s2.documentUpdateThreshold;
|
||||||
}
|
}
|
||||||
inline bool operator!=(const ClangdSettings::Data &s1, const ClangdSettings::Data &s2)
|
inline bool operator!=(const ClangdSettings::Data &s1, const ClangdSettings::Data &s2)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -197,6 +197,7 @@ public:
|
|||||||
QCheckBox useClangdCheckBox;
|
QCheckBox useClangdCheckBox;
|
||||||
QCheckBox indexingCheckBox;
|
QCheckBox indexingCheckBox;
|
||||||
QSpinBox threadLimitSpinBox;
|
QSpinBox threadLimitSpinBox;
|
||||||
|
QSpinBox documentUpdateThreshold;
|
||||||
Utils::PathChooser clangdChooser;
|
Utils::PathChooser clangdChooser;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -216,6 +217,15 @@ ClangdSettingsWidget::ClangdSettingsWidget(const ClangdSettings::Data &settingsD
|
|||||||
"the project is first opened."));
|
"the project is first opened."));
|
||||||
d->threadLimitSpinBox.setValue(settings.workerThreadLimit());
|
d->threadLimitSpinBox.setValue(settings.workerThreadLimit());
|
||||||
d->threadLimitSpinBox.setSpecialValueText("Automatic");
|
d->threadLimitSpinBox.setSpecialValueText("Automatic");
|
||||||
|
d->documentUpdateThreshold.setMinimum(50);
|
||||||
|
d->documentUpdateThreshold.setMaximum(10000);
|
||||||
|
d->documentUpdateThreshold.setValue(settings.documentUpdateThreshold());
|
||||||
|
d->documentUpdateThreshold.setSingleStep(100);
|
||||||
|
d->documentUpdateThreshold.setSuffix(" ms");
|
||||||
|
d->documentUpdateThreshold.setToolTip(
|
||||||
|
tr("Defines the amount of time Qt Creator waits before sending document changes to the "
|
||||||
|
"server.\n"
|
||||||
|
"If the document changes again while waiting, this timeout resets.\n"));
|
||||||
|
|
||||||
const auto layout = new QVBoxLayout(this);
|
const auto layout = new QVBoxLayout(this);
|
||||||
layout->addWidget(&d->useClangdCheckBox);
|
layout->addWidget(&d->useClangdCheckBox);
|
||||||
@@ -227,8 +237,13 @@ ClangdSettingsWidget::ClangdSettingsWidget(const ClangdSettings::Data &settingsD
|
|||||||
const auto threadLimitLayout = new QHBoxLayout;
|
const auto threadLimitLayout = new QHBoxLayout;
|
||||||
threadLimitLayout->addWidget(&d->threadLimitSpinBox);
|
threadLimitLayout->addWidget(&d->threadLimitSpinBox);
|
||||||
threadLimitLayout->addStretch(1);
|
threadLimitLayout->addStretch(1);
|
||||||
const auto threadLimitLabel = new QLabel(tr("Set worker thread count:"));
|
const auto threadLimitLabel = new QLabel(tr("Worker thread count:"));
|
||||||
formLayout->addRow(threadLimitLabel, threadLimitLayout);
|
formLayout->addRow(threadLimitLabel, threadLimitLayout);
|
||||||
|
const auto documentUpdateThresholdLayout = new QHBoxLayout;
|
||||||
|
documentUpdateThresholdLayout->addWidget(&d->documentUpdateThreshold);
|
||||||
|
documentUpdateThresholdLayout->addStretch(1);
|
||||||
|
const auto documentUpdateThresholdLabel = new QLabel(tr("Document update threshold:"));
|
||||||
|
formLayout->addRow(documentUpdateThresholdLabel, documentUpdateThresholdLayout);
|
||||||
layout->addLayout(formLayout);
|
layout->addLayout(formLayout);
|
||||||
layout->addStretch(1);
|
layout->addStretch(1);
|
||||||
|
|
||||||
@@ -265,6 +280,7 @@ ClangdSettings::Data ClangdSettingsWidget::settingsData() const
|
|||||||
data.executableFilePath = d->clangdChooser.filePath();
|
data.executableFilePath = d->clangdChooser.filePath();
|
||||||
data.enableIndexing = d->indexingCheckBox.isChecked();
|
data.enableIndexing = d->indexingCheckBox.isChecked();
|
||||||
data.workerThreadLimit = d->threadLimitSpinBox.value();
|
data.workerThreadLimit = d->threadLimitSpinBox.value();
|
||||||
|
data.documentUpdateThreshold = d->documentUpdateThreshold.value();
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1381,6 +1381,11 @@ int Client::documentVersion(const Utils::FilePath &filePath) const
|
|||||||
return m_documentVersions.value(filePath);
|
return m_documentVersions.value(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::setDocumentChangeUpdateThreshold(int msecs)
|
||||||
|
{
|
||||||
|
m_documentUpdateTimer.setInterval(msecs);
|
||||||
|
}
|
||||||
|
|
||||||
void Client::initializeCallback(const InitializeRequest::Response &initResponse)
|
void Client::initializeCallback(const InitializeRequest::Response &initResponse)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_state == InitializeRequested, return);
|
QTC_ASSERT(m_state == InitializeRequested, return);
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ public:
|
|||||||
void cursorPositionChanged(TextEditor::TextEditorWidget *widget);
|
void cursorPositionChanged(TextEditor::TextEditorWidget *widget);
|
||||||
bool documentUpdatePostponed(const Utils::FilePath &fileName) const;
|
bool documentUpdatePostponed(const Utils::FilePath &fileName) const;
|
||||||
int documentVersion(const Utils::FilePath &filePath) const;
|
int documentVersion(const Utils::FilePath &filePath) const;
|
||||||
|
void setDocumentChangeUpdateThreshold(int msecs);
|
||||||
|
|
||||||
// workspace control
|
// workspace control
|
||||||
virtual void setCurrentProject(ProjectExplorer::Project *project);
|
virtual void setCurrentProject(ProjectExplorer::Project *project);
|
||||||
|
|||||||
Reference in New Issue
Block a user