diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2023-04-20 13:14:54 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2023-04-20 13:28:47 +0000 |
commit | 02748c559938a90b9ea8ffc6544cc7fb65266239 (patch) | |
tree | cb777feab62c2565b0e9533e004c05a1a1451c2f | |
parent | fb52fed84a1510a7de0172e643d6fd66a780e2e8 (diff) | |
download | qbs-02748c559938a90b9ea8ffc6544cc7fb65266239.tar.gz |
Clean up ProbesResolver interface
Most importantly, break the reverse dependency on ProjectTreeBuilder.
Change-Id: I9b6b7db684ed749eb6e82445b37b7e532e714ed2
Reviewed-by: Ivan Komissarov <ABBAPOH@gmail.com>
-rw-r--r-- | src/lib/corelib/language/moduleproviderloader.cpp | 3 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleproviderloader.h | 4 | ||||
-rw-r--r-- | src/lib/corelib/language/probesresolver.cpp | 47 | ||||
-rw-r--r-- | src/lib/corelib/language/probesresolver.h | 29 | ||||
-rw-r--r-- | src/lib/corelib/language/projecttreebuilder.cpp | 15 |
5 files changed, 56 insertions, 42 deletions
diff --git a/src/lib/corelib/language/moduleproviderloader.cpp b/src/lib/corelib/language/moduleproviderloader.cpp index 3f578f19b..387b102d0 100644 --- a/src/lib/corelib/language/moduleproviderloader.cpp +++ b/src/lib/corelib/language/moduleproviderloader.cpp @@ -363,7 +363,8 @@ QStringList ModuleProviderLoader::evaluateModuleProvider( providerItem->overrideProperties(moduleConfig, name, m_parameters, m_logger); - m_probesResolver->resolveProbes(&product, providerItem); + product.info.probes << m_probesResolver->resolveProbes({product.name, product.uniqueName()}, + providerItem); EvalContextSwitcher contextSwitcher(m_evaluator->engine(), EvalContext::ModuleProvider); return m_evaluator->stringListValue(providerItem, QStringLiteral("searchPaths")); diff --git a/src/lib/corelib/language/moduleproviderloader.h b/src/lib/corelib/language/moduleproviderloader.h index cd6ba42e0..0e4198092 100644 --- a/src/lib/corelib/language/moduleproviderloader.h +++ b/src/lib/corelib/language/moduleproviderloader.h @@ -43,7 +43,8 @@ #include "projecttreebuilder.h" #include "moduleproviderinfo.h" -#include "probesresolver.h" + +#include <tools/setupprojectparameters.h> #include <QtCore/qmap.h> #include <QtCore/qvariant.h> @@ -52,6 +53,7 @@ namespace qbs { namespace Internal { class ItemReader; class Logger; +class ProbesResolver; class ModuleProviderLoader { diff --git a/src/lib/corelib/language/probesresolver.cpp b/src/lib/corelib/language/probesresolver.cpp index 05308c933..1462c706b 100644 --- a/src/lib/corelib/language/probesresolver.cpp +++ b/src/lib/corelib/language/probesresolver.cpp @@ -40,13 +40,11 @@ #include "probesresolver.h" -#include "builtindeclarations.h" #include "evaluator.h" #include "filecontext.h" #include "item.h" #include "itemreader.h" #include "language.h" -#include "qualifiedid.h" #include "scriptengine.h" #include "value.h" @@ -57,6 +55,7 @@ #include <logging/translator.h> #include <tools/profiling.h> #include <tools/scripttools.h> +#include <tools/setupprojectparameters.h> #include <tools/stringconstants.h> #include <quickjs.h> @@ -82,19 +81,12 @@ static QString probeGlobalId(Item *probe) return id + QLatin1Char('_') + probe->file()->filePath(); } -ProbesResolver::ProbesResolver(Evaluator *evaluator, Logger &logger) - : m_evaluator(evaluator) - , m_logger(logger) +ProbesResolver::ProbesResolver(const SetupProjectParameters ¶meters, Evaluator &evaluator, + Logger &logger) + : m_parameters(parameters), m_evaluator(evaluator), m_logger(logger) { } -void ProbesResolver::setProjectParameters(SetupProjectParameters parameters) -{ - m_parameters = std::move(parameters); - m_elapsedTimeProbes = m_probesEncountered = m_probesRun = m_probesCachedCurrent - = m_probesCachedOld = 0; -} - void ProbesResolver::setOldProjectProbes(const std::vector<ProbeConstPtr> &oldProbes) { m_oldProjectProbes.clear(); @@ -108,17 +100,19 @@ void ProbesResolver::setOldProductProbes( m_oldProductProbes = oldProbes; } -void ProbesResolver::resolveProbes(ProductContext *productContext, Item *item) +std::vector<ProbeConstPtr> ProbesResolver::resolveProbes(const ProductContext &productContext, Item *item) { AccumulatingTimer probesTimer(m_parameters.logElapsedTime() ? &m_elapsedTimeProbes : nullptr); - EvalContextSwitcher evalContextSwitcher(m_evaluator->engine(), EvalContext::ProbeExecution); + EvalContextSwitcher evalContextSwitcher(m_evaluator.engine(), EvalContext::ProbeExecution); + std::vector<ProbeConstPtr> probes; for (Item * const child : item->children()) if (child->type() == ItemType::Probe) - resolveProbe(productContext, item, child); + probes.push_back(resolveProbe(productContext, item, child)); + return probes; } -void ProbesResolver::resolveProbe(ProductContext *productContext, Item *parent, - Item *probe) +ProbeConstPtr ProbesResolver::resolveProbe(const ProductContext &productContext, Item *parent, + Item *probe) { qCDebug(lcModuleLoader) << "Resolving Probe at " << probe->location().toString(); ++m_probesEncountered; @@ -132,7 +126,7 @@ void ProbesResolver::resolveProbe(ProductContext *productContext, Item *parent, throw ErrorInfo(Tr::tr("Probe.configure must be set."), probe->location()); using ProbeProperty = std::pair<QString, ScopedJsValue>; std::vector<ProbeProperty> probeBindings; - ScriptEngine * const engine = m_evaluator->engine(); + ScriptEngine * const engine = m_evaluator.engine(); JSContext * const ctx = engine->context(); QVariantMap initialProperties; for (Item *obj = probe; obj; obj = obj->prototype()) { @@ -141,22 +135,21 @@ void ProbesResolver::resolveProbe(ProductContext *productContext, Item *parent, const QString &name = it.key(); if (name == StringConstants::configureProperty()) continue; - const JSValue value = m_evaluator->value(probe, name); + const JSValue value = m_evaluator.value(probe, name); probeBindings.emplace_back(name, ScopedJsValue(ctx, value)); if (name != StringConstants::conditionProperty()) initialProperties.insert(name, getJsVariant(ctx, value)); } } - const bool condition = m_evaluator->boolValue(probe, StringConstants::conditionProperty()); + const bool condition = m_evaluator.boolValue(probe, StringConstants::conditionProperty()); const QString &sourceCode = configureScript->sourceCode().toString(); ProbeConstPtr resolvedProbe; if (parent->type() == ItemType::Project - || productContext->name.startsWith(StringConstants::shadowProductPrefix())) { + || productContext.name.startsWith(StringConstants::shadowProductPrefix())) { resolvedProbe = findOldProjectProbe(probeId, condition, initialProperties, sourceCode); } else { - const QString &uniqueProductName = productContext->uniqueName(); - resolvedProbe - = findOldProductProbe(uniqueProductName, condition, initialProperties, sourceCode); + resolvedProbe = findOldProductProbe(productContext.uniqueName, condition, + initialProperties, sourceCode); } if (!resolvedProbe) { resolvedProbe = findCurrentProbe(probe->location(), condition, initialProperties); @@ -176,7 +169,7 @@ void ProbesResolver::resolveProbe(ProductContext *productContext, Item *parent, ++m_probesRun; qCDebug(lcModuleLoader) << "configure script needs to run"; const Evaluator::FileContextScopes fileCtxScopes - = m_evaluator->fileContextScopes(configureScript->file()); + = m_evaluator.fileContextScopes(configureScript->file()); configureScope.setValue(engine->newObject()); for (const ProbeProperty &b : probeBindings) setJsProperty(ctx, configureScope, b.first, JS_DupValue(ctx, b.second)); @@ -201,7 +194,7 @@ void ProbesResolver::resolveProbe(ProductContext *productContext, Item *parent, const JSValue saved = v; ScopedJsValue valueMgr(ctx, saved); const PropertyDeclaration decl = probe->propertyDeclaration(b.first); - m_evaluator->convertToPropertyType(decl, probe->location(), v); + m_evaluator.convertToPropertyType(decl, probe->location(), v); // If the value was converted from scalar to array as per our convenience // functionality, then the original value is now the only element of a @@ -229,7 +222,7 @@ void ProbesResolver::resolveProbe(ProductContext *productContext, Item *parent, importedFilesUsedInConfigure); m_currentProbes[probe->location()] << resolvedProbe; } - productContext->info.probes << resolvedProbe; + return resolvedProbe; } ProbeConstPtr ProbesResolver::findOldProjectProbe( diff --git a/src/lib/corelib/language/probesresolver.h b/src/lib/corelib/language/probesresolver.h index 5235ff846..4aae0b887 100644 --- a/src/lib/corelib/language/probesresolver.h +++ b/src/lib/corelib/language/probesresolver.h @@ -41,24 +41,36 @@ #ifndef PROBESRESOLVER_H #define PROBESRESOLVER_H -#include "projecttreebuilder.h" +#include "forward_decls.h" -#include <tools/setupprojectparameters.h> +#include <tools/filetime.h> + +#include <QString> + +#include <vector> namespace qbs { +class SetupProjectParameters; namespace Internal { +class Item; +class Evaluator; +class Logger; class ProbesResolver { public: - explicit ProbesResolver(Evaluator *evaluator, Logger &logger); - void setProjectParameters(SetupProjectParameters parameters); + explicit ProbesResolver(const SetupProjectParameters ¶meters, Evaluator &evaluator, + Logger &logger); void setOldProjectProbes(const std::vector<ProbeConstPtr> &oldProbes); void setOldProductProbes(const QHash<QString, std::vector<ProbeConstPtr>> &oldProbes); - void resolveProbes(ProductContext *productContext, Item *item); - void resolveProbe(ProductContext *productContext, Item *parent, Item *probe); void printProfilingInfo(int indent); + struct ProductContext { + const QString &name; + const QString &uniqueName; + }; + std::vector<ProbeConstPtr> resolveProbes(const ProductContext &productContext, Item *item); + private: ProbeConstPtr findOldProjectProbe(const QString &globalId, bool condition, const QVariantMap &initialProperties, @@ -72,6 +84,7 @@ private: bool probeMatches(const ProbeConstPtr &probe, bool condition, const QVariantMap &initialProperties, const QString &configureScript, CompareScript compareScript) const; + ProbeConstPtr resolveProbe(const ProductContext &productContext, Item *parent, Item *probe); qint64 m_elapsedTimeProbes = 0; quint64 m_probesEncountered = 0; @@ -79,8 +92,8 @@ private: quint64 m_probesCachedCurrent = 0; quint64 m_probesCachedOld = 0; - SetupProjectParameters m_parameters; - Evaluator *m_evaluator = nullptr; + const SetupProjectParameters &m_parameters; + Evaluator &m_evaluator; Logger &m_logger; QHash<QString, std::vector<ProbeConstPtr>> m_oldProjectProbes; QHash<QString, std::vector<ProbeConstPtr>> m_oldProductProbes; diff --git a/src/lib/corelib/language/projecttreebuilder.cpp b/src/lib/corelib/language/projecttreebuilder.cpp index dedf26a88..9910325ac 100644 --- a/src/lib/corelib/language/projecttreebuilder.cpp +++ b/src/lib/corelib/language/projecttreebuilder.cpp @@ -152,6 +152,7 @@ public: void copyProperties(const Item *sourceProject, Item *targetProject); bool mergeExportItems(ProductContext &productContext); bool checkExportItemCondition(Item *exportItem, const ProductContext &product); + void resolveProbes(ProductContext &product, Item *item); Item *loadBaseModule(ProductContext &product, Item *item); @@ -183,7 +184,7 @@ public: ProgressObserver *progressObserver = nullptr; TimingData timingData; ItemReader reader{logger}; - ProbesResolver probesResolver{&evaluator, logger}; + ProbesResolver probesResolver{parameters, evaluator, logger}; ModuleProviderLoader moduleProviderLoader{&reader, &evaluator, &probesResolver, logger}; ModuleLoader moduleLoader{parameters, reader, evaluator, logger}; ModulePropertyMerger propertyMerger{parameters, evaluator, logger}; @@ -235,7 +236,6 @@ ProjectTreeBuilder::ProjectTreeBuilder(const SetupProjectParameters ¶meters, d->reader.setDeprecationWarningMode(parameters.deprecationWarningMode()); d->reader.setEnableTiming(parameters.logElapsedTime()); d->moduleProviderLoader.setProjectParameters(parameters); - d->probesResolver.setProjectParameters(parameters); d->settings = std::make_unique<Settings>(parameters.settingsDirectory()); } @@ -495,7 +495,7 @@ void ProjectTreeBuilder::Private::handleProject( for (Item * const child : projectItem->children()) child->setScope(projectContext.scope); - probesResolver.resolveProbes(&dummyProductContext, projectItem); + resolveProbes(dummyProductContext, projectItem); projectContext.topLevelProject->probes << dummyProductContext.info.probes; localProfiles.collectProfilesFromItems(projectItem, projectContext.scope); @@ -699,7 +699,7 @@ void ProjectTreeBuilder::Private::handleProduct(ProductContext &product, Deferra continue; } try { - probesResolver.resolveProbes(&product, module.item); + resolveProbes(product, module.item); if (module.versionRange.minimum.isValid() || module.versionRange.maximum.isValid()) { if (module.versionRange.maximum.isValid() @@ -732,7 +732,7 @@ void ProjectTreeBuilder::Private::handleProduct(ProductContext &product, Deferra return; } } - probesResolver.resolveProbes(&product, product.item); + resolveProbes(product, product.item); // After the probes have run, we can switch on the evaluator cache. FileTags fileTags = evaluator.fileTagsValue(product.item, StringConstants::typeProperty()); @@ -1574,6 +1574,11 @@ bool ProjectTreeBuilder::Private::checkExportItemCondition(Item *exportItem, return checkItemCondition(exportItem); } +void ProjectTreeBuilder::Private::resolveProbes(ProductContext &product, Item *item) +{ + product.info.probes << probesResolver.resolveProbes({product.name, product.uniqueName()}, item); +} + static void checkForModuleNamePrefixCollision( const Item *product, const ProductContext::ResolvedAndMultiplexedDependsItem &dependency) { |