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

@@ -81,7 +81,7 @@ public:
virtual void visit(const NumberValue *value)
{
if (const QmlEnumValue *enumValue = dynamic_cast<const QmlEnumValue *>(value)) {
if (const QmlEnumValue *enumValue = value_cast<QmlEnumValue>(value)) {
if (StringLiteral *stringLiteral = cast<StringLiteral *>(_ast)) {
const QString valueName = stringLiteral->value.toString();
@@ -643,7 +643,7 @@ void Check::visitQmlObject(Node *ast, UiQualifiedId *typeId,
const ObjectValue *lastPrototype = prototypes.last();
if (iter.error() == PrototypeIterator::ReferenceResolutionError) {
if (const QmlPrototypeReference *ref =
dynamic_cast<const QmlPrototypeReference *>(lastPrototype->prototype())) {
value_cast<QmlPrototypeReference>(lastPrototype->prototype())) {
addMessage(ErrCouldNotResolvePrototypeOf, typeErrorLocation,
toString(ref->qmlTypeName()), lastPrototype->className());
} else {
@@ -778,7 +778,7 @@ bool Check::visit(IdentifierExpression *)
// _lastValue = evaluator.reference(ast);
// if (!_lastValue)
// addMessage(ErrUnknownIdentifier, ast->identifierToken);
// if (const Reference *ref = value_cast<const Reference *>(_lastValue)) {
// if (const Reference *ref = value_cast<Reference>(_lastValue)) {
// _lastValue = _context->lookupReference(ref);
// if (!_lastValue)
// error(ast->identifierToken, tr("could not resolve"));
@@ -1293,7 +1293,7 @@ const Value *Check::checkScopeObjectMember(const UiQualifiedId *id)
// member lookup
const UiQualifiedId *idPart = id;
while (idPart->next) {
const ObjectValue *objectValue = value_cast<const ObjectValue *>(value);
const ObjectValue *objectValue = value_cast<ObjectValue>(value);
if (! objectValue) {
addMessage(ErrDoesNotHaveMembers, idPart->identifierToken, propertyName);
return 0;

View File

@@ -134,11 +134,11 @@ QString Context::defaultPropertyName(const ObjectValue *object) const
PrototypeIterator iter(object, this);
while (iter.hasNext()) {
const ObjectValue *o = iter.next();
if (const ASTObjectValue *astObjValue = dynamic_cast<const ASTObjectValue *>(o)) {
if (const ASTObjectValue *astObjValue = value_cast<ASTObjectValue>(o)) {
QString defaultProperty = astObjValue->defaultPropertyName();
if (!defaultProperty.isEmpty())
return defaultProperty;
} else if (const CppComponentValue *qmlValue = dynamic_cast<const CppComponentValue *>(o)) {
} else if (const CppComponentValue *qmlValue = value_cast<CppComponentValue>(o)) {
return qmlValue->defaultPropertyName();
}
}
@@ -151,7 +151,7 @@ ReferenceContext::ReferenceContext(const ContextPtr &context)
const Value *ReferenceContext::lookupReference(const Value *value)
{
const Reference *reference = value_cast<const Reference *>(value);
const Reference *reference = value_cast<Reference>(value);
if (!reference)
return value;

View File

@@ -62,7 +62,7 @@ const Value *Evaluate::value(AST::Node *ast)
{
const Value *result = reference(ast);
if (const Reference *ref = value_cast<const Reference *>(result)) {
if (const Reference *ref = value_cast<Reference>(result)) {
if (_referenceContext)
result = _referenceContext->lookupReference(ref);
else
@@ -176,7 +176,7 @@ bool Evaluate::visit(AST::UiQualifiedId *ast)
_result = value;
} else {
const ObjectValue *base = value_cast<const ObjectValue *>(value);
const ObjectValue *base = value_cast<ObjectValue>(value);
for (AST::UiQualifiedId *it = ast->next; base && it; it = it->next) {
const QString &name = it->name.toString();
@@ -187,7 +187,7 @@ bool Evaluate::visit(AST::UiQualifiedId *ast)
if (! it->next)
_result = value;
else
base = value_cast<const ObjectValue *>(value);
base = value_cast<ObjectValue>(value);
}
}
@@ -328,7 +328,7 @@ bool Evaluate::visit(AST::FieldMemberExpression *ast)
bool Evaluate::visit(AST::NewMemberExpression *ast)
{
if (const FunctionValue *ctor = value_cast<const FunctionValue *>(value(ast->base))) {
if (const FunctionValue *ctor = value_cast<FunctionValue>(value(ast->base))) {
_result = ctor->construct();
}
return false;
@@ -336,7 +336,7 @@ bool Evaluate::visit(AST::NewMemberExpression *ast)
bool Evaluate::visit(AST::NewExpression *ast)
{
if (const FunctionValue *ctor = value_cast<const FunctionValue *>(value(ast->expression))) {
if (const FunctionValue *ctor = value_cast<FunctionValue>(value(ast->expression))) {
_result = ctor->construct();
}
return false;

View File

@@ -193,6 +193,11 @@ static QString generatedSlotName(const QString &base)
return slotName;
}
const CppComponentValue *CppComponentValue::asCppComponentValue() const
{
return this;
}
void CppComponentValue::processMembers(MemberProcessor *processor) const
{
// process the meta enums
@@ -337,7 +342,7 @@ const Value *CppComponentValue::valueForCppName(const QString &typeName) const
const CppComponentValue *CppComponentValue::prototype() const
{
Q_ASSERT(!_prototype || dynamic_cast<const CppComponentValue *>(_prototype));
Q_ASSERT(!_prototype || value_cast<CppComponentValue>(_prototype));
return static_cast<const CppComponentValue *>(_prototype);
}
@@ -522,6 +527,11 @@ QmlEnumValue::~QmlEnumValue()
{
}
const QmlEnumValue *QmlEnumValue::asQmlEnumValue() const
{
return this;
}
QString QmlEnumValue::name() const
{
return _owner->metaObject()->enumerator(_enumIndex).name();
@@ -669,6 +679,31 @@ const AnchorLineValue *Value::asAnchorLineValue() const
return 0;
}
const CppComponentValue *Value::asCppComponentValue() const
{
return 0;
}
const ASTObjectValue *Value::asAstObjectValue() const
{
return 0;
}
const QmlEnumValue *Value::asQmlEnumValue() const
{
return 0;
}
const QmlPrototypeReference *Value::asQmlPrototypeReference() const
{
return 0;
}
const ASTPropertyReference *Value::asAstPropertyReference() const
{
return 0;
}
////////////////////////////////////////////////////////////////////////////////
// Values
////////////////////////////////////////////////////////////////////////////////
@@ -853,10 +888,10 @@ const Value *ObjectValue::prototype() const
const ObjectValue *ObjectValue::prototype(const Context *context) const
{
const ObjectValue *prototypeObject = value_cast<const ObjectValue *>(_prototype);
const ObjectValue *prototypeObject = value_cast<ObjectValue>(_prototype);
if (! prototypeObject) {
if (const Reference *prototypeReference = value_cast<const Reference *>(_prototype)) {
prototypeObject = value_cast<const ObjectValue *>(context->lookupReference(prototypeReference));
if (const Reference *prototypeReference = value_cast<Reference>(_prototype)) {
prototypeObject = value_cast<ObjectValue>(context->lookupReference(prototypeReference));
}
}
return prototypeObject;
@@ -981,9 +1016,9 @@ bool PrototypeIterator::hasNext()
if (!proto)
return false;
m_next = value_cast<const ObjectValue *>(proto);
m_next = value_cast<ObjectValue>(proto);
if (! m_next)
m_next = value_cast<const ObjectValue *>(m_context->lookupReference(proto));
m_next = value_cast<ObjectValue>(m_context->lookupReference(proto));
if (!m_next) {
m_error = ReferenceResolutionError;
return false;
@@ -1480,15 +1515,15 @@ void ConvertToNumber::visit(const StringValue *)
void ConvertToNumber::visit(const ObjectValue *object)
{
if (const FunctionValue *valueOfMember = value_cast<const FunctionValue *>(object->lookupMember("valueOf", ContextPtr()))) {
_result = value_cast<const NumberValue *>(valueOfMember->call(object)); // ### invoke convert-to-number?
if (const FunctionValue *valueOfMember = value_cast<FunctionValue>(object->lookupMember("valueOf", ContextPtr()))) {
_result = value_cast<NumberValue>(valueOfMember->call(object)); // ### invoke convert-to-number?
}
}
void ConvertToNumber::visit(const FunctionValue *object)
{
if (const FunctionValue *valueOfMember = value_cast<const FunctionValue *>(object->lookupMember("valueOf", ContextPtr()))) {
_result = value_cast<const NumberValue *>(valueOfMember->call(object)); // ### invoke convert-to-number?
if (const FunctionValue *valueOfMember = value_cast<FunctionValue>(object->lookupMember("valueOf", ContextPtr()))) {
_result = value_cast<NumberValue>(valueOfMember->call(object)); // ### invoke convert-to-number?
}
}
@@ -1541,15 +1576,15 @@ void ConvertToString::visit(const StringValue *value)
void ConvertToString::visit(const ObjectValue *object)
{
if (const FunctionValue *toStringMember = value_cast<const FunctionValue *>(object->lookupMember("toString", ContextPtr()))) {
_result = value_cast<const StringValue *>(toStringMember->call(object)); // ### invoke convert-to-string?
if (const FunctionValue *toStringMember = value_cast<FunctionValue>(object->lookupMember("toString", ContextPtr()))) {
_result = value_cast<StringValue>(toStringMember->call(object)); // ### invoke convert-to-string?
}
}
void ConvertToString::visit(const FunctionValue *object)
{
if (const FunctionValue *toStringMember = value_cast<const FunctionValue *>(object->lookupMember("toString", ContextPtr()))) {
_result = value_cast<const StringValue *>(toStringMember->call(object)); // ### invoke convert-to-string?
if (const FunctionValue *toStringMember = value_cast<FunctionValue>(object->lookupMember("toString", ContextPtr()))) {
_result = value_cast<StringValue>(toStringMember->call(object)); // ### invoke convert-to-string?
}
}
@@ -1705,6 +1740,11 @@ ASTObjectValue::~ASTObjectValue()
{
}
const ASTObjectValue *ASTObjectValue::asAstObjectValue() const
{
return this;
}
bool ASTObjectValue::getSourceLocation(QString *fileName, int *line, int *column) const
{
*fileName = _doc->fileName();
@@ -1856,6 +1896,11 @@ QmlPrototypeReference::~QmlPrototypeReference()
{
}
const QmlPrototypeReference *QmlPrototypeReference::asQmlPrototypeReference() const
{
return this;
}
UiQualifiedId *QmlPrototypeReference::qmlTypeName() const
{
return _qmlTypeName;
@@ -1878,6 +1923,11 @@ ASTPropertyReference::~ASTPropertyReference()
{
}
const ASTPropertyReference *ASTPropertyReference::asAstPropertyReference() const
{
return this;
}
bool ASTPropertyReference::getSourceLocation(QString *fileName, int *line, int *column) const
{
*fileName = _doc->fileName();

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;

View File

@@ -185,7 +185,7 @@ void ScopeBuilder::setQmlScopeObject(Node *node)
iter.next();
while (iter.hasNext()) {
const ObjectValue *prototype = iter.next();
if (const CppComponentValue *qmlMetaObject = dynamic_cast<const CppComponentValue *>(prototype)) {
if (const CppComponentValue *qmlMetaObject = value_cast<CppComponentValue>(prototype)) {
if ((qmlMetaObject->className() == QLatin1String("ListElement")
|| qmlMetaObject->className() == QLatin1String("Connections")
) && (qmlMetaObject->moduleName() == QLatin1String("Qt")
@@ -211,7 +211,7 @@ void ScopeBuilder::setQmlScopeObject(Node *node)
Evaluate evaluator(_scopeChain);
const Value *targetValue = evaluator(scriptBinding->statement);
if (const ObjectValue *target = value_cast<const ObjectValue *>(targetValue)) {
if (const ObjectValue *target = value_cast<ObjectValue>(targetValue)) {
qmlScopeObjects.prepend(target);
} else {
qmlScopeObjects.clear();
@@ -259,7 +259,7 @@ const ObjectValue *ScopeBuilder::isPropertyChangesObject(const ContextPtr &conte
PrototypeIterator iter(object, context);
while (iter.hasNext()) {
const ObjectValue *prototype = iter.next();
if (const CppComponentValue *qmlMetaObject = dynamic_cast<const CppComponentValue *>(prototype)) {
if (const CppComponentValue *qmlMetaObject = value_cast<CppComponentValue>(prototype)) {
if (qmlMetaObject->className() == QLatin1String("PropertyChanges")
&& (qmlMetaObject->moduleName() == QLatin1String("Qt")
|| qmlMetaObject->moduleName() == QLatin1String("QtQuick")))