void CppClass::lookupBases(Symbol *declaration, const LookupContext &context) { using Data = QPair<ClassOrNamespace*, CppClass*>; if (ClassOrNamespace *clazz = context.lookupType(declaration)) { QSet<ClassOrNamespace *> visited; QQueue<Data> q; q.enqueue(qMakePair(clazz, this)); while (!q.isEmpty()) { Data current = q.dequeue(); clazz = current.first; visited.insert(clazz); const QList<ClassOrNamespace *> &bases = clazz->usings(); foreach (ClassOrNamespace *baseClass, bases) { const QList<Symbol *> &symbols = baseClass->symbols(); foreach (Symbol *symbol, symbols) { if (symbol->isClass() && ( clazz = context.lookupType(symbol)) && !visited.contains(clazz)) { CppClass baseCppClass(symbol); CppClass *cppClass = current.second; cppClass->bases.append(baseCppClass); q.enqueue(qMakePair(clazz, &cppClass->bases.last())); } } } } }
bool isOwnershipRAIIType(Symbol *symbol, const LookupContext &context) { if (!symbol) return false; // This is not a "real" comparison of types. What we do is to resolve the symbol // in question and then try to match its name with already known ones. if (symbol->isDeclaration()) { Declaration *declaration = symbol->asDeclaration(); const NamedType *namedType = declaration->type()->asNamedType(); if (namedType) { LookupScope *clazz = context.lookupType(namedType->name(), declaration->enclosingScope()); if (clazz && !clazz->symbols().isEmpty()) { Overview overview; Symbol *symbol = clazz->symbols().at(0); return isOwnershipRAIIName(overview.prettyName(symbol->name())); } } } return false; }