From 3b558792ebfd24247544d651235b6e5c47d893c1 Mon Sep 17 00:00:00 2001 From: Sami Shalayel Date: Mon, 17 Jun 2024 14:21:07 +0200 Subject: [PATCH] qmlls: ignore versions from Qt 6.7 or below Do not select qmlls executables from versions below 6.8 by default, as those have less features than QtC's builtin codemodel. Add an option to re-enable using qmlls versions from Qt 6.7 or below, which is off by default. Fixes: QTCREATORBUG-31088 Change-Id: I56bfd39bc980996a92232cbcb424252d755cdfc0 Reviewed-by: hjk Reviewed-by: David Schulz Reviewed-by: Eike Ziller --- .../qmljseditor/qmljseditingsettingspage.cpp | 17 ++++++++++++++++- src/plugins/qmljseditor/qmljseditordocument.cpp | 5 +++++ src/plugins/qmljseditor/qmllssettings.cpp | 3 +++ src/plugins/qmljseditor/qmllssettings.h | 6 +++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp index 644c0d1d50e..433f0f8b1e0 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp @@ -35,6 +35,7 @@ const char QML_CONTEXTPANEPIN_KEY[] = "QmlJSEditor.ContextPanePinned"; const char FOLD_AUX_DATA[] = "QmlJSEditor.FoldAuxData"; const char USE_QMLLS[] = "QmlJSEditor.UseQmlls"; const char USE_LATEST_QMLLS[] = "QmlJSEditor.UseLatestQmlls"; +const char IGNORE_MINIMUM_QMLLS_VERSION[] = "QmlJSEditor.IgnoreMinimumQmllsVersion"; const char DISABLE_BUILTIN_CODEMODEL[] = "QmlJSEditor.DisableBuiltinCodemodel"; const char GENERATE_QMLLS_INI_FILES[] = "QmlJSEditor.GenerateQmllsIniFiles"; const char UIQML_OPEN_MODE[] = "QmlJSEditor.openUiQmlMode"; @@ -107,6 +108,8 @@ void QmlJsEditingSettings::fromSettings(QtcSettings *settings) m_uiQmlOpenMode = settings->value(UIQML_OPEN_MODE, "").toString(); m_qmllsSettings.useQmlls = settings->value(USE_QMLLS, QVariant(true)).toBool(); m_qmllsSettings.useLatestQmlls = settings->value(USE_LATEST_QMLLS, QVariant(false)).toBool(); + m_qmllsSettings.ignoreMinimumQmllsVersion + = settings->value(IGNORE_MINIMUM_QMLLS_VERSION, QVariant(false)).toBool(); m_qmllsSettings.disableBuiltinCodemodel = settings->value(DISABLE_BUILTIN_CODEMODEL, QVariant(false)).toBool(); m_qmllsSettings.generateQmllsIniFiles @@ -138,6 +141,7 @@ void QmlJsEditingSettings::toSettings(QtcSettings *settings) const settings->setValue(UIQML_OPEN_MODE, m_uiQmlOpenMode); settings->setValue(USE_QMLLS, m_qmllsSettings.useQmlls); settings->setValue(USE_LATEST_QMLLS, m_qmllsSettings.useLatestQmlls); + settings->setValue(IGNORE_MINIMUM_QMLLS_VERSION, m_qmllsSettings.ignoreMinimumQmllsVersion); settings->setValue(DISABLE_BUILTIN_CODEMODEL, m_qmllsSettings.disableBuiltinCodemodel); settings->setValue(GENERATE_QMLLS_INI_FILES, m_qmllsSettings.generateQmllsIniFiles); settings->setValueWithDefault(FORMAT_COMMAND, m_formatCommand, {}); @@ -399,6 +403,13 @@ public: useQmlls = new QCheckBox(Tr::tr("Enable QML Language Server")); useQmlls->setChecked(s.qmllsSettings().useQmlls); + + ignoreMinimumQmllsVersion = new QCheckBox( + Tr::tr("Allow versions below Qt %1") + .arg(QmllsSettings::mininumQmllsVersion.toString())); + ignoreMinimumQmllsVersion->setChecked(s.qmllsSettings().ignoreMinimumQmllsVersion); + ignoreMinimumQmllsVersion->setEnabled(s.qmllsSettings().useQmlls); + disableBuiltInCodemodel = new QCheckBox( Tr::tr("Use QML Language Server advanced features (renaming, find usages and co.) " "(EXPERIMENTAL!)")); @@ -407,6 +418,7 @@ public: useLatestQmlls = new QCheckBox(Tr::tr("Use QML Language Server from latest Qt version")); useLatestQmlls->setChecked(s.qmllsSettings().useLatestQmlls); useLatestQmlls->setEnabled(s.qmllsSettings().useQmlls); + generateQmllsIniFiles = new QCheckBox( Tr::tr("Generate QML Language Server .qmlls.ini configurations for new projects.")); generateQmllsIniFiles->setChecked(s.qmllsSettings().generateQmllsIniFiles); @@ -415,6 +427,7 @@ public: useLatestQmlls->setEnabled(checked != Qt::Unchecked); disableBuiltInCodemodel->setEnabled(checked != Qt::Unchecked); generateQmllsIniFiles->setEnabled(checked != Qt::Unchecked); + ignoreMinimumQmllsVersion->setEnabled(checked != Qt::Unchecked); }); useCustomAnalyzer = new QCheckBox(Tr::tr("Use customized static analyzer")); @@ -467,7 +480,7 @@ public: }, Group{ title(Tr::tr("QML Language Server")), - Column{useQmlls, disableBuiltInCodemodel , useLatestQmlls, generateQmllsIniFiles}, + Column{useQmlls, ignoreMinimumQmllsVersion, disableBuiltInCodemodel, useLatestQmlls, generateQmllsIniFiles}, }, Group { title(Tr::tr("Static Analyzer")), @@ -513,6 +526,7 @@ public: s.qmllsSettings().useQmlls = useQmlls->isChecked(); s.qmllsSettings().disableBuiltinCodemodel = disableBuiltInCodemodel->isChecked(); s.qmllsSettings().useLatestQmlls = useLatestQmlls->isChecked(); + s.qmllsSettings().ignoreMinimumQmllsVersion = ignoreMinimumQmllsVersion->isChecked(); s.qmllsSettings().generateQmllsIniFiles = generateQmllsIniFiles->isChecked(); s.setUseCustomAnalyzer(useCustomAnalyzer->isChecked()); QSet disabled; @@ -571,6 +585,7 @@ private: QCheckBox *foldAuxData; QCheckBox *useQmlls; QCheckBox *useLatestQmlls; + QCheckBox *ignoreMinimumQmllsVersion; QCheckBox *disableBuiltInCodemodel; QCheckBox *generateQmllsIniFiles; QComboBox *uiQmlOpenComboBox; diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index cef1aefcd2b..3dfb9b8f137 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -745,6 +745,11 @@ static Utils::FilePath qmllsForFile(const Utils::FilePath &file, if (settings.useLatestQmlls) return settingsManager->latestQmlls(); QmlJS::ModelManagerInterface::ProjectInfo pInfo = modelManager->projectInfoForPath(file); + + if (!settings.ignoreMinimumQmllsVersion + && QVersionNumber::fromString(pInfo.qtVersionString) < settings.mininumQmllsVersion) { + return {}; + } return pInfo.qmllsPath; } diff --git a/src/plugins/qmljseditor/qmllssettings.cpp b/src/plugins/qmljseditor/qmllssettings.cpp index 15cb8908afb..8ca9936957f 100644 --- a/src/plugins/qmljseditor/qmllssettings.cpp +++ b/src/plugins/qmljseditor/qmllssettings.cpp @@ -33,9 +33,12 @@ static FilePath evaluateLatestQmlls() QVersionNumber latestVersion; FilePath latestQmakeFilePath; int latestUniqueId = std::numeric_limits::min(); + const QmllsSettings qmllsSettings = QmllsSettingsManager::instance()->lastSettings(); for (QtVersion *v : versions) { // check if we find qmlls QVersionNumber vNow = v->qtVersion(); + if (!qmllsSettings.ignoreMinimumQmllsVersion && vNow < qmllsSettings.mininumQmllsVersion) + continue; FilePath qmllsNow = QmlJS::ModelManagerInterface::qmllsForBinPath(v->hostBinPath(), vNow); if (!qmllsNow.isExecutableFile()) continue; diff --git a/src/plugins/qmljseditor/qmllssettings.h b/src/plugins/qmljseditor/qmllssettings.h index 90d8ff6ca8f..ad11a541c52 100644 --- a/src/plugins/qmljseditor/qmllssettings.h +++ b/src/plugins/qmljseditor/qmllssettings.h @@ -5,6 +5,7 @@ #include "qmljseditor_global.h" +#include #include #include #include @@ -13,8 +14,10 @@ namespace QmlJSEditor { struct QmllsSettings { + static const inline QVersionNumber mininumQmllsVersion = QVersionNumber(6,8); bool useQmlls = true; bool useLatestQmlls = false; + bool ignoreMinimumQmllsVersion = false; bool disableBuiltinCodemodel = false; bool generateQmllsIniFiles = false; @@ -22,7 +25,8 @@ struct QmllsSettings { return s1.useQmlls == s2.useQmlls && s1.useLatestQmlls == s2.useLatestQmlls && s1.disableBuiltinCodemodel == s2.disableBuiltinCodemodel - && s1.generateQmllsIniFiles == s2.generateQmllsIniFiles; + && s1.generateQmllsIniFiles == s2.generateQmllsIniFiles + && s1.ignoreMinimumQmllsVersion == s2.ignoreMinimumQmllsVersion; } friend bool operator!=(const QmllsSettings &s1, const QmllsSettings &s2) { return !(s1 == s2); } };