Recursive definition of CPlusPlus::QualifiedNameId.

Done-with: Erik Verbruggen
This commit is contained in:
Roberto Raggi
2010-07-12 13:41:54 +02:00
parent 94264617bf
commit adfdb51660
17 changed files with 166 additions and 237 deletions

View File

@@ -63,48 +63,29 @@ void QualifiedNameId::accept0(NameVisitor *visitor) const
const Identifier *QualifiedNameId::identifier() const
{
if (const Name *u = unqualifiedNameId())
if (const Name *u = name())
return u->identifier();
return 0;
}
unsigned QualifiedNameId::nameCount() const
{ return _names.size(); }
const Name *QualifiedNameId::base() const
{ return _base; }
const Name *QualifiedNameId::nameAt(unsigned index) const
{ return _names[index]; }
bool QualifiedNameId::isGlobal() const
{ return _isGlobal; }
const Name *QualifiedNameId::unqualifiedNameId() const
{
if (_names.empty())
return 0;
return _names.back();
}
const Name *QualifiedNameId::name() const
{ return _name; }
bool QualifiedNameId::isEqualTo(const Name *other) const
{
const QualifiedNameId *q = other->asQualifiedNameId();
if (! q)
return false;
else if (isGlobal() != q->isGlobal())
return false;
else {
const unsigned count = nameCount();
if (count != q->nameCount())
return false;
for (unsigned i = 0; i < count; ++i) {
const Name *l = nameAt(i);
const Name *r = q->nameAt(i);
if (! l->isEqualTo(r))
return false;
if (const QualifiedNameId *q = other->asQualifiedNameId()) {
if (_base == q->_base || (_base && _base->isEqualTo(q->_base))) {
if (_name == q->_name || (_name && _name->isEqualTo(q->_name))) {
return true;
}
}
}
return true;
return false;
}
NameId::NameId(const Identifier *identifier)