From 669b9c455210d86ff1499b6d92b5488d374af048 Mon Sep 17 00:00:00 2001 From: Christian Kamm <christian.d.kamm@nokia.com> Date: Wed, 17 Feb 2010 08:44:17 +0100 Subject: [PATCH] Add signals defined in Qml and their generated slots to the code model. --- src/libs/qmljs/qmljsinterpreter.cpp | 36 ++++++++++++++++++++++++++++- src/libs/qmljs/qmljsinterpreter.h | 18 +++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 9948dc67ca9..010e9c78f9c 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 8e394c7339d..0df1d9cdb22 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, -- GitLab