2016-01-15 14:57:40 +01:00
|
|
|
/****************************************************************************
|
2010-07-16 11:18:30 +02:00
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** Copyright (C) 2016 Denis Mingulov
|
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2010-07-16 11:18:30 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator.
|
2010-07-16 11:18:30 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
2016-01-15 14:57:40 +01:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
2010-07-16 11:18:30 +02:00
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** GNU General Public License Usage
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
2010-12-17 16:01:08 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
****************************************************************************/
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
#include "classviewparsertreeitem.h"
|
|
|
|
|
#include "classviewsymbollocation.h"
|
|
|
|
|
#include "classviewsymbolinformation.h"
|
|
|
|
|
#include "classviewconstants.h"
|
|
|
|
|
#include "classviewutils.h"
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
#include <cplusplus/Icons.h>
|
|
|
|
|
#include <cplusplus/Name.h>
|
|
|
|
|
#include <cplusplus/Overview.h>
|
|
|
|
|
#include <cplusplus/Symbol.h>
|
|
|
|
|
#include <cplusplus/Symbols.h>
|
2021-02-16 15:48:08 +01:00
|
|
|
#include <projectexplorer/project.h>
|
|
|
|
|
#include <projectexplorer/projectexplorer.h>
|
|
|
|
|
#include <projectexplorer/projectnodes.h>
|
|
|
|
|
#include <projectexplorer/session.h>
|
2019-11-15 18:42:11 +01:00
|
|
|
#include <utils/algorithm.h>
|
|
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QHash>
|
|
|
|
|
#include <QPair>
|
|
|
|
|
#include <QIcon>
|
|
|
|
|
#include <QStandardItem>
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QDebug>
|
2010-07-16 11:18:30 +02:00
|
|
|
|
|
|
|
|
namespace ClassView {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
static CPlusPlus::Overview g_overview;
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
///////////////////////////////// ParserTreeItemPrivate //////////////////////////////////
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-05-24 17:35:14 +02:00
|
|
|
\class ParserTreeItemPrivate
|
|
|
|
|
\brief The ParserTreeItemPrivate class defines private class data for
|
|
|
|
|
the ParserTreeItem class.
|
2010-07-16 11:18:30 +02:00
|
|
|
\sa ParserTreeItem
|
|
|
|
|
*/
|
2011-07-06 17:40:54 +02:00
|
|
|
class ParserTreeItemPrivate
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2011-07-06 17:40:54 +02:00
|
|
|
public:
|
2021-02-15 17:11:11 +01:00
|
|
|
void mergeWith(const ParserTreeItem::ConstPtr &target);
|
|
|
|
|
void mergeSymbol(const CPlusPlus::Symbol *symbol);
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ConstPtr cloneTree() const;
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-16 16:04:50 +01:00
|
|
|
QHash<SymbolInformation, ParserTreeItem::ConstPtr> m_symbolInformations;
|
2021-02-16 15:48:08 +01:00
|
|
|
QSet<SymbolLocation> m_symbolLocations;
|
|
|
|
|
const Utils::FilePath m_projectFilePath;
|
2010-07-16 11:18:30 +02:00
|
|
|
};
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
void ParserTreeItemPrivate::mergeWith(const ParserTreeItem::ConstPtr &target)
|
|
|
|
|
{
|
|
|
|
|
if (target.isNull())
|
|
|
|
|
return;
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-16 15:48:08 +01:00
|
|
|
m_symbolLocations.unite(target->d->m_symbolLocations);
|
2013-05-24 17:35:14 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
// merge children
|
2021-02-16 15:48:08 +01:00
|
|
|
for (auto it = target->d->m_symbolInformations.cbegin();
|
|
|
|
|
it != target->d->m_symbolInformations.cend(); ++it) {
|
2021-02-15 17:11:11 +01:00
|
|
|
const SymbolInformation &inf = it.key();
|
2021-02-16 16:04:50 +01:00
|
|
|
const ParserTreeItem::ConstPtr &targetChild = it.value();
|
2013-05-24 17:35:14 +02:00
|
|
|
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ConstPtr child = m_symbolInformations.value(inf);
|
2021-02-15 17:11:11 +01:00
|
|
|
if (!child.isNull()) {
|
|
|
|
|
child->d->mergeWith(targetChild);
|
|
|
|
|
} else {
|
2021-02-16 16:04:50 +01:00
|
|
|
const ParserTreeItem::ConstPtr clone = targetChild.isNull() ? ParserTreeItem::ConstPtr()
|
2021-02-15 17:11:11 +01:00
|
|
|
: targetChild->d->cloneTree();
|
2021-02-16 15:48:08 +01:00
|
|
|
m_symbolInformations.insert(inf, clone);
|
2021-02-15 17:11:11 +01:00
|
|
|
}
|
|
|
|
|
}
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
void ParserTreeItemPrivate::mergeSymbol(const CPlusPlus::Symbol *symbol)
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2021-02-15 17:11:11 +01:00
|
|
|
if (!symbol)
|
|
|
|
|
return;
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
// easy solution - lets add any scoped symbol and
|
|
|
|
|
// any symbol which does not contain :: in the name
|
|
|
|
|
|
|
|
|
|
//! \todo collect statistics and reorder to optimize
|
2022-06-23 16:56:36 +02:00
|
|
|
if (symbol->asForwardClassDeclaration()
|
2021-02-15 17:11:11 +01:00
|
|
|
|| symbol->isExtern()
|
|
|
|
|
|| symbol->isFriend()
|
|
|
|
|
|| symbol->isGenerated()
|
2022-06-23 16:56:36 +02:00
|
|
|
|| symbol->asUsingNamespaceDirective()
|
|
|
|
|
|| symbol->asUsingDeclaration()
|
2021-02-15 17:11:11 +01:00
|
|
|
)
|
|
|
|
|
return;
|
2013-05-24 17:35:14 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
const CPlusPlus::Name *symbolName = symbol->name();
|
2022-06-23 16:56:36 +02:00
|
|
|
if (symbolName && symbolName->asQualifiedNameId())
|
2010-07-16 11:18:30 +02:00
|
|
|
return;
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
QString name = g_overview.prettyName(symbolName).trimmed();
|
|
|
|
|
QString type = g_overview.prettyType(symbol->type()).trimmed();
|
|
|
|
|
int iconType = CPlusPlus::Icons::iconTypeForSymbol(symbol);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
SymbolInformation information(name, type, iconType);
|
2013-05-24 17:35:14 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
// If next line will be removed, 5% speed up for the initial parsing.
|
|
|
|
|
// But there might be a problem for some files ???
|
|
|
|
|
// Better to improve qHash timing
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ConstPtr childItem = m_symbolInformations.value(information);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
if (childItem.isNull())
|
2021-02-16 16:04:50 +01:00
|
|
|
childItem = ParserTreeItem::ConstPtr(new ParserTreeItem());
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
// locations have 1-based column in Symbol, use the same here.
|
|
|
|
|
SymbolLocation location(QString::fromUtf8(symbol->fileName() , symbol->fileNameLength()),
|
|
|
|
|
symbol->line(), symbol->column());
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-16 15:48:08 +01:00
|
|
|
childItem->d->m_symbolLocations.insert(location);
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
// prevent showing a content of the functions
|
2022-06-23 16:56:36 +02:00
|
|
|
if (!symbol->asFunction()) {
|
2021-02-15 17:11:11 +01:00
|
|
|
if (const CPlusPlus::Scope *scope = symbol->asScope()) {
|
|
|
|
|
CPlusPlus::Scope::iterator cur = scope->memberBegin();
|
|
|
|
|
CPlusPlus::Scope::iterator last = scope->memberEnd();
|
|
|
|
|
while (cur != last) {
|
|
|
|
|
const CPlusPlus::Symbol *curSymbol = *cur;
|
|
|
|
|
++cur;
|
|
|
|
|
if (!curSymbol)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
childItem->d->mergeSymbol(curSymbol);
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
2021-02-15 17:11:11 +01:00
|
|
|
|
|
|
|
|
// if item is empty and has not to be added
|
2022-06-23 16:56:36 +02:00
|
|
|
if (!symbol->asNamespace() || childItem->childCount())
|
2021-02-16 15:48:08 +01:00
|
|
|
m_symbolInformations.insert(information, childItem);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
2021-02-15 17:11:11 +01:00
|
|
|
Creates a deep clone of this tree.
|
2013-05-24 17:35:14 +02:00
|
|
|
*/
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ConstPtr ParserTreeItemPrivate::cloneTree() const
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ConstPtr newItem(new ParserTreeItem(m_projectFilePath));
|
2021-02-16 15:48:08 +01:00
|
|
|
newItem->d->m_symbolLocations = m_symbolLocations;
|
2021-02-15 17:11:11 +01:00
|
|
|
|
2021-02-16 15:48:08 +01:00
|
|
|
for (auto it = m_symbolInformations.cbegin(); it != m_symbolInformations.cend(); ++it) {
|
2021-02-15 17:11:11 +01:00
|
|
|
ParserTreeItem::ConstPtr child = it.value();
|
|
|
|
|
if (child.isNull())
|
|
|
|
|
continue;
|
2021-02-16 15:48:08 +01:00
|
|
|
newItem->d->m_symbolInformations.insert(it.key(), child->d->cloneTree());
|
2021-02-15 17:11:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return newItem;
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
///////////////////////////////// ParserTreeItem //////////////////////////////////
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
2021-02-15 17:11:11 +01:00
|
|
|
\class ParserTreeItem
|
|
|
|
|
\brief The ParserTreeItem class is an item for the internal Class View tree.
|
|
|
|
|
|
|
|
|
|
Not virtual - to speed up its work.
|
2013-05-24 17:35:14 +02:00
|
|
|
*/
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
ParserTreeItem::ParserTreeItem()
|
|
|
|
|
: d(new ParserTreeItemPrivate())
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2021-02-15 17:11:11 +01:00
|
|
|
}
|
|
|
|
|
|
2021-02-16 15:48:08 +01:00
|
|
|
ParserTreeItem::ParserTreeItem(const Utils::FilePath &projectFilePath)
|
|
|
|
|
: d(new ParserTreeItemPrivate({{}, {}, projectFilePath}))
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ParserTreeItem(const QHash<SymbolInformation, ConstPtr> &children)
|
2021-02-15 17:11:11 +01:00
|
|
|
: d(new ParserTreeItemPrivate({children, {}, {}}))
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ParserTreeItem::~ParserTreeItem()
|
|
|
|
|
{
|
|
|
|
|
delete d;
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2021-02-16 15:48:08 +01:00
|
|
|
Utils::FilePath ParserTreeItem::projectFilePath() const
|
|
|
|
|
{
|
|
|
|
|
return d->m_projectFilePath;
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
2021-02-15 17:11:11 +01:00
|
|
|
Gets information about symbol positions.
|
|
|
|
|
\sa SymbolLocation, addSymbolLocation, removeSymbolLocation
|
2013-05-24 17:35:14 +02:00
|
|
|
*/
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
QSet<SymbolLocation> ParserTreeItem::symbolLocations() const
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2021-02-16 15:48:08 +01:00
|
|
|
return d->m_symbolLocations;
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Returns the child item specified by \a inf symbol information.
|
|
|
|
|
*/
|
|
|
|
|
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ConstPtr ParserTreeItem::child(const SymbolInformation &inf) const
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2021-02-16 15:48:08 +01:00
|
|
|
return d->m_symbolInformations.value(inf);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Returns the amount of children of the tree item.
|
|
|
|
|
*/
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
int ParserTreeItem::childCount() const
|
|
|
|
|
{
|
2021-02-16 15:48:08 +01:00
|
|
|
return d->m_symbolInformations.count();
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ConstPtr ParserTreeItem::parseDocument(const CPlusPlus::Document::Ptr &doc)
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2021-02-16 16:04:50 +01:00
|
|
|
ConstPtr item(new ParserTreeItem());
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
const unsigned total = doc->globalSymbolCount();
|
|
|
|
|
for (unsigned i = 0; i < total; ++i)
|
|
|
|
|
item->d->mergeSymbol(doc->globalSymbolAt(i));
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
return item;
|
|
|
|
|
}
|
2013-12-04 13:46:12 +01:00
|
|
|
|
2021-02-16 16:04:50 +01:00
|
|
|
ParserTreeItem::ConstPtr ParserTreeItem::mergeTrees(const Utils::FilePath &projectFilePath,
|
2021-02-16 15:48:08 +01:00
|
|
|
const QList<ConstPtr> &docTrees)
|
2021-02-15 17:11:11 +01:00
|
|
|
{
|
2021-02-16 16:04:50 +01:00
|
|
|
ConstPtr item(new ParserTreeItem(projectFilePath));
|
2021-02-15 17:11:11 +01:00
|
|
|
for (const ConstPtr &docTree : docTrees)
|
|
|
|
|
item->d->mergeWith(docTree);
|
|
|
|
|
|
|
|
|
|
return item;
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
|
2019-11-15 18:42:11 +01:00
|
|
|
/*!
|
|
|
|
|
Converts internal location container to QVariant compatible.
|
|
|
|
|
\a locations specifies a set of symbol locations.
|
|
|
|
|
Returns a list of variant locations that can be added to the data of an
|
|
|
|
|
item.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
static QList<QVariant> locationsToRole(const QSet<SymbolLocation> &locations)
|
|
|
|
|
{
|
|
|
|
|
QList<QVariant> locationsVar;
|
|
|
|
|
for (const SymbolLocation &loc : locations)
|
|
|
|
|
locationsVar.append(QVariant::fromValue(loc));
|
|
|
|
|
|
|
|
|
|
return locationsVar;
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
2021-02-16 15:48:08 +01:00
|
|
|
Checks \a item in a QStandardItemModel for lazy data population.
|
|
|
|
|
Make sure this method is called only from the GUI thread.
|
2013-05-24 17:35:14 +02:00
|
|
|
*/
|
2021-02-16 15:48:08 +01:00
|
|
|
bool ParserTreeItem::canFetchMore(QStandardItem *item) const
|
|
|
|
|
{
|
|
|
|
|
if (!item)
|
|
|
|
|
return false;
|
|
|
|
|
return item->rowCount() < d->m_symbolInformations.count();
|
|
|
|
|
}
|
2013-05-24 17:35:14 +02:00
|
|
|
|
2021-02-16 15:48:08 +01:00
|
|
|
/*!
|
|
|
|
|
Appends this item to the QStandardIten item \a item.
|
|
|
|
|
Make sure this method is called only from the GUI thread.
|
|
|
|
|
*/
|
|
|
|
|
void ParserTreeItem::fetchMore(QStandardItem *item) const
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2021-02-16 15:48:08 +01:00
|
|
|
using ProjectExplorer::SessionManager;
|
2010-07-16 11:18:30 +02:00
|
|
|
if (!item)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// convert to map - to sort it
|
2021-02-16 16:04:50 +01:00
|
|
|
QMap<SymbolInformation, ConstPtr> map;
|
2021-02-16 15:48:08 +01:00
|
|
|
for (auto it = d->m_symbolInformations.cbegin(); it != d->m_symbolInformations.cend(); ++it)
|
2021-02-15 17:11:11 +01:00
|
|
|
map.insert(it.key(), it.value());
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
for (auto it = map.cbegin(); it != map.cend(); ++it) {
|
|
|
|
|
const SymbolInformation &inf = it.key();
|
2021-02-16 16:04:50 +01:00
|
|
|
ConstPtr ptr = it.value();
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2018-11-04 22:40:59 +01:00
|
|
|
auto add = new QStandardItem;
|
2019-11-15 18:42:11 +01:00
|
|
|
add->setData(inf.name(), Constants::SymbolNameRole);
|
|
|
|
|
add->setData(inf.type(), Constants::SymbolTypeRole);
|
|
|
|
|
add->setData(inf.iconType(), Constants::IconTypeRole);
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
if (!ptr.isNull()) {
|
|
|
|
|
// icon
|
2021-02-16 15:48:08 +01:00
|
|
|
const Utils::FilePath &filePath = ptr->projectFilePath();
|
|
|
|
|
if (!filePath.isEmpty()) {
|
|
|
|
|
ProjectExplorer::Project *project = SessionManager::projectForFile(filePath);
|
|
|
|
|
if (project)
|
|
|
|
|
add->setIcon(project->containerNode()->icon());
|
|
|
|
|
}
|
2010-07-16 11:18:30 +02:00
|
|
|
|
2014-10-17 10:22:26 +02:00
|
|
|
// draggable
|
|
|
|
|
if (!ptr->symbolLocations().isEmpty())
|
|
|
|
|
add->setFlags(add->flags() | Qt::ItemIsDragEnabled);
|
|
|
|
|
|
2010-07-16 11:18:30 +02:00
|
|
|
// locations
|
2019-11-15 18:42:11 +01:00
|
|
|
add->setData(locationsToRole(ptr->symbolLocations()), Constants::SymbolLocationsRole);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
item->appendRow(add);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-24 17:35:14 +02:00
|
|
|
/*!
|
|
|
|
|
Debug dump.
|
|
|
|
|
*/
|
|
|
|
|
|
2021-02-15 17:11:11 +01:00
|
|
|
void ParserTreeItem::debugDump(int indent) const
|
2010-07-16 11:18:30 +02:00
|
|
|
{
|
2021-02-16 15:48:08 +01:00
|
|
|
for (auto it = d->m_symbolInformations.cbegin(); it != d->m_symbolInformations.cend(); ++it) {
|
2021-02-15 17:11:11 +01:00
|
|
|
const SymbolInformation &inf = it.key();
|
2021-02-16 16:04:50 +01:00
|
|
|
const ConstPtr &child = it.value();
|
2021-02-15 17:11:11 +01:00
|
|
|
qDebug() << QString(2 * indent, QLatin1Char(' ')) << inf.iconType() << inf.name()
|
|
|
|
|
<< inf.type() << child.isNull();
|
|
|
|
|
if (!child.isNull())
|
|
|
|
|
child->debugDump(indent + 1);
|
2010-07-16 11:18:30 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace ClassView
|
|
|
|
|
|