QmlJS: Provide good completion for PropertyChanges with a target again.

Task-number: QTCREATORBUG-1413
Reviewed-by: Erik Verbruggen
This commit is contained in:
Christian Kamm
2010-05-19 11:15:57 +02:00
parent 735f908382
commit 088bdb29db
3 changed files with 26 additions and 8 deletions

View File

@@ -106,14 +106,7 @@ void ScopeBuilder::setQmlScopeObject(Node *node)
// check if the object has a Qt.PropertyChanges ancestor // check if the object has a Qt.PropertyChanges ancestor
prototype = scopeObject->prototype(_context); prototype = scopeObject->prototype(_context);
while (prototype) { prototype = isPropertyChangesObject(_context, prototype);
if (const QmlObjectValue *qmlMetaObject = dynamic_cast<const QmlObjectValue *>(prototype)) {
if (qmlMetaObject->className() == QLatin1String("PropertyChanges")
&& qmlMetaObject->packageName() == QLatin1String("Qt"))
break;
}
prototype = prototype->prototype(_context);
}
// find the target script binding // find the target script binding
if (prototype) { if (prototype) {
UiObjectInitializer *initializer = 0; UiObjectInitializer *initializer = 0;
@@ -169,3 +162,19 @@ const Value *ScopeBuilder::scopeObjectLookup(AST::UiQualifiedId *id)
return result; return result;
} }
const ObjectValue *ScopeBuilder::isPropertyChangesObject(Context *context,
const ObjectValue *object)
{
const ObjectValue *prototype = object;
while (prototype) {
if (const QmlObjectValue *qmlMetaObject = dynamic_cast<const QmlObjectValue *>(prototype)) {
if (qmlMetaObject->className() == QLatin1String("PropertyChanges")
&& qmlMetaObject->packageName() == QLatin1String("Qt"))
return prototype;
}
prototype = prototype->prototype(context);
}
return 0;
}

View File

@@ -14,6 +14,7 @@ namespace AST {
namespace Interpreter { namespace Interpreter {
class Context; class Context;
class Value; class Value;
class ObjectValue;
} }
class QMLJS_EXPORT ScopeBuilder class QMLJS_EXPORT ScopeBuilder
@@ -26,6 +27,8 @@ public:
void push(const QList<AST::Node *> &nodes); void push(const QList<AST::Node *> &nodes);
void pop(); void pop();
static const Interpreter::ObjectValue *isPropertyChangesObject(Interpreter::Context *context, const Interpreter::ObjectValue *object);
private: private:
void setQmlScopeObject(AST::Node *node); void setQmlScopeObject(AST::Node *node);
const Interpreter::Value *scopeObjectLookup(AST::UiQualifiedId *id); const Interpreter::Value *scopeObjectLookup(AST::UiQualifiedId *id);

View File

@@ -38,6 +38,7 @@
#include <qmljs/qmljsscanner.h> #include <qmljs/qmljsscanner.h>
#include <qmljs/qmljsevaluate.h> #include <qmljs/qmljsevaluate.h>
#include <qmljs/qmljscompletioncontextfinder.h> #include <qmljs/qmljscompletioncontextfinder.h>
#include <qmljs/qmljsscopebuilder.h>
#include <texteditor/basetexteditor.h> #include <texteditor/basetexteditor.h>
@@ -687,6 +688,11 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
addCompletions(enumerateProperties(qmlScopeType), symbolIcon); addCompletions(enumerateProperties(qmlScopeType), symbolIcon);
addCompletions(enumerateProperties(context.scopeChain().qmlTypes), symbolIcon); addCompletions(enumerateProperties(context.scopeChain().qmlTypes), symbolIcon);
if (ScopeBuilder::isPropertyChangesObject(&context, qmlScopeType)
&& context.scopeChain().qmlScopeObjects.size() == 2) {
addCompletions(enumerateProperties(context.scopeChain().qmlScopeObjects.first()), symbolIcon);
}
} }
if (contextFinder.isInRhsOfBinding() && qmlScopeType) { if (contextFinder.isInRhsOfBinding() && qmlScopeType) {