Commit 2a8b5a2e authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Refactored the lookup of name and template name ids.

parent 09b98c02
...@@ -42,35 +42,6 @@ ...@@ -42,35 +42,6 @@
using namespace CPlusPlus; using namespace CPlusPlus;
bool LookupContext::isNameCompatibleWithIdentifier(Name *name, Identifier *id)
{
if (! name) {
return false;
} else if (NameId *nameId = name->asNameId()) {
Identifier *identifier = nameId->identifier();
return identifier->isEqualTo(id);
} else if (DestructorNameId *nameId = name->asDestructorNameId()) {
Identifier *identifier = nameId->identifier();
return identifier->isEqualTo(id);
} else if (TemplateNameId *templNameId = name->asTemplateNameId()) {
Identifier *identifier = templNameId->identifier();
return identifier->isEqualTo(id);
}
return false;
}
#ifndef CPLUSPLUS_WITH_NO_DEBUG
static void printScopes(const QList<Scope *> &scopes)
{
qDebug() << "===========";
foreach (Scope *scope, scopes) {
qDebug() << "scope:" << scope << scope->owner()->name() << scope->owner()->fileName()
<< scope->owner()->line() << scope->owner()->column();
}
}
#endif
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
// LookupContext // LookupContext
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
...@@ -205,20 +176,30 @@ QList<Symbol *> LookupContext::resolve(Name *name, const QList<Scope *> &visible ...@@ -205,20 +176,30 @@ QList<Symbol *> LookupContext::resolve(Name *name, const QList<Scope *> &visible
else if (OperatorNameId *opId = name->asOperatorNameId()) else if (OperatorNameId *opId = name->asOperatorNameId())
return resolveOperatorNameId(opId, visibleScopes, mode); return resolveOperatorNameId(opId, visibleScopes, mode);
else if (Identifier *id = identifier(name)) { else if (Identifier *id = name->identifier()) {
for (int scopeIndex = 0; scopeIndex < visibleScopes.size(); ++scopeIndex) { for (int scopeIndex = 0; scopeIndex < visibleScopes.size(); ++scopeIndex) {
Scope *scope = visibleScopes.at(scopeIndex); Scope *scope = visibleScopes.at(scopeIndex);
for (Symbol *symbol = scope->lookat(id); symbol; symbol = symbol->next()) { for (Symbol *symbol = scope->lookat(id); symbol; symbol = symbol->next()) {
if (! symbol->name()) { if (! symbol->name())
continue; continue; // nothing to do, the symbol is anonymous.
} else if (! maybeValidSymbol(symbol, mode, candidates)) {
continue; else if (! maybeValidSymbol(symbol, mode, candidates))
} else if (QualifiedNameId *q = symbol->name()->asQualifiedNameId()) { continue; // skip it, we're not looking for this kind of symbols
if (! q->unqualifiedNameId()->isEqualTo(name))
else if (Identifier *symbolId = symbol->identifier()) {
if (! symbolId->isEqualTo(id))
continue; // skip it, the symbol's id is not compatible with this lookup.
}
if (QualifiedNameId *q = symbol->name()->asQualifiedNameId()) {
if (name->isDestructorNameId() != q->unqualifiedNameId()->isDestructorNameId())
continue; continue;
if (q->nameCount() > 1) { else if (q->nameCount() > 1) {
Name *classOrNamespaceName = control()->qualifiedNameId(q->names(), Name *classOrNamespaceName = control()->qualifiedNameId(q->names(),
q->nameCount() - 1); q->nameCount() - 1);
...@@ -242,13 +223,13 @@ QList<Symbol *> LookupContext::resolve(Name *name, const QList<Scope *> &visible ...@@ -242,13 +223,13 @@ QList<Symbol *> LookupContext::resolve(Name *name, const QList<Scope *> &visible
if (! good) if (! good)
continue; continue;
} }
} else if (! isNameCompatibleWithIdentifier(symbol->name(), id)) {
continue;
} else if (symbol->name()->isDestructorNameId() != name->isDestructorNameId()) { } else if (symbol->name()->isDestructorNameId() != name->isDestructorNameId()) {
// ### FIXME: this is wrong!
continue; continue;
} }
candidates.append(symbol); if (! candidates.contains(symbol))
candidates.append(symbol);
} }
} }
} }
......
...@@ -133,8 +133,6 @@ private: ...@@ -133,8 +133,6 @@ private:
void buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *> *scopes, void buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *> *scopes,
QSet<QString> *processed); QSet<QString> *processed);
static bool isNameCompatibleWithIdentifier(Name *name, Identifier *id);
static bool maybeValidSymbol(Symbol *symbol, static bool maybeValidSymbol(Symbol *symbol,
ResolveMode mode, ResolveMode mode,
const QList<Symbol *> &candidates); const QList<Symbol *> &candidates);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment