diff --git a/src/plugins/duieditor/duieditor.pro b/src/plugins/duieditor/duieditor.pro index da98f2d23f0bd4c6430fc4e062bd5506dde2818f..fc1ffaf4034fb4870ec9dced4b7e51d0c38858a4 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 0000000000000000000000000000000000000000..7b0e0980c5e28244a721e6764d30d3bc8b290ade --- /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 0000000000000000000000000000000000000000..3280218f93be985fe1d46dfa46f0e36cb5774054 --- /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 0000000000000000000000000000000000000000..af9d1961437814a83e92741c7d1ae5c90227c71e --- /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 0000000000000000000000000000000000000000..0ca732bb6174448377488bc67383918e75f728b7 --- /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 0000000000000000000000000000000000000000..895ffbc55deb82272ca9cc1b04dfe68be6000db5 --- /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 0000000000000000000000000000000000000000..61377f313f09ab3ab1b585265c66cabe9c215105 --- /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