/*! Tries to resolve a member named \a name. If it is found \a mem is initialized with the result and the class defining this member is returned. In case of a failed search, 0 is returned and the content of \a mem is undefined. */ const QSClass *QSObject::resolveMember(const QString &name, QSMember *mem, const QSClass *owner, int *offset) const { Q_ASSERT(offset); Q_ASSERT(mem); Q_ASSERT(!name.isEmpty()); if (!owner) owner = objectType(); QPtrList<QSClass> enclosing; QSMember stackedMember; while (owner) { if (owner->member(*offset == 0 ? this : 0, name, mem)) { return owner; } else if (mem->type() == QSMember::Identifier && !stackedMember.isDefined()) { stackedMember = *mem; } if (owner->enclosingClass()) enclosing.append(owner->enclosingClass()); owner = owner->base(); } const QSClass *eClass = enclosing.first(); while (eClass) { const QSClass *enc = resolveMember(name, mem, eClass, &(++(*offset))); if (enc) { if (mem->type() == QSMember::Identifier) if (!stackedMember.isDefined()) stackedMember = *mem; else return enc; } else { --(*offset); } eClass = enclosing.next(); } if (stackedMember.isDefined()) { *mem = stackedMember; return stackedMember.owner(); } return 0; }
void QSResolveNode::check( QSCheckData *c ) { if ( !c->directLookupEnabled() ) return; QSClass * cl = c->currentScope(); QSClass *cont = cl; int uplvl = 0; int blocks = 0; QSMember member; while ( cont ) { QSMember mem; if ( cont->member( 0, ident, &mem ) ) { if ( mem.type()==QSMember::Variable && !mem.isStatic() ) { member = mem; break; } } uplvl++; cont = cont->enclosingClass(); } if( member.isDefined() ) { /* If the containing class has an undefined base, the indexes will be moved when the we call QSAbstractBaseClass::replace() and the lookup info will be crap. Therefore, we don't create it. */ QSClass *tmp = cont->base(); while (tmp) { if (tmp->name() == QString::fromLatin1("AbstractBase")) return; tmp = tmp->base(); } // Due to special handling of block scopes in the global object... if( cont==c->env()->globalClass() ) uplvl+=blocks; info = new QSLookupInfo( uplvl, member ); } }