clangd: make --limit-results configurable in Preferences

The default value is the clangd default value: 100.

Fixes: QTCREATORBUG-27152
Change-Id: Icb6c67645b33325da591cb360c17b3dd55fc60ad
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Cristian Adam
2022-07-25 17:04:23 +02:00
parent 44f1fd6498
commit 86b8f68f78
4 changed files with 33 additions and 2 deletions

View File

@@ -262,8 +262,16 @@ static BaseClientInterface *clientInterface(Project *project, const Utils::FileP
indexingOption += "=0"; indexingOption += "=0";
const QString headerInsertionOption = QString("--header-insertion=") const QString headerInsertionOption = QString("--header-insertion=")
+ (settings.autoIncludeHeaders() ? "iwyu" : "never"); + (settings.autoIncludeHeaders() ? "iwyu" : "never");
#ifdef WITH_TESTS
// For the #include < test, which needs to get a local header file, but the list
// is being flooded with system include headers. 4280 on Windows!
const QString limitResults = QString("--limit-results=0");
#else
const QString limitResults = QString("--limit-results=%1").arg(settings.completionResults());
#endif
Utils::CommandLine cmd{settings.clangdFilePath(), {indexingOption, headerInsertionOption, Utils::CommandLine cmd{settings.clangdFilePath(), {indexingOption, headerInsertionOption,
"--limit-results=0", "--limit-references=0", "--clang-tidy=0"}}; limitResults, "--limit-references=0", "--clang-tidy=0"}};
if (settings.workerThreadLimit() != 0) if (settings.workerThreadLimit() != 0)
cmd.addArg("-j=" + QString::number(settings.workerThreadLimit())); cmd.addArg("-j=" + QString::number(settings.workerThreadLimit()));
if (!jsonDbDir.isEmpty()) if (!jsonDbDir.isEmpty())

View File

@@ -83,6 +83,7 @@ static QString clangdUseGlobalSettingsKey() { return QLatin1String("useGlobalSet
static QString sessionsWithOneClangdKey() { return QLatin1String("SessionsWithOneClangd"); } static QString sessionsWithOneClangdKey() { return QLatin1String("SessionsWithOneClangd"); }
static QString diagnosticConfigIdKey() { return QLatin1String("diagnosticConfigId"); } static QString diagnosticConfigIdKey() { return QLatin1String("diagnosticConfigId"); }
static QString checkedHardwareKey() { return QLatin1String("checkedHardware"); } static QString checkedHardwareKey() { return QLatin1String("checkedHardware"); }
static QString completionResultsKey() { return QLatin1String("completionResults"); }
static FilePath g_defaultClangdFilePath; static FilePath g_defaultClangdFilePath;
static FilePath fallbackClangdFilePath() static FilePath fallbackClangdFilePath()
@@ -489,6 +490,7 @@ QVariantMap ClangdSettings::Data::toMap() const
map.insert(sessionsWithOneClangdKey(), sessionsWithOneClangd); map.insert(sessionsWithOneClangdKey(), sessionsWithOneClangd);
map.insert(diagnosticConfigIdKey(), diagnosticConfigId.toSetting()); map.insert(diagnosticConfigIdKey(), diagnosticConfigId.toSetting());
map.insert(checkedHardwareKey(), true); map.insert(checkedHardwareKey(), true);
map.insert(completionResultsKey(), completionResults);
return map; return map;
} }
@@ -506,6 +508,7 @@ void ClangdSettings::Data::fromMap(const QVariantMap &map)
diagnosticConfigId = Id::fromSetting(map.value(diagnosticConfigIdKey(), diagnosticConfigId = Id::fromSetting(map.value(diagnosticConfigIdKey(),
initialClangDiagnosticConfigId().toSetting())); initialClangDiagnosticConfigId().toSetting()));
haveCheckedHardwareReqirements = map.value(checkedHardwareKey(), false).toBool(); haveCheckedHardwareReqirements = map.value(checkedHardwareKey(), false).toBool();
completionResults = map.value(completionResultsKey(), kDefaultCompletionResults).toInt();
} }
} // namespace CppEditor } // namespace CppEditor

View File

