diff options
| author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-08-17 13:42:04 +0200 |
|---|---|---|
| committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-08-17 13:42:30 +0200 |
| commit | e5ecb6b07208eab850d5d1a9a2b754655657204d (patch) | |
| tree | cc56e116f385bdb0e8e20fa4375c45824b6c0baf /src/libs/cplusplus/CppDocument.cpp | |
| parent | 5308a4a266a163b0e69729a550f844df67199890 (diff) | |
| download | qt-creator-e5ecb6b07208eab850d5d1a9a2b754655657204d.tar.gz | |
Nicer implementation of Document::lastVisibleSymbolAt().
Diffstat (limited to 'src/libs/cplusplus/CppDocument.cpp')
| -rw-r--r-- | src/libs/cplusplus/CppDocument.cpp | 64 |
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 |
