From 460c47f5c6042e4eaae456fc3afb3b648954c95a Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Mon, 1 Feb 2010 16:12:19 +0100 Subject: [PATCH] Introduced SemanticInfo::declaringMember(pos). --- src/plugins/qmljseditor/qmlcodecompletion.cpp | 14 +-- src/plugins/qmljseditor/qmljseditor.cpp | 98 +++++++++++-------- src/plugins/qmljseditor/qmljseditor.h | 4 + 3 files changed, 64 insertions(+), 52 deletions(-) diff --git a/src/plugins/qmljseditor/qmlcodecompletion.cpp b/src/plugins/qmljseditor/qmlcodecompletion.cpp index 3c3f912aa55..78b6249643d 100644 --- a/src/plugins/qmljseditor/qmlcodecompletion.cpp +++ b/src/plugins/qmljseditor/qmlcodecompletion.cpp @@ -637,19 +637,7 @@ int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) Interpreter::ObjectValue *scope = interp.globalObject(); if (isQmlFile) { - AST::UiObjectMember *declaringMember = 0; - - const int cursorPosition = editor->position(); - for (int i = semanticInfo.ranges.size() - 1; i != -1; --i) { - const Range &range = semanticInfo.ranges.at(i); - if (range.begin.isNull() || range.end.isNull()) { - continue; - } else if (cursorPosition >= range.begin.position() && cursorPosition <= range.end.position()) { - declaringMember = range.ast; - break; - } - } - + AST::UiObjectMember *declaringMember = semanticInfo.declaringMember(editor->position()); scope = Bind::scopeChainAt(qmlDocument, snapshot, &interp, declaringMember); } diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 593ca9eb895..c34b206899e 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -33,14 +33,14 @@ #include "qmljseditorplugin.h" #include "qmlmodelmanager.h" -#include "qmlexpressionundercursor.h" - #include - +#include +#include +#include +#include #include #include #include -#include #include #include @@ -424,9 +424,63 @@ protected: } }; + +class CollectASTNodes: protected AST::Visitor +{ +public: + QList qualifiedIds; + QList identifiers; + QList fieldMembers; + + void accept(AST::Node *node) + { + if (node) + node->accept(this); + } + +protected: + using AST::Visitor::visit; + + virtual bool visit(AST::UiQualifiedId *ast) + { + qualifiedIds.append(ast); + return false; + } + + virtual bool visit(AST::IdentifierExpression *ast) + { + identifiers.append(ast); + return false; + } + + virtual bool visit(AST::FieldMemberExpression *ast) + { + fieldMembers.append(ast); + return true; + } +}; + } // end of anonymous namespace +AST::UiObjectMember *SemanticInfo::declaringMember(int cursorPosition) const +{ + AST::UiObjectMember *declaringMember = 0; + + for (int i = ranges.size() - 1; i != -1; --i) { + const Range &range = ranges.at(i); + + if (range.begin.isNull() || range.end.isNull()) { + continue; + } else if (cursorPosition >= range.begin.position() && cursorPosition <= range.end.position()) { + declaringMember = range.ast; + break; + } + } + + return declaringMember; +} + int SemanticInfo::revision() const { if (document) @@ -538,6 +592,7 @@ void QmlJSTextEditor::onDocumentUpdated(QmlJS::Document::Ptr doc) // create the ranges and update the semantic info. CreateRanges createRanges; SemanticInfo sem; + sem.snapshot = m_modelManager->snapshot(); sem.document = doc; sem.ranges = createRanges(document(), doc); @@ -780,41 +835,6 @@ void QmlJSTextEditor::createToolBar(QmlJSEditorEditable *editable) TextEditor::BaseTextEditor::Link QmlJSTextEditor::findLinkAt(const QTextCursor &cursor, bool /*resolveTarget*/) { Link link; - - if (!m_modelManager) - return link; - - const Snapshot snapshot = m_modelManager->snapshot(); - Document::Ptr doc = snapshot.document(file()->fileName()); - if (!doc) - return link; - - QTextCursor expressionCursor(cursor); - { - // correct the position by moving to the end of an identifier (if we're hovering over one): - int pos = cursor.position(); - forever { - const QChar ch = characterAt(pos); - - if (ch.isLetterOrNumber() || ch == QLatin1Char('_')) - ++pos; - else - break; - } - expressionCursor.setPosition(pos); - } - - QmlExpressionUnderCursor expressionUnderCursor; - if (expressionUnderCursor(expressionCursor)) { - link.pos = expressionUnderCursor.expressionOffset(); - link.length = expressionUnderCursor.expressionLength(); -// link.fileName = target->fileName(); -// link.line = target->line(); -// link.column = target->column(); -// if (link.column > 0) -// --link.column; - } - return link; } diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 4d5aeef54e4..139644e75bc 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -105,8 +105,12 @@ public: int revision() const; + // Returns the declaring member + QmlJS::AST::UiObjectMember *declaringMember(int cursorPosition) const; + public: // attributes QmlJS::Document::Ptr document; + QmlJS::Snapshot snapshot; QList ranges; QHash > idLocations; QList declarations;