diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 9948dc67ca9560b1395c06365104dff1046d0402..010e9c78f9cad09a2fffddde554beaa1a1dd3597 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -2000,9 +2000,12 @@ ASTObjectValue::ASTObjectValue(UiQualifiedId *typeName, for (UiObjectMemberList *it = _initializer->members; it; it = it->next) { UiObjectMember *member = it->member; if (UiPublicMember *def = cast<UiPublicMember *>(member)) { - if (def->name && def->memberType) { + if (def->type == UiPublicMember::Property && def->name && def->memberType) { ASTPropertyReference *ref = new ASTPropertyReference(def, _doc, engine); _properties.append(ref); + } else if (def->type == UiPublicMember::Signal && def->name) { + ASTSignalReference *ref = new ASTSignalReference(def, _doc, engine); + _signals.append(ref); } } } @@ -2025,6 +2028,11 @@ void ASTObjectValue::processMembers(MemberProcessor *processor) const { foreach (ASTPropertyReference *ref, _properties) processor->processProperty(ref->ast()->name->asString(), ref); + foreach (ASTSignalReference *ref, _signals) { + // ### These two should get different values? + processor->processSignal(ref->ast()->name->asString(), ref); + processor->processGeneratedSlot(ref->slotName(), ref); + } ObjectValue::processMembers(processor); } @@ -2143,3 +2151,29 @@ const Value *ASTPropertyReference::value(Context *context) const return engine()->undefinedValue(); } + +ASTSignalReference::ASTSignalReference(UiPublicMember *ast, const QmlJS::Document *doc, Engine *engine) + : Reference(engine), _ast(ast), _doc(doc) +{ + const QString signalName = ast->name->asString(); + _slotName = QLatin1String("on"); + _slotName += signalName.at(0).toUpper(); + _slotName += signalName.midRef(1); +} + +ASTSignalReference::~ASTSignalReference() +{ +} + +bool ASTSignalReference::getSourceLocation(QString *fileName, int *line, int *column) const +{ + *fileName = _doc->fileName(); + *line = _ast->identifierToken.startLine; + *column = _ast->identifierToken.startColumn; + return true; +} + +const Value *ASTSignalReference::value(Context *context) const +{ + return engine()->undefinedValue(); +} diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 8e394c7339dfc0b36d60111901ab9fc84056433c..0df1d9cdb229adfc0426f96e76e9858528e75f2d 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -696,12 +696,30 @@ public: virtual const Value *value(Context *context) const; }; +class QMLJS_EXPORT ASTSignalReference: public Reference +{ + AST::UiPublicMember *_ast; + const Document *_doc; + QString _slotName; + +public: + ASTSignalReference(AST::UiPublicMember *ast, const Document *doc, Engine *engine); + virtual ~ASTSignalReference(); + + AST::UiPublicMember *ast() const { return _ast; } + QString slotName() const { return _slotName; } + + virtual bool getSourceLocation(QString *fileName, int *line, int *column) const; + virtual const Value *value(Context *context) const; +}; + class QMLJS_EXPORT ASTObjectValue: public ObjectValue { AST::UiQualifiedId *_typeName; AST::UiObjectInitializer *_initializer; const Document *_doc; QList<ASTPropertyReference *> _properties; + QList<ASTSignalReference *> _signals; public: ASTObjectValue(AST::UiQualifiedId *typeName,