diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index f7d72b80420..d2515760493 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -559,18 +559,17 @@ QString PluginSpec::errorString() const } /*! - Returns whether this plugin can be used to fill in a dependency of the given - \a pluginName and \a pluginVersion. + Returns whether the plugin \a spec can be used to fill the \a dependency of this plugin. - \sa PluginSpec::dependencies() + \sa PluginSpec::dependencies() */ -bool PluginSpec::provides(const QString &pluginName, const QString &pluginVersion) const +bool PluginSpec::provides(PluginSpec *spec, const PluginDependency &dependency) const { - if (QString::compare(pluginName, name(), Qt::CaseInsensitive) != 0) + if (QString::compare(dependency.name, spec->name(), Qt::CaseInsensitive) != 0) return false; - return (versionCompare(version(), pluginVersion) >= 0) - && (versionCompare(compatVersion(), pluginVersion) <= 0); + return (versionCompare(spec->version(), dependency.version) >= 0) + && (versionCompare(spec->compatVersion(), dependency.version) <= 0); } /*! @@ -1075,8 +1074,8 @@ bool PluginSpec::resolveDependencies(const PluginSpecs &specs) QHash resolvedDependencies; for (const PluginDependency &dependency : d->dependencies) { - PluginSpec *const found = findOrDefault(specs, [&dependency](PluginSpec *spec) { - return spec->provides(dependency.name, dependency.version); + PluginSpec *const found = findOrDefault(specs, [this, &dependency](PluginSpec *spec) { + return provides(spec, dependency); }); if (!found) { if (dependency.type == PluginDependency::Required) { diff --git a/src/libs/extensionsystem/pluginspec.h b/src/libs/extensionsystem/pluginspec.h index 49a972d9149..e9a771d4a99 100644 --- a/src/libs/extensionsystem/pluginspec.h +++ b/src/libs/extensionsystem/pluginspec.h @@ -36,13 +36,14 @@ class PluginView; struct EXTENSIONSYSTEM_EXPORT PluginDependency { - enum Type { - Required, - Optional, - Test - }; + enum Type { Required, Optional, Test }; PluginDependency() : type(Required) {} + PluginDependency(const QString &name, const QString &version, Type type = Required) + : name(name) + , version(version) + , type(type) + {} QString name; QString version; @@ -130,7 +131,7 @@ public: virtual void addArgument(const QString &argument); virtual QHash dependencySpecs() const; - virtual bool provides(const QString &pluginName, const QString &pluginVersion) const; + virtual bool provides(PluginSpec *spec, const PluginDependency &dependency) const; virtual bool requiresAny(const QSet &plugins) const; virtual PluginSpecs enableDependenciesIndirectly(bool enableTestDependencies); virtual bool resolveDependencies(const PluginSpecs &pluginSpecs); diff --git a/src/plugins/coreplugin/plugininstallwizard.cpp b/src/plugins/coreplugin/plugininstallwizard.cpp index 250ed0a31a5..e9f91ffbb8e 100644 --- a/src/plugins/coreplugin/plugininstallwizard.cpp +++ b/src/plugins/coreplugin/plugininstallwizard.cpp @@ -162,7 +162,7 @@ void checkContents(QPromise &promise, const FilePath &tempDir) [coreplugin](const PluginDependency &d) { return d.name == coreplugin->name(); }); if (found == dependencies.constEnd()) return; - if (coreplugin->provides(found->name, found->version)) + if ((*spec)->provides(coreplugin, *found)) return; promise.addResult( ArchiveIssue{Tr::tr("Plugin requires an incompatible version of %1 (%2).") diff --git a/tests/auto/extensionsystem/pluginspec/tst_pluginspec.cpp b/tests/auto/extensionsystem/pluginspec/tst_pluginspec.cpp index 66828f8e63b..ed8476a0b09 100644 --- a/tests/auto/extensionsystem/pluginspec/tst_pluginspec.cpp +++ b/tests/auto/extensionsystem/pluginspec/tst_pluginspec.cpp @@ -190,25 +190,25 @@ void tst_PluginSpec::provides() CppPluginSpec spec; QVERIFY(spec.readMetaData(metaData("testspecs/simplespec.json"))); - QVERIFY(!spec.provides("SomeOtherPlugin", "2.2.3_9")); - QVERIFY(!spec.provides("MyPlugin", "2.2.3_10")); - QVERIFY(!spec.provides("MyPlugin", "2.2.4")); - QVERIFY(!spec.provides("MyPlugin", "2.3.11_1")); - QVERIFY(!spec.provides("MyPlugin", "2.3")); - QVERIFY(!spec.provides("MyPlugin", "3.0")); - QVERIFY(!spec.provides("MyPlugin", "1.9.9_99")); - QVERIFY(!spec.provides("MyPlugin", "1.9")); - QVERIFY(!spec.provides("MyPlugin", "0.9")); - QVERIFY(!spec.provides("MyPlugin", "1")); + QVERIFY(!spec.provides(&spec, {"SomeOtherPlugin", "2.2.3_9"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "2.2.3_10"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "2.2.4"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "2.3.11_1"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "2.3"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "3.0"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "1.9.9_99"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "1.9"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "0.9"})); + QVERIFY(!spec.provides(&spec, {"MyPlugin", "1"})); - QVERIFY(spec.provides("myplugin", "2.2.3_9")); - QVERIFY(spec.provides("MyPlugin", "2.2.3_9")); - QVERIFY(spec.provides("MyPlugin", "2.2.3_8")); - QVERIFY(spec.provides("MyPlugin", "2.2.3")); - QVERIFY(spec.provides("MyPlugin", "2.2.2")); - QVERIFY(spec.provides("MyPlugin", "2.1.2_10")); - QVERIFY(spec.provides("MyPlugin", "2.0_10")); - QVERIFY(spec.provides("MyPlugin", "2")); + QVERIFY(spec.provides(&spec, {"myplugin", "2.2.3_9"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.2.3_9"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.2.3_8"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.2.3"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.2.2"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.1.2_10"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2.0_10"})); + QVERIFY(spec.provides(&spec, {"MyPlugin", "2"})); } void tst_PluginSpec::experimental()