int OverviewModel::rowCount(const QModelIndex &parent) const { if (hasDocument()) { if (!parent.isValid()) { return globalSymbolCount()+1; // account for no symbol item } else { if (!parent.parent().isValid() && parent.row() == 0) // account for no symbol item return 0; Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer()); Q_ASSERT(parentSymbol); if (ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol()) { if (!scopedSymbol->isFunction()) { Scope *parentScope = scopedSymbol->members(); Q_ASSERT(parentScope); return parentScope->symbolCount(); } } return 0; } } if (!parent.isValid()) return 1; // account for no symbol item return 0; }
QModelIndex OverviewModel::index(int row, int column, const QModelIndex &parent) const { if (!parent.isValid()) { if (row == 0) // account for no symbol item return createIndex(row, column); Symbol *symbol = globalSymbolAt(row-1); // account for no symbol item return createIndex(row, column, symbol); } else { Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer()); Q_ASSERT(parentSymbol); ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol(); Q_ASSERT(scopedSymbol); Scope *scope = scopedSymbol->members(); Q_ASSERT(scope); return createIndex(row, 0, scope->symbolAt(row)); } }
Symbol *Document::findSymbolAt(unsigned line, unsigned column, Scope *scope) const { Symbol *previousSymbol = 0; for (unsigned i = 0; i < scope->symbolCount(); ++i) { Symbol *symbol = scope->symbolAt(i); if (symbol->line() > line) break; previousSymbol = symbol; } if (previousSymbol) { if (ScopedSymbol *scoped = previousSymbol->asScopedSymbol()) { if (Symbol *member = findSymbolAt(line, column, scoped->members())) return member; } } return previousSymbol; }