aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-05-11 11:26:27 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-05-11 11:27:10 +0200
commit17fd33bdabe4b7c72b1f268767968dd945089335 (patch)
tree708e04d2717ce4cf51a20f71030f83a6788f05f2
parent37fde0c9d4791a2b39da03d66bad3f6dba1a185d (diff)
Store the declaration (if any) associated with the LookupItem.
-rw-r--r--src/libs/cplusplus/LookupItem.cpp16
-rw-r--r--src/libs/cplusplus/LookupItem.h18
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp24
-rw-r--r--src/libs/cplusplus/ResolveExpression.h4
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;