diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp index e0a59d43c211a9385e6c616f139b8471142ac98b..ab84fed5f80c336c62becd877956f3b01c56d1be 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.cpp +++ b/share/qtcreator/gdbmacros/gdbmacros.cpp @@ -2834,7 +2834,7 @@ static void qDumpQSharedPointer(QDumper &d) static void qDumpQString(QDumper &d) { - qCheckAccess(deref(d.data)); + //qCheckAccess(deref(d.data)); const QString &str = *reinterpret_cast<const QString *>(d.data); const int size = str.size(); diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 6b6c2bbf956d730c3f719dc430127dadd1634d68..b0b1e7a669d6f041df8b09f7ad424b53abedc551 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -1099,6 +1099,9 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future, QStringList suffixes) { QMap<QString, QStringList> entriesInPaths; + typedef QPair<QString, QString> SymLink; + typedef QList<SymLink> SymLinks; + SymLinks symlinks; int processed = 0; future.setProgressRange(0, paths.size()); @@ -1111,6 +1114,11 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future, break; const QString path = paths.takeFirst(); + + // Skip already scanned paths + if (entriesInPaths.contains(path)) + continue; + QStringList entries; QDirIterator i(path, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); @@ -1125,11 +1133,18 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future, // Also scan subdirectory, but avoid endless recursion with symbolic links if (fileInfo.isSymLink()) { - QMap<QString, QStringList>::const_iterator result = entriesInPaths.find(fileInfo.canonicalFilePath()); + QString target = fileInfo.symLinkTarget(); + + // Don't add broken symlinks + if (!QFileInfo(target).exists()) + continue; + + QMap<QString, QStringList>::const_iterator result = entriesInPaths.find(target); if (result != entriesInPaths.constEnd()) { entriesInPaths.insert(fileName, result.value()); } else { - paths.append(fileName); + paths.append(target); + symlinks.append(SymLink(fileName, target)); } } else { paths.append(fileName); @@ -1145,6 +1160,14 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future, future.setProgressRange(0, processed + paths.size()); future.setProgressValue(processed); } + // link symlinks + QListIterator<SymLink> it(symlinks); + it.toBack(); + while (it.hasPrevious()) { + SymLink v = it.previous(); + QMap<QString, QStringList>::const_iterator result = entriesInPaths.find(v.second); + entriesInPaths.insert(v.first, result.value()); + } manager->setIncludesInPaths(entriesInPaths); diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index 6f1391015b16ceca9ca29f5840c56ffb1e6b8975..ad77ef80e3cc73a76997cf5aadb823eb903dfff9 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -316,9 +316,10 @@ void DebuggerManager::init() // Tooltip //QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow); //tooltipView->setModel(m_watchHandler->model(TooltipsWatch)); - + //qRegisterMetaType<WatchData>("Debugger::Internal::WatchData"); + qRegisterMetaType<WatchData>("WatchData"); connect(m_watchHandler, SIGNAL(watchDataUpdateNeeded(WatchData)), - this, SLOT(updateWatchData(WatchData))); + this, SLOT(updateWatchData(WatchData)), Qt::QueuedConnection); m_continueAction = new QAction(this); m_continueAction->setText(tr("Continue")); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 6fbba11e083a5d7cac790cbdeff928bad768e038..99718326c247551356672cab0e6b2857b87a4059 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -83,7 +83,7 @@ namespace Internal { using namespace Debugger::Constants; //#define DEBUG_PENDING 1 -//#define DEBUG_SUBITEM 1 +#define DEBUG_SUBITEM 1 #if DEBUG_PENDING # define PENDING_DEBUG(s) qDebug() << s @@ -2958,6 +2958,10 @@ void GdbEngine::runDebuggingHelper(const WatchData &data0, bool dumpChildren) void GdbEngine::createGdbVariable(const WatchData &data) { + if (data.iname == _("local.flist.0")) { + int i = 1; + Q_UNUSED(i); + } postCommand(_("-var-delete \"%1\"").arg(data.iname), WatchUpdate); QString exp = data.exp; if (exp.isEmpty() && data.addr.startsWith(__("0x"))) @@ -3401,11 +3405,17 @@ void GdbEngine::handleDebuggingHelperValue2(const GdbResultRecord &record, setWatchDataType(data, record.data.findChild("type")); setWatchDataDisplayedType(data, record.data.findChild("displaytype")); - handleChildren(data, contents); + QList<WatchData> list; + handleChildren(data, contents, &list); + //for (int i = 0; i != list.size(); ++i) + // qDebug() << "READ: " << list.at(i).toString(); + qq->watchHandler()->insertBulkData(list); } -void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item) +void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item, + QList<WatchData> *list) { + //qDebug() << "HANDLE CHILDREN: " << data0.toString() << item.toString(); WatchData data = data0; if (!qq->watchHandler()->isExpandedIName(data.iname)) data.setChildrenUnneeded(); @@ -3432,16 +3442,16 @@ void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item) setWatchDataValueToolTip(data, item.findChild("valuetooltip"), item.findChild("valuetooltipencoded").data().toInt()); setWatchDataValueDisabled(data, item.findChild("valuedisabled")); + //qDebug() << "HANDLE CHILDREN: " << data.toString(); + list->append(data); // try not to repeat data too often WatchData childtemplate; setWatchDataType(childtemplate, item.findChild("childtype")); setWatchDataChildCount(childtemplate, item.findChild("childnumchild")); - //qDebug() << "CHILD TEMPLATE:" << childtemplate.toString(); + qDebug() << "CHILD TEMPLATE:" << childtemplate.toString(); - qq->watchHandler()->insertData(data); int i = 0; - QList<WatchData> list; foreach (GdbMi child, children.children()) { WatchData data1 = childtemplate; GdbMi name = child.findChild("name"); @@ -3463,11 +3473,9 @@ void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item) //data1.name += " (" + skey + ")"; data1.name = skey; } - handleChildren(data1, child); - list.append(data1); + handleChildren(data1, child, list); ++i; } - qq->watchHandler()->insertBulkData(list); } void GdbEngine::handleDebuggingHelperValue3(const GdbResultRecord &record, diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index b041c63eb2b0c6e78dd34ca68d0cd95f22b76b3b..07ef3bb8b8a76e9f631ec802990d3a5e7598089f 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -241,7 +241,8 @@ private: void debugMessage(const QString &msg); bool showToolTip(); - void handleChildren(const WatchData &parent, const GdbMi &child); + void handleChildren(const WatchData &parent, const GdbMi &child, + QList<WatchData> *insertions); const bool m_dumperInjectionLoad; OutputCollector m_outputCollector; diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 3ab57db6fd6f64ed31727056b4488ff70e99c2ab..fd6745014b9f87c78bd445c5edaf55b707bd5f57 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1003,7 +1003,7 @@ void WatchHandler::insertBulkData(const QList<WatchData> &list) { if (list.isEmpty()) return; - QHash<QString, QList<WatchData> > hash; + QMap<QString, QList<WatchData> > hash; foreach (const WatchData &data, list) { if (data.isSomethingNeeded()) diff --git a/src/plugins/helloworld/helloworldplugin.cpp b/src/plugins/helloworld/helloworldplugin.cpp index 245e6cda309747985b892e75112566d48f17749f..f898651c1bf99abe0d0156cf1bc38655e868ffac 100644 --- a/src/plugins/helloworld/helloworldplugin.cpp +++ b/src/plugins/helloworld/helloworldplugin.cpp @@ -114,6 +114,7 @@ bool HelloWorldPlugin::initialize(const QStringList &arguments, QString *error_m baseMode->setIcon(QIcon()); baseMode->setPriority(0); baseMode->setWidget(new QPushButton(tr("Hello World PushButton!"))); + baseMode->setContext(context); addAutoReleasedObject(baseMode); // Add the Hello World action command to the mode manager (with 0 priority)