From 78dbeb4f848ff23b85c7741b64c4dee6fbd90614 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Tue, 22 Sep 2009 16:32:49 +0200
Subject: [PATCH] Initial groundwork for the QML context lookups.

---
 src/plugins/duieditor/duieditor.pro           | 13 +++-
 .../duieditor/qmlexpressionundercursor.cpp    | 64 +++++++++++++++++++
 .../duieditor/qmlexpressionundercursor.h      | 46 +++++++++++++
 src/plugins/duieditor/qmllookupcontext.cpp    | 22 +++++++
 src/plugins/duieditor/qmllookupcontext.h      | 30 +++++++++
 .../duieditor/resolveqmlexpression.cpp        | 13 ++++
 src/plugins/duieditor/resolveqmlexpression.h  | 22 +++++++
 7 files changed, 207 insertions(+), 3 deletions(-)
 create mode 100644 src/plugins/duieditor/qmlexpressionundercursor.cpp
 create mode 100644 src/plugins/duieditor/qmlexpressionundercursor.h
 create mode 100644 src/plugins/duieditor/qmllookupcontext.cpp
 create mode 100644 src/plugins/duieditor/qmllookupcontext.h
 create mode 100644 src/plugins/duieditor/resolveqmlexpression.cpp
 create mode 100644 src/plugins/duieditor/resolveqmlexpression.h

diff --git a/src/plugins/duieditor/duieditor.pro b/src/plugins/duieditor/duieditor.pro
index da98f2d23f0..fc1ffaf4034 100644
--- a/src/plugins/duieditor/duieditor.pro
+++ b/src/plugins/duieditor/duieditor.pro
@@ -4,7 +4,8 @@ include(../../qtcreatorplugin.pri)
 include(duieditor_dependencies.pri)
 include(parser/parser.pri)
 include(rewriter/rewriter.pri)
-DEFINES += DUIEDITOR_LIBRARY QT_CREATOR
+DEFINES += DUIEDITOR_LIBRARY \
+    QT_CREATOR
 INCLUDEPATH += parser \
     rewriter
 HEADERS += duieditor.h \
@@ -22,7 +23,10 @@ HEADERS += duieditor.h \
     duimodelmanager.h \
     duicodeformatter.h \
     navigationtokenfinder.h \
-    idcollector.h
+    idcollector.h \
+    qmlexpressionundercursor.h \
+    qmllookupcontext.h \
+    resolveqmlexpression.h
 SOURCES += duieditor.cpp \
     duieditorfactory.cpp \
     duieditorplugin.cpp \
@@ -36,5 +40,8 @@ SOURCES += duieditor.cpp \
     duimodelmanager.cpp \
     duicodeformatter.cpp \
     navigationtokenfinder.cpp \
-    idcollector.cpp
+    idcollector.cpp \
+    qmlexpressionundercursor.cpp \
+    qmllookupcontext.cpp \
+    resolveqmlexpression.cpp
 RESOURCES += duieditor.qrc
