From e5ecb6b07208eab850d5d1a9a2b754655657204d Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 17 Aug 2010 13:42:04 +0200 Subject: [PATCH] Nicer implementation of Document::lastVisibleSymbolAt(). --- src/libs/cplusplus/CppDocument.cpp | 64 +++++++++++++++++++----------- src/libs/cplusplus/CppDocument.h | 3 -- 2 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 1a9169f4410..eb5a0b84d24 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 diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index b30efc2716c..0360eb65078 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -314,9 +314,6 @@ public: const MacroUse *findMacroUseAt(unsigned offset) const; const UndefinedMacroUse *findUndefinedMacroUseAt(unsigned offset) const; -private: - Symbol *lastVisibleSymbolAt(unsigned line, unsigned column, Scope *scope) const; - private: QString _fileName; Control *_control;