QmlJS: Add more value_casts.

And switch all existing dynamic_casts to value_casts.

Change-Id: I93b89358e4802080f40b332074c64f4e91a2bc4c
Reviewed-on: http://codereview.qt-project.org/6311
Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
This commit is contained in:
Christian Kamm
2011-10-10 10:55:37 +02:00
parent 572b3a180b
commit 7ed717ca62
14 changed files with 161 additions and 63 deletions

View File

@@ -75,6 +75,11 @@ class JSImportScope;
class Context;
typedef QSharedPointer<const Context> ContextPtr;
class ReferenceContext;
class CppComponentValue;
class ASTObjectValue;
class QmlEnumValue;
class QmlPrototypeReference;
class ASTPropertyReference;
typedef QList<const Value *> ValueList;
@@ -124,13 +129,18 @@ public:
virtual const Reference *asReference() const;
virtual const ColorValue *asColorValue() const;
virtual const AnchorLineValue *asAnchorLineValue() const;
virtual const CppComponentValue *asCppComponentValue() const;
virtual const ASTObjectValue *asAstObjectValue() const;
virtual const QmlEnumValue *asQmlEnumValue() const;
virtual const QmlPrototypeReference *asQmlPrototypeReference() const;
virtual const ASTPropertyReference *asAstPropertyReference() const;
virtual void accept(ValueVisitor *) const = 0;
virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
};
template <typename _RetTy> _RetTy value_cast(const Value *v);
template <typename _RetTy> const _RetTy *value_cast(const Value *v);
template <> Q_INLINE_TEMPLATE const NullValue *value_cast(const Value *v)
{
@@ -210,6 +220,36 @@ template <> Q_INLINE_TEMPLATE const AnchorLineValue *value_cast(const Value *v)
else return 0;
}
template <> Q_INLINE_TEMPLATE const CppComponentValue *value_cast(const Value *v)
{
if (v) return v->asCppComponentValue();
else return 0;
}
template <> Q_INLINE_TEMPLATE const ASTObjectValue *value_cast(const Value *v)
{
if (v) return v->asAstObjectValue();
else return 0;
}
template <> Q_INLINE_TEMPLATE const QmlEnumValue *value_cast(const Value *v)
{
if (v) return v->asQmlEnumValue();
else return 0;
}
template <> Q_INLINE_TEMPLATE const QmlPrototypeReference *value_cast(const Value *v)
{
if (v) return v->asQmlPrototypeReference();
else return 0;
}
template <> Q_INLINE_TEMPLATE const ASTPropertyReference *value_cast(const Value *v)
{
if (v) return v->asAstPropertyReference();
else return 0;
}
////////////////////////////////////////////////////////////////////////////////
// Value nodes
////////////////////////////////////////////////////////////////////////////////
@@ -394,14 +434,14 @@ private:
Error m_error;
};
class CppComponentValue;
class QMLJS_EXPORT QmlEnumValue: public NumberValue
{
public:
QmlEnumValue(const CppComponentValue *owner, int index);
virtual ~QmlEnumValue();
virtual const QmlEnumValue *asQmlEnumValue() const;
QString name() const;
QStringList keys() const;
const CppComponentValue *owner() const;
@@ -423,6 +463,8 @@ public:
ValueOwner *valueOwner);
virtual ~CppComponentValue();
virtual const CppComponentValue *asCppComponentValue() const;
virtual void processMembers(MemberProcessor *processor) const;
const Value *valueForCppName(const QString &typeName) const;
@@ -701,6 +743,8 @@ public:
QmlPrototypeReference(AST::UiQualifiedId *qmlTypeName, const Document *doc, ValueOwner *valueOwner);
virtual ~QmlPrototypeReference();
virtual const QmlPrototypeReference *asQmlPrototypeReference() const;
AST::UiQualifiedId *qmlTypeName() const;
private:
@@ -755,6 +799,8 @@ public:
ASTPropertyReference(AST::UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner);
virtual ~ASTPropertyReference();
virtual const ASTPropertyReference *asAstPropertyReference() const;
AST::UiPublicMember *ast() const { return _ast; }
QString onChangedSlotName() const { return _onChangedSlotName; }
@@ -804,6 +850,8 @@ public:
ValueOwner *valueOwner);
virtual ~ASTObjectValue();
virtual const ASTObjectValue *asAstObjectValue() const;
bool getSourceLocation(QString *fileName, int *line, int *column) const;
virtual void processMembers(MemberProcessor *processor) const;