@@ -93,6 +93,9 @@ class CPPEDITOR_EXPORT ClangdSettings : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
// Default clangd --limit-results value is 100
static const int kDefaultCompletionResults = 100;
class CPPEDITOR_EXPORT Data class CPPEDITOR_EXPORT Data
{ {
public: public:
@@ -112,7 +115,8 @@ public:
&& s1.documentUpdateThreshold == s2.documentUpdateThreshold && s1.documentUpdateThreshold == s2.documentUpdateThreshold
&& s1.sizeThresholdEnabled == s2.sizeThresholdEnabled && s1.sizeThresholdEnabled == s2.sizeThresholdEnabled
&& s1.sizeThresholdInKb == s2.sizeThresholdInKb && s1.sizeThresholdInKb == s2.sizeThresholdInKb
&& s1.haveCheckedHardwareReqirements == s2.haveCheckedHardwareReqirements; && s1.haveCheckedHardwareReqirements == s2.haveCheckedHardwareReqirements
&& s1.completionResults == s2.completionResults;
} }
friend bool operator!=(const Data &s1, const Data &s2) { return !(s1 == s2); } friend bool operator!=(const Data &s1, const Data &s2) { return !(s1 == s2); }
@@ -128,6 +132,7 @@ public:
bool autoIncludeHeaders = false; bool autoIncludeHeaders = false;
bool sizeThresholdEnabled = false; bool sizeThresholdEnabled = false;
bool haveCheckedHardwareReqirements = false; bool haveCheckedHardwareReqirements = false;
int completionResults = kDefaultCompletionResults;
}; };
ClangdSettings(const Data &data) : m_data(data) {} ClangdSettings(const Data &data) : m_data(data) {}
@@ -148,6 +153,7 @@ public:
int documentUpdateThreshold() const { return m_data.documentUpdateThreshold; } int documentUpdateThreshold() const { return m_data.documentUpdateThreshold; }
qint64 sizeThresholdInKb() const { return m_data.sizeThresholdInKb; } qint64 sizeThresholdInKb() const { return m_data.sizeThresholdInKb; }
bool sizeThresholdEnabled() const { return m_data.sizeThresholdEnabled; } bool sizeThresholdEnabled() const { return m_data.sizeThresholdEnabled; }
int completionResults() const { return m_data.completionResults; }
bool sizeIsOkay(const Utils::FilePath &fp) const; bool sizeIsOkay(const Utils::FilePath &fp) const;
ClangDiagnosticConfigs customDiagnosticConfigs() const; ClangDiagnosticConfigs customDiagnosticConfigs() const;
Utils::Id diagnosticConfigId() const; Utils::Id diagnosticConfigId() const;

View File

@@ -178,6 +178,7 @@ public:
QSpinBox threadLimitSpinBox; QSpinBox threadLimitSpinBox;
QSpinBox documentUpdateThreshold; QSpinBox documentUpdateThreshold;
QSpinBox sizeThresholdSpinBox; QSpinBox sizeThresholdSpinBox;
QSpinBox completionResults;
Utils::PathChooser clangdChooser; Utils::PathChooser clangdChooser;
Utils::InfoLabel versionWarningLabel; Utils::InfoLabel versionWarningLabel;
ClangDiagnosticConfigsSelectionWidget *configSelectionWidget = nullptr; ClangDiagnosticConfigsSelectionWidget *configSelectionWidget = nullptr;
@@ -224,6 +225,13 @@ ClangdSettingsWidget::ClangdSettingsWidget(const ClangdSettings::Data &settingsD
"Files greater than this will not be opened as documents in clangd.\n" "Files greater than this will not be opened as documents in clangd.\n"
"The built-in code model will handle highlighting, completion and so on.")); "The built-in code model will handle highlighting, completion and so on."));
const auto completionResultsLabel = new QLabel(tr("Completion results:"));
d->completionResults.setMinimum(0);
d->completionResults.setMaximum(std::numeric_limits<int>::max());
d->completionResults.setValue(settings.completionResults());
d->completionResults.setToolTip(tr("The maximum number of completion results returned by clangd"));
d->completionResults.setSpecialValueText(tr("No limit"));
const auto layout = new QVBoxLayout(this); const auto layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(&d->useClangdCheckBox); layout->addWidget(&d->useClangdCheckBox);
@@ -245,6 +253,12 @@ ClangdSettingsWidget::ClangdSettingsWidget(const ClangdSettings::Data &settingsD
documentUpdateThresholdLayout->addStretch(1); documentUpdateThresholdLayout->addStretch(1);
const auto documentUpdateThresholdLabel = new QLabel(tr("Document update threshold:")); const auto documentUpdateThresholdLabel = new QLabel(tr("Document update threshold:"));
formLayout->addRow(documentUpdateThresholdLabel, documentUpdateThresholdLayout); formLayout->addRow(documentUpdateThresholdLabel, documentUpdateThresholdLayout);
const auto limitResultsLayout = new QHBoxLayout;
limitResultsLayout->addWidget(&d->completionResults);
limitResultsLayout->addStretch(1);
formLayout->addRow(completionResultsLabel, limitResultsLayout);
const auto sizeThresholdLayout = new QHBoxLayout; const auto sizeThresholdLayout = new QHBoxLayout;
sizeThresholdLayout->addWidget(&d->sizeThresholdSpinBox); sizeThresholdLayout->addWidget(&d->sizeThresholdSpinBox);
sizeThresholdLayout->addStretch(1); sizeThresholdLayout->addStretch(1);