QmlJS: Convert more dynamic_casts to value_casts.

And introduce a good error message for the case when someone
forgets the specialization of the value_cast template.

Change-Id: Iec55a839e8f5eef5872b1dab8601f66e0e0c88de
Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com>
This commit is contained in:
Christian Kamm
2011-10-12 11:37:58 +02:00
parent 0e8657107c
commit 9abf0e6a9a
3 changed files with 28 additions and 3 deletions

View File

@@ -80,6 +80,7 @@ class ASTObjectValue;
class QmlEnumValue;
class QmlPrototypeReference;
class ASTPropertyReference;
class ASTSignal;
typedef QList<const Value *> ValueList;
@@ -134,13 +135,19 @@ public:
virtual const QmlEnumValue *asQmlEnumValue() const;
virtual const QmlPrototypeReference *asQmlPrototypeReference() const;
virtual const ASTPropertyReference *asAstPropertyReference() const;
virtual const ASTSignal *asAstSignal() const;
virtual void accept(ValueVisitor *) const = 0;
virtual bool getSourceLocation(QString *fileName, int *line, int *column) const;
};
template <typename _RetTy> const _RetTy *value_cast(const Value *v);
template <typename _RetTy> const _RetTy *value_cast(const Value *)
{
// Produce a good error message if a specialization is missing.
_RetTy::ERROR_MissingValueCastSpecialization();
return 0;
}
template <> Q_INLINE_TEMPLATE const NullValue *value_cast(const Value *v)
{
@@ -250,6 +257,12 @@ template <> Q_INLINE_TEMPLATE const ASTPropertyReference *value_cast(const Value
else return 0;
}
template <> Q_INLINE_TEMPLATE const ASTSignal *value_cast(const Value *v)
{
if (v) return v->asAstSignal();
else return 0;
}
////////////////////////////////////////////////////////////////////////////////
// Value nodes
////////////////////////////////////////////////////////////////////////////////
@@ -821,6 +834,8 @@ public:
ASTSignal(AST::UiPublicMember *ast, const Document *doc, ValueOwner *valueOwner);
virtual ~ASTSignal();
virtual const ASTSignal *asAstSignal() const;
AST::UiPublicMember *ast() const { return _ast; }
QString slotName() const { return _slotName; }
const ObjectValue *bodyScope() const { return _bodyScope; }