blob: bcc0b298a85307d07fb92095633afe16b11e2519 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtDeclarative module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QDECLARATIVECOMPILER_P_H
#define QDECLARATIVECOMPILER_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "qdeclarative.h"
#include "qdeclarativeerror.h"
#include "private/qdeclarativeinstruction_p.h"
#include "private/qdeclarativeparser_p.h"
#include "private/qdeclarativeengine_p.h"
#include "private/qbitfield_p.h"
#include "private/qdeclarativepropertycache_p.h"
#include "private/qdeclarativeintegercache_p.h"
#include "private/qdeclarativetypenamecache_p.h"
#include "private/qdeclarativetypeloader_p.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qset.h>
#include <QtCore/QCoreApplication>
QT_BEGIN_NAMESPACE
class QDeclarativeEngine;
class QDeclarativeComponent;
class QDeclarativeContext;
class QDeclarativeContextData;
class QScriptProgram;
class Q_AUTOTEST_EXPORT QDeclarativeCompiledData : public QDeclarativeRefCount, public QDeclarativeCleanup
{
public:
QDeclarativeCompiledData(QDeclarativeEngine *engine);
virtual ~QDeclarativeCompiledData();
QString name;
QUrl url;
QDeclarativeTypeNameCache *importCache;
struct TypeReference
{
TypeReference()
: type(0), typePropertyCache(0), component(0) {}
QByteArray className;
QDeclarativeType *type;
QDeclarativePropertyCache *typePropertyCache;
QDeclarativeCompiledData *component;
QObject *createInstance(QDeclarativeContextData *, const QBitField &, QList<QDeclarativeError> *) const;
const QMetaObject *metaObject() const;
QDeclarativePropertyCache *propertyCache() const;
QDeclarativePropertyCache *createPropertyCache(QDeclarativeEngine *);
};
QList<TypeReference> types;
struct CustomTypeData
{
int index;
int type;
};
const QMetaObject *root;
QAbstractDynamicMetaObject rootData;
QDeclarativePropertyCache *rootPropertyCache;
QList<QString> primitives;
QList<float> floatData;
QList<int> intData;
QList<CustomTypeData> customTypeData;
QList<QByteArray> datas;
QList<QDeclarativeParser::Location> locations;
QList<QDeclarativeInstruction> bytecode;
QList<QScriptProgram *> cachedPrograms;
QList<QScriptValue *> cachedClosures;
QList<QDeclarativePropertyCache *> propertyCaches;
QList<QDeclarativeIntegerCache *> contextCaches;
QList<QDeclarativeParser::Object::ScriptBlock> scripts;
QList<QUrl> urls;
void dumpInstructions();
protected:
virtual void clear(); // From QDeclarativeCleanup
private:
void dump(QDeclarativeInstruction *, int idx = -1);
QDeclarativeCompiledData(const QDeclarativeCompiledData &other);
QDeclarativeCompiledData &operator=(const QDeclarativeCompiledData &other);
QByteArray packData;
friend class QDeclarativeCompiler;
int pack(const char *, size_t);
int indexForString(const QString &);
int indexForByteArray(const QByteArray &);
int indexForFloat(float *, int);
int indexForInt(int *, int);
int indexForLocation(const QDeclarativeParser::Location &);
int indexForLocation(const QDeclarativeParser::LocationSpan &);
int indexForUrl(const QUrl &);
};
class QMetaObjectBuilder;
class Q_AUTOTEST_EXPORT QDeclarativeCompiler
{
Q_DECLARE_TR_FUNCTIONS(QDeclarativeCompiler)
public:
QDeclarativeCompiler();
bool compile(QDeclarativeEngine *, QDeclarativeTypeData *, QDeclarativeCompiledData *);
bool isError() const;
QList<QDeclarativeError> errors() const;
static bool isAttachedPropertyName(const QByteArray &);
static bool isSignalPropertyName(const QByteArray &);
int evaluateEnum(const QByteArray& script) const; // for QDeclarativeCustomParser::evaluateEnum
const QMetaObject *resolveType(const QByteArray& name) const; // for QDeclarativeCustomParser::resolveType
int rewriteBinding(const QString& expression, const QByteArray& name); // for QDeclarativeCustomParser::rewriteBinding
private:
static void reset(QDeclarativeCompiledData *);
struct BindingContext {
BindingContext()
: stack(0), owner(0), object(0) {}
BindingContext(QDeclarativeParser::Object *o)
: stack(0), owner(0), object(o) {}
BindingContext incr() const {
BindingContext rv(object);
rv.stack = stack + 1;
return rv;
}
bool isSubContext() const { return stack != 0; }
int stack;
int owner;
QDeclarativeParser::Object *object;
};
void compileTree(QDeclarativeParser::Object *tree);
bool buildObject(QDeclarativeParser::Object *obj, const BindingContext &);
bool buildComponent(QDeclarativeParser::Object *obj, const BindingContext &);
bool buildSubObject(QDeclarativeParser::Object *obj, const BindingContext &);
bool buildSignal(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj,
const BindingContext &);
bool buildProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj,
const BindingContext &);
bool buildPropertyInNamespace(QDeclarativeImportedNamespace *ns,
QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
const BindingContext &);
bool buildIdProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
bool buildAttachedProperty(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
const BindingContext &ctxt);
bool buildGroupedProperty(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
const BindingContext &ctxt);
bool buildValueTypeProperty(QObject *type,
QDeclarativeParser::Object *obj,
QDeclarativeParser::Object *baseObj,
const BindingContext &ctxt);
bool buildListProperty(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
const BindingContext &ctxt);
bool buildScriptStringProperty(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
const BindingContext &ctxt);
bool buildPropertyAssignment(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
const BindingContext &ctxt);
bool buildPropertyObjectAssignment(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
QDeclarativeParser::Value *value,
const BindingContext &ctxt);
bool buildPropertyOnAssignment(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
QDeclarativeParser::Object *baseObj,
QDeclarativeParser::Value *value,
const BindingContext &ctxt);
bool buildPropertyLiteralAssignment(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
QDeclarativeParser::Value *value,
const BindingContext &ctxt);
bool doesPropertyExist(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
bool testLiteralAssignment(const QMetaProperty &prop,
QDeclarativeParser::Value *value);
bool testQualifiedEnumAssignment(const QMetaProperty &prop,
QDeclarativeParser::Object *obj,
QDeclarativeParser::Value *value,
bool *isAssignment);
enum DynamicMetaMode { IgnoreAliases, ResolveAliases, ForceCreation };
bool mergeDynamicMetaProperties(QDeclarativeParser::Object *obj);
bool buildDynamicMeta(QDeclarativeParser::Object *obj, DynamicMetaMode mode);
bool checkDynamicMeta(QDeclarativeParser::Object *obj);
bool buildBinding(QDeclarativeParser::Value *, QDeclarativeParser::Property *prop,
const BindingContext &ctxt);
bool buildComponentFromRoot(QDeclarativeParser::Object *obj, const BindingContext &);
bool compileAlias(QMetaObjectBuilder &,
QByteArray &data,
QDeclarativeParser::Object *obj,
const QDeclarativeParser::Object::DynamicProperty &);
bool completeComponentBuild();
bool checkValidId(QDeclarativeParser::Value *, const QString &);
void genObject(QDeclarativeParser::Object *obj);
void genObjectBody(QDeclarativeParser::Object *obj);
void genValueTypeProperty(QDeclarativeParser::Object *obj,QDeclarativeParser::Property *);
void genComponent(QDeclarativeParser::Object *obj);
void genValueProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
void genListProperty(QDeclarativeParser::Property *prop, QDeclarativeParser::Object *obj);
void genPropertyAssignment(QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
QDeclarativeParser::Property *valueTypeProperty = 0);
void genLiteralAssignment(const QMetaProperty &prop,
QDeclarativeParser::Value *value);
void genBindingAssignment(QDeclarativeParser::Value *binding,
QDeclarativeParser::Property *prop,
QDeclarativeParser::Object *obj,
QDeclarativeParser::Property *valueTypeProperty = 0);
int genContextCache();
int genValueTypeData(QDeclarativeParser::Property *prop, QDeclarativeParser::Property *valueTypeProp);
int genPropertyData(QDeclarativeParser::Property *prop);
int componentTypeRef();
static QDeclarativeType *toQmlType(QDeclarativeParser::Object *from);
bool canCoerce(int to, QDeclarativeParser::Object *from);
QStringList deferredProperties(QDeclarativeParser::Object *);
int indexOfProperty(QDeclarativeParser::Object *, const QByteArray &, bool *notInRevision = 0);
int indexOfSignal(QDeclarativeParser::Object *, const QByteArray &, bool *notInRevision = 0);
void addId(const QString &, QDeclarativeParser::Object *);
void dumpStats();
struct BindingReference {
QDeclarativeParser::Variant expression;
QDeclarativeParser::Property *property;
QDeclarativeParser::Value *value;
enum DataType { QtScript, Experimental };
DataType dataType;
int compiledIndex;
QByteArray compiledData;
BindingContext bindingContext;
};
void addBindingReference(const BindingReference &);
struct ComponentCompileState
{
ComponentCompileState()
: parserStatusCount(0), pushedProperties(0), root(0) {}
QHash<QString, QDeclarativeParser::Object *> ids;
QHash<int, QDeclarativeParser::Object *> idIndexes;
int parserStatusCount;
int pushedProperties;
QByteArray compiledBindingData;
QHash<QDeclarativeParser::Value *, BindingReference> bindings;
QHash<QDeclarativeParser::Value *, BindingContext> signalExpressions;
QList<QDeclarativeParser::Object *> aliasingObjects;
QDeclarativeParser::Object *root;
};
ComponentCompileState compileState;
struct ComponentStat
{
ComponentStat() : ids(0), objects(0) {}
int lineNumber;
int ids;
QList<QDeclarativeParser::LocationSpan> scriptBindings;
QList<QDeclarativeParser::LocationSpan> optimizedBindings;
int objects;
};
ComponentStat componentStat;
void saveComponentState();
ComponentCompileState componentState(QDeclarativeParser::Object *);
QHash<QDeclarativeParser::Object *, ComponentCompileState> savedCompileStates;
QList<ComponentStat> savedComponentStats;
QList<QDeclarativeError> exceptions;
QDeclarativeCompiledData *output;
QDeclarativeEngine *engine;
QDeclarativeEnginePrivate *enginePrivate;
QDeclarativeParser::Object *unitRoot;
QDeclarativeTypeData *unit;
};
QT_END_NAMESPACE
#endif // QDECLARATIVECOMPILER_P_H