Split LookupContext::lookup() in lookup() and find().

lookup() searches for symbols in the given binding and the enclosing scopes,
while find() searches for symbols only in the given binding.
This commit is contained in:
Roberto Raggi
2010-05-11 10:20:51 +02:00
parent 7446f5cae2
commit 37fde0c9d4
3 changed files with 20 additions and 7 deletions

View File

@@ -304,7 +304,17 @@ ClassOrNamespace *ClassOrNamespace::globalNamespace() const
return e; return e;
} }
QList<Symbol *> ClassOrNamespace::find(const Name *name)
{
return lookup_helper(name, false);
}
QList<Symbol *> ClassOrNamespace::lookup(const Name *name) QList<Symbol *> ClassOrNamespace::lookup(const Name *name)
{
return lookup_helper(name, true);
}
QList<Symbol *> ClassOrNamespace::lookup_helper(const Name *name, bool searchInEnclosingScope)
{ {
QList<Symbol *> result; QList<Symbol *> result;
if (! name) if (! name)
@@ -317,7 +327,7 @@ QList<Symbol *> ClassOrNamespace::lookup(const Name *name)
binding = globalNamespace(); binding = globalNamespace();
if (q->nameCount() == 1) if (q->nameCount() == 1)
return binding->lookup(q->unqualifiedNameId()); return binding->find(q->unqualifiedNameId());
binding = binding->lookupClassOrNamespace(q->nameAt(0)); binding = binding->lookupClassOrNamespace(q->nameAt(0));
@@ -325,7 +335,7 @@ QList<Symbol *> ClassOrNamespace::lookup(const Name *name)
binding = binding->findClassOrNamespace(q->nameAt(index)); binding = binding->findClassOrNamespace(q->nameAt(index));
if (binding) if (binding)
result = binding->lookup(q->unqualifiedNameId()); result = binding->find(q->unqualifiedNameId());
return result; return result;
} }
@@ -335,7 +345,7 @@ QList<Symbol *> ClassOrNamespace::lookup(const Name *name)
do { do {
lookup_helper(name, binding, &result, &processed, /*templateId = */ 0); lookup_helper(name, binding, &result, &processed, /*templateId = */ 0);
binding = binding->_parent; binding = binding->_parent;
} while (binding); } while (searchInEnclosingScope && binding);
return result; return result;
} }

View File

@@ -56,6 +56,7 @@ public:
ClassOrNamespace *globalNamespace() const; ClassOrNamespace *globalNamespace() const;
QList<Symbol *> lookup(const Name *name); QList<Symbol *> lookup(const Name *name);
QList<Symbol *> find(const Name *name);
ClassOrNamespace *lookupClassOrNamespace(const Name *name); ClassOrNamespace *lookupClassOrNamespace(const Name *name);
ClassOrNamespace *findClassOrNamespace(const Name *name); ClassOrNamespace *findClassOrNamespace(const Name *name);
@@ -68,6 +69,8 @@ private:
/// \internal /// \internal
ClassOrNamespace *findOrCreate(const Name *name); ClassOrNamespace *findOrCreate(const Name *name);
QList<Symbol *> lookup_helper(const Name *name, bool searchInEnclosingScope);
void addTodo(Symbol *symbol); void addTodo(Symbol *symbol);
void addSymbol(Symbol *symbol); void addSymbol(Symbol *symbol);
void addEnum(Enum *e); void addEnum(Enum *e);

View File

@@ -490,7 +490,7 @@ bool ResolveExpression::visit(CallAST *ast)
if (NamedType *namedTy = ty->asNamedType()) { if (NamedType *namedTy = ty->asNamedType()) {
if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), lastVisibleSymbol)) { if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), lastVisibleSymbol)) {
foreach (Symbol *overload, b->lookup(functionCallOp)) { foreach (Symbol *overload, b->find(functionCallOp)) {
if (Function *funTy = overload->type()->asFunctionType()) { if (Function *funTy = overload->type()->asFunctionType()) {
if (maybeValidPrototype(funTy, actualArgumentCount)) { if (maybeValidPrototype(funTy, actualArgumentCount)) {
Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType(); Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType();
@@ -535,7 +535,7 @@ bool ResolveExpression::visit(ArrayAccessAST *ast)
} else if (NamedType *namedTy = ty->asNamedType()) { } else if (NamedType *namedTy = ty->asNamedType()) {
if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), lastVisibleSymbol)) { if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), lastVisibleSymbol)) {
foreach (Symbol *overload, b->lookup(arrayAccessOp)) { foreach (Symbol *overload, b->find(arrayAccessOp)) {
if (Function *funTy = overload->type()->asFunctionType()) { if (Function *funTy = overload->type()->asFunctionType()) {
Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType(); Function *proto = instantiate(namedTy->name(), funTy)->asFunctionType();
// ### TODO: check the actual arguments // ### TODO: check the actual arguments
@@ -610,7 +610,7 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i
} }
if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), result.lastVisibleSymbol())) { if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), result.lastVisibleSymbol())) {
foreach (Symbol *overload, b->lookup(arrowAccessOp)) { foreach (Symbol *overload, b->find(arrowAccessOp)) {
if (Function *funTy = overload->type()->asFunctionType()) { if (Function *funTy = overload->type()->asFunctionType()) {
FullySpecifiedType f = instantiate(namedTy->name(), funTy); FullySpecifiedType f = instantiate(namedTy->name(), funTy);
FullySpecifiedType retTy = f->asFunctionType()->returnType().simplified(); FullySpecifiedType retTy = f->asFunctionType()->returnType().simplified();
@@ -687,7 +687,7 @@ ResolveExpression::resolveMemberExpression(const QList<LookupItem> &baseResults,
else if (NamedType *namedTy = ty->asNamedType()) { else if (NamedType *namedTy = ty->asNamedType()) {
if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), r.lastVisibleSymbol())) { if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), r.lastVisibleSymbol())) {
foreach (Symbol *c, b->lookup(memberName)) foreach (Symbol *c, b->find(memberName))
results.append(LookupItem(instantiate(namedTy->name(), c), c)); results.append(LookupItem(instantiate(namedTy->name(), c), c));
} }
} }