diff --git a/src/plugins/duieditor/qmlexpressionundercursor.cpp b/src/plugins/duieditor/qmlexpressionundercursor.cpp
new file mode 100644
index 00000000000..7b0e0980c5e
--- /dev/null
+++ b/src/plugins/duieditor/qmlexpressionundercursor.cpp
@@ -0,0 +1,64 @@
+#include "qmljsast_p.h"
+#include "qmljsengine_p.h"
+
+#include "qmlexpressionundercursor.h"
+
+using namespace DuiEditor;
+using namespace DuiEditor::Internal;
+using namespace QmlJS;
+using namespace QmlJS::AST;
+
+QmlExpressionUnderCursor::QmlExpressionUnderCursor()
+{
+}
+
+void QmlExpressionUnderCursor::operator()(const QTextCursor &cursor)
+{
+    _pos = cursor.position();
+}
+
+bool QmlExpressionUnderCursor::visit(QmlJS::AST::Block *ast)
+{
+    _scopes.push(ast);
+
+    return true;
+}
+
+void QmlExpressionUnderCursor::endVisit(QmlJS::AST::Block *)
+{
+    _scopes.pop();
+}
+
+bool QmlExpressionUnderCursor::visit(QmlJS::AST::UiObjectBinding *ast)
+{
+    _scopes.push(ast);
+
+    return true;
+}
+
+void QmlExpressionUnderCursor::endVisit(QmlJS::AST::UiObjectBinding *)
+{
+    _scopes.pop();
+}
+
+bool QmlExpressionUnderCursor::visit(QmlJS::AST::UiObjectDefinition *ast)
+{
+    _scopes.push(ast);
+
+    return true;
+}
+
+void QmlExpressionUnderCursor::endVisit(QmlJS::AST::UiObjectDefinition *)
+{
+    _scopes.pop();
+}
+
+bool QmlExpressionUnderCursor::visit(QmlJS::AST::UiScriptBinding *ast)
+{
+    if (ast->firstSourceLocation().offset <= _pos && _pos <= ast->lastSourceLocation().end()) {
+        _expressionNode = ast;
+        _expressionScopes = _scopes;
+    }
+
+    return false;
+}
diff --git a/src/plugins/duieditor/qmlexpressionundercursor.h b/src/plugins/duieditor/qmlexpressionundercursor.h
new file mode 100644
index 00000000000..3280218f93b
--- /dev/null
+++ b/src/plugins/duieditor/qmlexpressionundercursor.h
@@ -0,0 +1,46 @@
+#ifndef QMLEXPRESSIONUNDERCURSOR_H
+#define QMLEXPRESSIONUNDERCURSOR_H
+
+#include <QStack>
+#include <QTextCursor>
+
+#include "qmljsastvisitor_p.h"
+
+namespace DuiEditor {
+namespace Internal {
+
+class QmlExpressionUnderCursor: protected QmlJS::AST::Visitor
+{
+public:
+    QmlExpressionUnderCursor();
+
+    void operator()(const QTextCursor &cursor);
+
+    QStack<QmlJS::AST::Node *> expressionScopes() const
+    { return _expressionScopes; }
+
+    QmlJS::AST::Node *expressionNode() const
+    { return _expressionNode; }
+
+protected:
+    virtual bool visit(QmlJS::AST::Block *ast);
+    virtual bool visit(QmlJS::AST::UiObjectBinding *ast);
+    virtual bool visit(QmlJS::AST::UiObjectDefinition *ast);
+    virtual bool visit(QmlJS::AST::UiScriptBinding *ast);
+
+    virtual void endVisit(QmlJS::AST::Block *);
+    virtual void endVisit(QmlJS::AST::UiObjectBinding *);
+    virtual void endVisit(QmlJS::AST::UiObjectDefinition *);
+
+private:
+    QStack<QmlJS::AST::Node *> _scopes;
+    QStack<QmlJS::AST::Node *> _expressionScopes;
+    QmlJS::AST::Node *_expressionNode;
+
+    quint32 _pos;
+};
+
+} // namespace Internal
+} // namespace DuiEditor
+
+#endif // QMLEXPRESSIONUNDERCURSOR_H
diff --git a/src/plugins/duieditor/qmllookupcontext.cpp b/src/plugins/duieditor/qmllookupcontext.cpp
new file mode 100644
index 00000000000..af9d1961437
--- /dev/null
+++ b/src/plugins/duieditor/qmllookupcontext.cpp
@@ -0,0 +1,22 @@
+#include "qmljsast_p.h"
+#include "qmljsengine_p.h"
+
+#include "qmlexpressionundercursor.h"
+#include "qmllookupcontext.h"
+#include "resolveqmlexpression.h"
+
+using namespace DuiEditor;
+using namespace DuiEditor::Internal;
+using namespace QmlJS;
+using namespace QmlJS::AST;
+
+QmlLookupContext::QmlLookupContext(const QStack<QmlJS::AST::Node *> &scopes,
+                                   QmlJS::AST::Node *expressionNode,
+                                   const DuiDocument::Ptr &doc,
+                                   const Snapshot &snapshot):
+        _scopes(scopes),
+        _expressionNode(expressionNode),
+        _doc(doc),
+        _snapshot(snapshot)
+{
+}
diff --git a/src/plugins/duieditor/qmllookupcontext.h b/src/plugins/duieditor/qmllookupcontext.h
new file mode 100644
index 00000000000..0ca732bb617
--- /dev/null
+++ b/src/plugins/duieditor/qmllookupcontext.h
@@ -0,0 +1,30 @@
+#ifndef QMLLOOKUPCONTEXT_H
+#define QMLLOOKUPCONTEXT_H
+
+#include <QStack>
+
+#include "duidocument.h"
+#include "qmljsastvisitor_p.h"
+
+namespace DuiEditor {
+namespace Internal {
+
+class QmlLookupContext
+{
+public:
+    QmlLookupContext(const QStack<QmlJS::AST::Node *> &scopes,
+                     QmlJS::AST::Node *expressionNode,
+                     const DuiDocument::Ptr &doc,
+                     const Snapshot &snapshot);
+
+private:
+    QStack<QmlJS::AST::Node *> _scopes;
+    QmlJS::AST::Node *_expressionNode;
+    DuiDocument::Ptr _doc;
+    Snapshot _snapshot;
+};
+
+} // namespace Internal
+} // namespace DuiEditor
+
+#endif // QMLLOOKUPCONTEXT_H
diff --git a/src/plugins/duieditor/resolveqmlexpression.cpp b/src/plugins/duieditor/resolveqmlexpression.cpp
new file mode 100644
index 00000000000..895ffbc55de
--- /dev/null
+++ b/src/plugins/duieditor/resolveqmlexpression.cpp
@@ -0,0 +1,13 @@
+#include "qmljsast_p.h"
+#include "qmljsengine_p.h"
+
+#include "resolveqmlexpression.h"
+
+using namespace DuiEditor;
+using namespace DuiEditor::Internal;
+using namespace QmlJS;
+using namespace QmlJS::AST;
+
+ResolveQmlExpression::ResolveQmlExpression()
+{
+}
diff --git a/src/plugins/duieditor/resolveqmlexpression.h b/src/plugins/duieditor/resolveqmlexpression.h
new file mode 100644
index 00000000000..61377f313f0
--- /dev/null
+++ b/src/plugins/duieditor/resolveqmlexpression.h
@@ -0,0 +1,22 @@
+#ifndef RESOLVEQMLEXPRESSION_H
+#define RESOLVEQMLEXPRESSION_H
+
+#include "qmljsastvisitor_p.h"
+
+namespace DuiEditor {
+namespace Internal {
+
+class ResolveQmlExpression: protected QmlJS::AST::Visitor
+{
+public:
+    ResolveQmlExpression();
+
+protected:
+
+private:
+};
+
+} // namespace Internal
+} // namespace DuiEditor
+
+#endif // RESOLVEQMLEXPRESSION_H
-- 
GitLab