summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2023-04-20 13:14:54 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2023-04-20 13:28:47 +0000
commit02748c559938a90b9ea8ffc6544cc7fb65266239 (patch)
treecb777feab62c2565b0e9533e004c05a1a1451c2f
parentfb52fed84a1510a7de0172e643d6fd66a780e2e8 (diff)
downloadqbs-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.cpp3
-rw-r--r--src/lib/corelib/language/moduleproviderloader.h4
-rw-r--r--src/lib/corelib/language/probesresolver.cpp47
-rw-r--r--src/lib/corelib/language/probesresolver.h29
-rw-r--r--src/lib/corelib/language/projecttreebuilder.cpp15
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 &parameters, 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 &parameters, 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 &parameters,
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)
{