diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index ae70d5d39e0..f82c8366456 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -704,6 +704,11 @@ const ASTPropertyReference *Value::asAstPropertyReference() const return 0; } +const ASTSignal *Value::asAstSignal() const +{ + return 0; +} + //////////////////////////////////////////////////////////////////////////////// // Values //////////////////////////////////////////////////////////////////////////////// @@ -1982,6 +1987,11 @@ ASTSignal::~ASTSignal() { } +const ASTSignal *ASTSignal::asAstSignal() const +{ + return this; +} + int ASTSignal::argumentCount() const { int count = 0; diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 283006adf46..c550637ba15 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -80,6 +80,7 @@ class ASTObjectValue; class QmlEnumValue; class QmlPrototypeReference; class ASTPropertyReference; +class ASTSignal; typedef QList 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 const _RetTy *value_cast(const Value *v); +template 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; } diff --git a/src/libs/qmljs/qmljsscopebuilder.cpp b/src/libs/qmljs/qmljsscopebuilder.cpp index dda5496bc5d..6d4be19372d 100644 --- a/src/libs/qmljs/qmljsscopebuilder.cpp +++ b/src/libs/qmljs/qmljsscopebuilder.cpp @@ -84,11 +84,11 @@ void ScopeBuilder::push(AST::Node *node) break; } // signals defined in QML - if (const ASTSignal *astsig = dynamic_cast(value)) { + if (const ASTSignal *astsig = value_cast(value)) { _scopeChain->appendJsScope(astsig->bodyScope()); } // signals defined in C++ - else if (const CppComponentValue *qmlObject = dynamic_cast(owner)) { + else if (const CppComponentValue *qmlObject = value_cast(owner)) { if (const ObjectValue *scope = qmlObject->signalScope(name)) { _scopeChain->appendJsScope(scope); }