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 <hjk@qt.io>
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Sami Shalayel
2024-06-17 14:21:07 +02:00
parent 2f2ed24092
commit 3b558792eb
4 changed files with 29 additions and 2 deletions

View File

@@ -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<int> disabled;
@@ -571,6 +585,7 @@ private:
QCheckBox *foldAuxData;
QCheckBox *useQmlls;
QCheckBox *useLatestQmlls;
QCheckBox *ignoreMinimumQmllsVersion;
QCheckBox *disableBuiltInCodemodel;
QCheckBox *generateQmllsIniFiles;
QComboBox *uiQmlOpenComboBox;

View File

@@ -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;
}

View File

@@ -33,9 +33,12 @@ static FilePath evaluateLatestQmlls()
QVersionNumber latestVersion;
FilePath latestQmakeFilePath;
int latestUniqueId = std::numeric_limits<int>::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;

View File

@@ -5,6 +5,7 @@
#include "qmljseditor_global.h"
#include <QtCore/qversionnumber.h>
#include <utils/filepath.h>
#include <QMutex>
#include <QObject>
@@ -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); }
};