diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-05-11 11:26:27 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-05-11 11:27:10 +0200 |
commit | 17fd33bdabe4b7c72b1f268767968dd945089335 (patch) | |
tree | 708e04d2717ce4cf51a20f71030f83a6788f05f2 | |
parent | 37fde0c9d4791a2b39da03d66bad3f6dba1a185d (diff) |
Store the declaration (if any) associated with the LookupItem.
-rw-r--r-- | src/libs/cplusplus/LookupItem.cpp | 16 | ||||
-rw-r--r-- | src/libs/cplusplus/LookupItem.h | 18 | ||||
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.cpp | 24 | ||||
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.h | 4 |
4 files changed, 41 insertions, 21 deletions
diff --git a/src/libs/cplusplus/LookupItem.cpp b/src/libs/cplusplus/LookupItem.cpp index c5e43674ef..a4ddfa77b7 100644 --- a/src/libs/cplusplus/LookupItem.cpp +++ b/src/libs/cplusplus/LookupItem.cpp @@ -44,11 +44,11 @@ uint CPlusPlus::qHash(const CPlusPlus::LookupItem &key) } LookupItem::LookupItem() - : _lastVisibleSymbol(0) + : _lastVisibleSymbol(0), _declaration(0) { } -LookupItem::LookupItem(const FullySpecifiedType &type, Symbol *lastVisibleSymbol) - : _type(type), _lastVisibleSymbol(lastVisibleSymbol) +LookupItem::LookupItem(const FullySpecifiedType &type, Symbol *lastVisibleSymbol, Symbol *declaration) + : _type(type), _lastVisibleSymbol(lastVisibleSymbol), _declaration(declaration) { } FullySpecifiedType LookupItem::type() const @@ -57,6 +57,12 @@ FullySpecifiedType LookupItem::type() const void LookupItem::setType(const FullySpecifiedType &type) { _type = type; } +Symbol *LookupItem::declaration() const +{ return _declaration; } + +void LookupItem::setDeclaration(Symbol *declaration) +{ _declaration = declaration; } + Symbol *LookupItem::lastVisibleSymbol() const { return _lastVisibleSymbol; } @@ -65,8 +71,8 @@ void LookupItem::setLastVisibleSymbol(Symbol *symbol) bool LookupItem::operator == (const LookupItem &other) const { - if (_type == other._type) - return _lastVisibleSymbol == other._lastVisibleSymbol; + if (_type == other._type && _declaration == other._declaration && _lastVisibleSymbol == other._lastVisibleSymbol) + return true; return false; } diff --git a/src/libs/cplusplus/LookupItem.h b/src/libs/cplusplus/LookupItem.h index fab6c61a9c..6254fbf82b 100644 --- a/src/libs/cplusplus/LookupItem.h +++ b/src/libs/cplusplus/LookupItem.h @@ -38,21 +38,37 @@ namespace CPlusPlus { class CPLUSPLUS_EXPORT LookupItem { public: + /// Constructs an null LookupItem. LookupItem(); - LookupItem(const FullySpecifiedType &type, Symbol *lastVisibleSymbol); + /// Contructs a LookupItem with the given \a type, \a lastVisibleSymbol and \a declaration. + LookupItem(const FullySpecifiedType &type, Symbol *lastVisibleSymbol, Symbol *declaration = 0); + + /// Returns this item's type. FullySpecifiedType type() const; + + /// Sets this item's type. void setType(const FullySpecifiedType &type); + /// Returns the last visible symbol. Symbol *lastVisibleSymbol() const; + + /// Sets the last visible symbol. void setLastVisibleSymbol(Symbol *symbol); + /// Returns this item's declaration. + Symbol *declaration() const; + + /// Sets this item's declaration. + void setDeclaration(Symbol *declaration); + bool operator == (const LookupItem &other) const; bool operator != (const LookupItem &other) const; private: FullySpecifiedType _type; Symbol *_lastVisibleSymbol; + Symbol *_declaration; }; uint qHash(const CPlusPlus::LookupItem &result); diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 753c69c889..0a19c5fc74 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -107,10 +107,12 @@ ResolveExpression::switchResults(const QList<LookupItem> &results) return previousResults; } -void ResolveExpression::addResults(const QList<LookupItem> &results) +void ResolveExpression::addResults(const QList<Symbol *> &symbols) { - foreach (const LookupItem r, results) - addResult(r); + foreach (Symbol *s, symbols) { + LookupItem item(s->type(), s, s); + _results.append(item); + } } void ResolveExpression::addResult(const FullySpecifiedType &ty, Symbol *symbol) @@ -402,9 +404,7 @@ bool ResolveExpression::visit(QualifiedNameAST *ast) { if (const Name *name = ast->name) { const QList<Symbol *> candidates = _context.lookup(name, _scope); - - foreach (Symbol *candidate, candidates) - addResult(candidate->type(), candidate); + addResults(candidates); } return false; @@ -412,19 +412,15 @@ bool ResolveExpression::visit(QualifiedNameAST *ast) bool ResolveExpression::visit(SimpleNameAST *ast) { - QList<Symbol *> symbols = _context.lookup(ast->name, _scope); - foreach (Symbol *symbol, symbols) - addResult(symbol->type(), symbol); - + const QList<Symbol *> candidates = _context.lookup(ast->name, _scope); + addResults(candidates); return false; } bool ResolveExpression::visit(TemplateIdAST *ast) { - const QList<Symbol *> symbols = _context.lookup(ast->name, _scope); - foreach (Symbol *symbol, symbols) - addResult(symbol->type(), symbol); - + const QList<Symbol *> candidates = _context.lookup(ast->name, _scope); + addResults(candidates); return false; } diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h index d1fbc84e2f..faf31efcb6 100644 --- a/src/libs/cplusplus/ResolveExpression.h +++ b/src/libs/cplusplus/ResolveExpression.h @@ -67,9 +67,11 @@ protected: FullySpecifiedType instantiate(const Name *className, Symbol *candidate) const; void thisObject(); + void addResult(const FullySpecifiedType &ty, Symbol *symbol = 0); void addResult(const LookupItem &result); - void addResults(const QList<LookupItem> &results); + + void addResults(const QList<Symbol *> &symbols); bool maybeValidPrototype(Function *funTy, unsigned actualArgumentCount) const; |