Skip to content
Snippets Groups Projects
Commit 19526744 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Highlight the uses of an id.

parent 55ed11ee
No related branches found
No related tags found
No related merge requests found
...@@ -39,8 +39,6 @@ ...@@ -39,8 +39,6 @@
#include "parser/javascriptastvisitor_p.h" #include "parser/javascriptastvisitor_p.h"
#include "parser/javascriptast_p.h" #include "parser/javascriptast_p.h"
#include <indenter.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
#include <texteditor/basetextdocument.h> #include <texteditor/basetextdocument.h>
...@@ -69,11 +67,12 @@ namespace Internal { ...@@ -69,11 +67,12 @@ namespace Internal {
class IdDeclarations: protected Visitor class IdDeclarations: protected Visitor
{ {
public: public:
typedef QMap<QString, QPair<AST::SourceLocation, AST::SourceLocation> > Result; typedef QMap<QString, QList<AST::SourceLocation> > Result;
Result operator()(AST::Node *node) Result operator()(AST::Node *node)
{ {
_ids.clear(); _ids.clear();
_maybeIds.clear();
accept(node); accept(node);
return _ids; return _ids;
} }
...@@ -107,17 +106,37 @@ protected: ...@@ -107,17 +106,37 @@ protected:
if (AST::ExpressionStatement *stmt = AST::cast<AST::ExpressionStatement*>(node->statement)) { if (AST::ExpressionStatement *stmt = AST::cast<AST::ExpressionStatement*>(node->statement)) {
if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(stmt->expression)) { if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(stmt->expression)) {
if (idExpr->name) { if (idExpr->name) {
_ids[idExpr->name->asString()] = qMakePair(idExpr->firstSourceLocation(), const QString id = idExpr->name->asString();
idExpr->lastSourceLocation()); QList<AST::SourceLocation> *locs = &_ids[id];
locs->append(idExpr->firstSourceLocation());
locs->append(_maybeIds.value(id));
_maybeIds.remove(id);
} }
} }
} }
} }
accept(node->statement);
return false;
}
virtual bool visit(AST::IdentifierExpression *node)
{
if (node->name) {
const QString name = node->name->asString();
if (_ids.contains(name))
_ids[name].append(node->identifierToken);
else
_maybeIds[name].append(node->identifierToken);
}
return false; return false;
} }
private: private:
Result _ids; Result _ids;
Result _maybeIds;
}; };
class FindDeclarations: protected Visitor class FindDeclarations: protected Visitor
...@@ -477,15 +496,16 @@ void ScriptEditor::updateMethodBoxIndex() ...@@ -477,15 +496,16 @@ void ScriptEditor::updateMethodBoxIndex()
tc.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); tc.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
const QString wordUnderCursor = tc.selectedText(); const QString wordUnderCursor = tc.selectedText();
const QPair<AST::SourceLocation, AST::SourceLocation> id = m_ids.value(wordUnderCursor);
QList<QTextEdit::ExtraSelection> selections; QList<QTextEdit::ExtraSelection> selections;
if (id.first.offset && id.second.offset) { foreach (const AST::SourceLocation &loc, m_ids.value(wordUnderCursor)) {
if (! loc.isValid())
continue;
QTextEdit::ExtraSelection sel; QTextEdit::ExtraSelection sel;
sel.format.setBackground(Qt::yellow); sel.format.setBackground(Qt::yellow);
sel.cursor = textCursor(); sel.cursor = textCursor();
sel.cursor.setPosition(id.first.begin()); sel.cursor.setPosition(loc.begin());
sel.cursor.setPosition(id.second.end(), QTextCursor::KeepAnchor); sel.cursor.setPosition(loc.end(), QTextCursor::KeepAnchor);
selections.append(sel); selections.append(sel);
} }
......
...@@ -120,7 +120,7 @@ private: ...@@ -120,7 +120,7 @@ private:
QComboBox *m_methodCombo; QComboBox *m_methodCombo;
QList<Declaration> m_declarations; QList<Declaration> m_declarations;
QStringList m_words; QStringList m_words;
QMap<QString, QPair<JavaScript::AST::SourceLocation, JavaScript::AST::SourceLocation> > m_ids; QMap<QString, QList<JavaScript::AST::SourceLocation> > m_ids; // ### use QMultiMap
}; };
} // namespace Internal } // namespace Internal
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment