summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-07-25 10:26:18 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2013-07-25 12:18:16 +0200
commitdaabd183bfc32301bec50a40275152bba66d71da (patch)
tree88a3fd066e874c897614ef9e763391483b165177
parentda7c5375c92fc06eb45c3411a75e0e8dd31464df (diff)
downloadqbs-daabd183bfc32301bec50a40275152bba66d71da.tar.gz
set up declarations for every builtin item
Some builtin items that are injected after reading the project did not have any property declarations. The declarations contain the default values and we want to use the default values from the declarations in the next commit. Preparation for fixing QBS-341. Change-Id: Ic82375b8bfd9f1c092d2b4d9aab54c70dc866272 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
-rw-r--r--src/lib/language/builtindeclarations.cpp15
-rw-r--r--src/lib/language/builtindeclarations.h6
-rw-r--r--src/lib/language/item.h1
-rw-r--r--src/lib/language/itemreaderastvisitor.cpp12
-rw-r--r--src/lib/language/loader.cpp2
-rw-r--r--src/lib/language/moduleloader.cpp1
-rw-r--r--src/lib/language/moduleloader.h2
-rw-r--r--src/lib/language/projectresolver.cpp6
-rw-r--r--src/lib/language/projectresolver.h4
9 files changed, 33 insertions, 16 deletions
diff --git a/src/lib/language/builtindeclarations.cpp b/src/lib/language/builtindeclarations.cpp
index 1df7649a9..5ea695924 100644
--- a/src/lib/language/builtindeclarations.cpp
+++ b/src/lib/language/builtindeclarations.cpp
@@ -128,6 +128,21 @@ QList<PropertyDeclaration> BuiltinDeclarations::declarationsForType(const QStrin
return m_builtins.value(typeName);
}
+void BuiltinDeclarations::setupItemForBuiltinType(Item *item) const
+{
+ foreach (const PropertyDeclaration &pd, declarationsForType(item->typeName())) {
+ item->m_propertyDeclarations.insert(pd.name, pd);
+ ValuePtr &value = item->m_properties[pd.name];
+ if (!value) {
+ JSSourceValuePtr sourceValue = JSSourceValue::create();
+ sourceValue->setFile(item->file());
+ sourceValue->setSourceCode(pd.initialValueSource.isEmpty() ?
+ "undefined" : pd.initialValueSource);
+ value = sourceValue;
+ }
+ }
+}
+
static PropertyDeclaration conditionProperty()
{
return PropertyDeclaration(QLatin1String("condition"), PropertyDeclaration::Boolean);
diff --git a/src/lib/language/builtindeclarations.h b/src/lib/language/builtindeclarations.h
index 7f5ddeda6..1f0c26e69 100644
--- a/src/lib/language/builtindeclarations.h
+++ b/src/lib/language/builtindeclarations.h
@@ -30,13 +30,16 @@
#ifndef QBS_BUILTINDECLARATIONS_H
#define QBS_BUILTINDECLARATIONS_H
-#include <language/propertydeclaration.h>
+#include "propertydeclaration.h"
+
#include <QByteArray>
#include <QMap>
namespace qbs {
namespace Internal {
+class Item;
+
class BuiltinDeclarations
{
public:
@@ -45,6 +48,7 @@ public:
QString languageVersion() const;
QByteArray qmlTypeInfo() const;
QList<PropertyDeclaration> declarationsForType(const QString &typeName) const;
+ void setupItemForBuiltinType(qbs::Internal::Item *item) const;
private:
void addArtifactItem();
diff --git a/src/lib/language/item.h b/src/lib/language/item.h
index af59c0dbd..626d0e6cf 100644
--- a/src/lib/language/item.h
+++ b/src/lib/language/item.h
@@ -53,6 +53,7 @@ class ProjectFile;
class Item : public QbsQmlJS::Managed
{
+ friend class BuiltinDeclarations;
friend class ItemPool;
friend class ItemReaderASTVisitor;
Q_DISABLE_COPY(Item)
diff --git a/src/lib/language/itemreaderastvisitor.cpp b/src/lib/language/itemreaderastvisitor.cpp
index b5a3ef846..cf02105ea 100644
--- a/src/lib/language/itemreaderastvisitor.cpp
+++ b/src/lib/language/itemreaderastvisitor.cpp
@@ -270,17 +270,7 @@ bool ItemReaderASTVisitor::visit(AST::UiObjectDefinition *ast)
qSwap(m_item, item);
}
- foreach (const PropertyDeclaration &pd, m_reader->builtins()->declarationsForType(typeName)) {
- item->m_propertyDeclarations.insert(pd.name, pd);
- ValuePtr &value = item->m_properties[pd.name];
- if (!value) {
- JSSourceValuePtr sourceValue = JSSourceValue::create();
- sourceValue->setFile(item->file());
- sourceValue->setSourceCode(pd.initialValueSource.isEmpty() ?
- "undefined" : pd.initialValueSource);
- value = sourceValue;
- }
- }
+ m_reader->m_builtins->setupItemForBuiltinType(item);
if (item->typeName() != QLatin1String("Properties")
&& item->typeName() != QLatin1String("SubProject")) {
diff --git a/src/lib/language/loader.cpp b/src/lib/language/loader.cpp
index 2e3fd90a9..fa047942b 100644
--- a/src/lib/language/loader.cpp
+++ b/src/lib/language/loader.cpp
@@ -49,7 +49,7 @@ Loader::Loader(ScriptEngine *engine, const Logger &logger)
, m_progressObserver(0)
, m_builtins(new BuiltinDeclarations)
, m_moduleLoader(new ModuleLoader(engine, m_builtins, logger))
- , m_projectResolver(new ProjectResolver(m_moduleLoader, logger))
+ , m_projectResolver(new ProjectResolver(m_moduleLoader, m_builtins, logger))
, m_engine(engine)
{
}
diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp
index 8d738123c..5cd040611 100644
--- a/src/lib/language/moduleloader.cpp
+++ b/src/lib/language/moduleloader.cpp
@@ -936,6 +936,7 @@ Item *ModuleLoader::wrapWithProject(Item *item)
prj->setTypeName("Project");
prj->setFile(item->file());
prj->setLocation(item->location());
+ m_reader->builtins()->setupItemForBuiltinType(prj);
return prj;
}
diff --git a/src/lib/language/moduleloader.h b/src/lib/language/moduleloader.h
index e30d6bd4f..426123489 100644
--- a/src/lib/language/moduleloader.h
+++ b/src/lib/language/moduleloader.h
@@ -177,7 +177,7 @@ private:
bool checkItemCondition(Item *item);
QStringList readExtraSearchPaths(Item *item);
void copyProperties(const Item *sourceProject, Item *targetProject);
- static Item *wrapWithProject(Item *item);
+ Item *wrapWithProject(Item *item);
static QString findExistingModulePath(const QString &searchPath,
const QStringList &moduleName);
static void copyProperty(const QString &propertyName, const Item *source, Item *destination);
diff --git a/src/lib/language/projectresolver.cpp b/src/lib/language/projectresolver.cpp
index 1193627ab..d2ee70ae0 100644
--- a/src/lib/language/projectresolver.cpp
+++ b/src/lib/language/projectresolver.cpp
@@ -30,6 +30,7 @@
#include "projectresolver.h"
#include "artifactproperties.h"
+#include "builtindeclarations.h"
#include "evaluator.h"
#include "filecontext.h"
#include "item.h"
@@ -61,8 +62,10 @@ static const FileTag unknownFileTag()
return tag;
}
-ProjectResolver::ProjectResolver(ModuleLoader *ldr, const Logger &logger)
+ProjectResolver::ProjectResolver(ModuleLoader *ldr, const BuiltinDeclarations *builtins,
+ const Logger &logger)
: m_evaluator(ldr->evaluator())
+ , m_builtins(builtins)
, m_logger(logger)
, m_engine(m_evaluator->engine())
, m_progressObserver(0)
@@ -282,6 +285,7 @@ void ProjectResolver::resolveProduct(Item *item, ProjectContext *projectContext)
fakeGroup->setProperty(QLatin1String("excludeFiles"),
item->property(QLatin1String("excludeFiles")));
fakeGroup->setProperty(QLatin1String("overrideTags"), VariantValue::create(false));
+ m_builtins->setupItemForBuiltinType(fakeGroup);
subItems.prepend(fakeGroup);
}
diff --git a/src/lib/language/projectresolver.h b/src/lib/language/projectresolver.h
index d7d3fc4ab..dcbdbfb12 100644
--- a/src/lib/language/projectresolver.h
+++ b/src/lib/language/projectresolver.h
@@ -41,6 +41,7 @@
namespace qbs {
namespace Internal {
+class BuiltinDeclarations;
class Evaluator;
class Item;
class ModuleLoader;
@@ -52,7 +53,7 @@ struct ModuleLoaderResult;
class ProjectResolver
{
public:
- ProjectResolver(ModuleLoader *ldr, const Logger &logger);
+ ProjectResolver(ModuleLoader *ldr, const BuiltinDeclarations *builtins, const Logger &logger);
~ProjectResolver();
void setProgressObserver(ProgressObserver *observer);
@@ -114,6 +115,7 @@ private:
ProjectContext createProjectContext(ProjectContext *parentProjectContext) const;
Evaluator *m_evaluator;
+ const BuiltinDeclarations *m_builtins;
Logger m_logger;
ScriptEngine *m_engine;
ProgressObserver *m_progressObserver;