summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/CppDocument.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-08-17 13:42:04 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-08-17 13:42:30 +0200
commite5ecb6b07208eab850d5d1a9a2b754655657204d (patch)
treecc56e116f385bdb0e8e20fa4375c45824b6c0baf /src/libs/cplusplus/CppDocument.cpp
parent5308a4a266a163b0e69729a550f844df67199890 (diff)
downloadqt-creator-e5ecb6b07208eab850d5d1a9a2b754655657204d.tar.gz
Nicer implementation of Document::lastVisibleSymbolAt().
Diffstat (limited to 'src/libs/cplusplus/CppDocument.cpp')
-rw-r--r--src/libs/cplusplus/CppDocument.cpp64
1 files changed, 41 insertions, 23 deletions
diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 1a9169f441..eb5a0b84d2 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -57,6 +57,45 @@ using namespace CPlusPlus;
namespace {
+class LastVisibleSymbolAt: protected SymbolVisitor
+{
+ Symbol *root;
+ unsigned line;
+ unsigned column;
+ Symbol *symbol;
+
+public:
+ LastVisibleSymbolAt(Symbol *root)
+ : root(root), line(0), column(0), symbol(0) {}
+
+ Symbol *operator()(unsigned line, unsigned column)
+ {
+ this->line = line;
+ this->column = column;
+ this->symbol = 0;
+ accept(root);
+ if (! symbol)
+ symbol = root;
+ return symbol;
+ }
+
+protected:
+ bool preVisit(Symbol *s)
+ {
+ if (s->asBlock()) {
+ if (s->line() < line || (s->line() == line && s->column() <= column)) {
+ return true;
+ }
+ // skip blocks
+ } if (s->line() < line || (s->line() == line && s->column() <= column)) {
+ symbol = s;
+ return true;
+ }
+
+ return false;
+ }
+};
+
class FindScopeAt: protected SymbolVisitor
{
TranslationUnit *_unit;
@@ -408,29 +447,8 @@ Scope *Document::scopeAt(unsigned line, unsigned column)
Symbol *Document::lastVisibleSymbolAt(unsigned line, unsigned column) const
{
- return lastVisibleSymbolAt(line, column, globalNamespace());
-}
-
-Symbol *Document::lastVisibleSymbolAt(unsigned line, unsigned column, Scope *scope) const
-{
- Symbol *previousSymbol = 0;
-
- for (unsigned i = 0; i < scope->memberCount(); ++i) {
- Symbol *symbol = scope->memberAt(i);
- if (symbol->line() > line)
- break;
-
- previousSymbol = symbol;
- }
-
- if (previousSymbol) {
- if (Scope *scope = previousSymbol->asScope()) {
- if (Symbol *member = lastVisibleSymbolAt(line, column, scope))
- return member;
- }
- }
-
- return previousSymbol;
+ LastVisibleSymbolAt lastVisibleSymbolAt(globalNamespace());
+ return lastVisibleSymbolAt(line, column);
}
const Macro *Document::findMacroDefinitionAt(unsigned line) const