Merge remote-tracking branch 'origin/4.4'

Conflicts:
	src/plugins/debugger/gdb/gdbengine.cpp

Change-Id: I8a7c8ca07d6d6005f5d39b8f1477ebbc7a299fbf
This commit is contained in:
Eike Ziller
2017-08-17 17:29:25 +02:00
34 changed files with 198 additions and 69 deletions

34
dist/changes-4.4.0.md vendored
View File

@@ -16,7 +16,8 @@ General
Editing Editing
* Added inline annotations for errors, warnings and bookmarks * Added optional inline annotations for Clang code model errors and warnings,
and bookmarks
* Added optional smooth scrolling when navigating within the same file * Added optional smooth scrolling when navigating within the same file
(for example with Locator or `Follow Symbol Under Cursor`) (for example with Locator or `Follow Symbol Under Cursor`)
* Added overridable `DeleteStartOfLine` and `DeleteEndOfLine` actions * Added overridable `DeleteStartOfLine` and `DeleteEndOfLine` actions
@@ -38,10 +39,13 @@ CMake Projects
(QTCREATORBUG-17973) (QTCREATORBUG-17973)
* Added warning when detecting `CMakeCache.txt` in source directory even though * Added warning when detecting `CMakeCache.txt` in source directory even though
build is configured for out-of-source build (QTCREATORBUG-18381) build is configured for out-of-source build (QTCREATORBUG-18381)
* Fixed `CMake configuration has changed on disk` dialog (QTCREATORBUG-18292)
* CMake >= 3.7 * CMake >= 3.7
* Improved handling of `CMAKE_RUNTIME_OUTPUT_DIRECTORY` (QTCREATORBUG-18158)
* Removed `<Source Directory>` node from project tree
* Fixed that headers from top level directory were not shown in project tree * Fixed that headers from top level directory were not shown in project tree
(QTCREATORBUG-17760) (QTCREATORBUG-17760)
* Improved handling of `CMAKE_RUNTIME_OUTPUT_DIRECTORY` (QTCREATORBUG-18158) * Fixed progress information (QTCREATORBUG-18624)
Qbs Projects Qbs Projects
@@ -58,6 +62,7 @@ C++ Support
(QTCREATORBUG-2818, QTCREATORBUG-18004) (QTCREATORBUG-2818, QTCREATORBUG-18004)
* Fixed highlighting of raw string literals (QTCREATORBUG-17720) * Fixed highlighting of raw string literals (QTCREATORBUG-17720)
* Fixed `Add #include` refactoring action for static functions * Fixed `Add #include` refactoring action for static functions
* Fixed crash when parsing invalid C++ code (QTCREATORBUG-18499)
* Clang Code Model * Clang Code Model
* Added highlighting of identifier under cursor, which was still * Added highlighting of identifier under cursor, which was still
delegated to built-in code model delegated to built-in code model
@@ -80,6 +85,8 @@ C++ Support
QML Support QML Support
* Updated QML parser to newer QML version (QTCREATORBUG-17842) * Updated QML parser to newer QML version (QTCREATORBUG-17842)
* Fixed crash in QML `Outline` pane
* Fixed that auto-completion could overwrite text (QTCREATORBUG-18449)
Debugging Debugging
@@ -88,17 +95,24 @@ Debugging
and `boost::variant` and `boost::variant`
* Improved display of enum bitfields * Improved display of enum bitfields
* Fixed support for `long double` (QTCREATORBUG-18023) * Fixed support for `long double` (QTCREATORBUG-18023)
* Fixed editing of strings (QTCREATORBUG-18681)
* CDB * CDB
* Added support for extra debugging helpers and debugging helper * Added support for extra debugging helpers and debugging helper
customization customization
* Added warning if run configuration uses unsupported shell command * Added warning if run configuration uses unsupported shell command
QML Profiler
* Fixed that timeline could stay empty after analyzing small range
(QTCREATORBUG-18354)
Version Control Systems Version Control Systems
* Fixed format of visual whitespace in blame, log and git rebase editors * Fixed format of visual whitespace in blame, log and git rebase editors
(QTCREATORBUG-17735) (QTCREATORBUG-17735)
* Git * Git
* Improved branch listing in `Show` (QTCREATORBUG-16949) * Improved branch listing in `Show` (QTCREATORBUG-16949)
* Made `git grep` for file system search recurse into submodules
* Gerrit * Gerrit
* Added validation of server certificate when using REST API * Added validation of server certificate when using REST API
* Fixed that non-Gerrit remotes were shown in `Push to Gerrit` dialog * Fixed that non-Gerrit remotes were shown in `Push to Gerrit` dialog
@@ -108,6 +122,7 @@ Version Control Systems
Diff Viewer Diff Viewer
* Improved performance
* Fixed state of actions in `Edit` menu * Fixed state of actions in `Edit` menu
* Fixed that context information for chunks was not shown in side-by-side view * Fixed that context information for chunks was not shown in side-by-side view
(QTCREATORBUG-18289) (QTCREATORBUG-18289)
@@ -118,6 +133,7 @@ Test Integration
* Added view with complete, unprocessed test output * Added view with complete, unprocessed test output
* Made it possible to enable and disable all tests using a specific test * Made it possible to enable and disable all tests using a specific test
framework framework
* Fixed wrong location of results for tests with same name (QTCREATORBUG-18502)
* QTest * QTest
* Added option to run verbose and with logging of signals and slots * Added option to run verbose and with logging of signals and slots
(`-vb` and `-vs`) (`-vb` and `-vs`)
@@ -127,12 +143,22 @@ Beautifier
* Added option for using a different AStyle configuration file * Added option for using a different AStyle configuration file
* Added option for fallback style for `clang-format` * Added option for fallback style for `clang-format`
Model Editor
* Fixed crash with invalid files (QTCREATORBUG-18526)
* Fixed crash when dropping package into itself (QTCREATORBUG-18262)
Platform Specific Platform Specific
Windows Windows
* Removed support for Windows CE * Removed support for Windows CE
macOS
* Fixed that some context menu items in Qt Quick Designer did nothing
(QTCREATORBUG-18662)
Android Android
* Added option to run commands before app starts and after app stopped * Added option to run commands before app starts and after app stopped
@@ -146,6 +172,10 @@ Remote Linux
* Added support for `ssh-agent` (QTCREATORBUG-16245) * Added support for `ssh-agent` (QTCREATORBUG-16245)
Universal Windows Platform
* Fixed deployment to Windows 10 Mobile devices (QTCREATORBUG-18728)
Credits for these changes go to: Credits for these changes go to:
Alessandro Portale Alessandro Portale
Alexander Drozdov Alexander Drozdov

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -43,14 +43,17 @@
\image qtcreator-clang-static-analyzer.png \image qtcreator-clang-static-analyzer.png
Select the link in the \uicontrol Location column to move to the location
where the issue appears in the code editor.
The Clang Static Analyzer runs with all the default checkers enabled. For The Clang Static Analyzer runs with all the default checkers enabled. For
more information about the checkers, see more information about the checkers, see
\l{http://clang-analyzer.llvm.org/available_checks.html}{Available Checkers}. \l{http://clang-analyzer.llvm.org/available_checks.html}{Available Checkers}.
To suppress diagnostics, select \uicontrol {Suppress This Diagnostic} in the To suppress diagnostics, select \uicontrol {Suppress This Diagnostic} in the
context menu. To view the suppression list for a project and to remove context menu. To view the suppression list for a project and to remove
diagnostics from it, select \uicontrol {Clang Static Analyzer} in diagnostics from it, select \uicontrol Projects >
the \uicontrol Projects mode. \uicontrol {Project Settings} > \uicontrol {Clang Static Analyzer}.
\section1 Supported Project Types and Tool Chains \section1 Supported Project Types and Tool Chains

View File

@@ -981,6 +981,8 @@
Linux, LLDB on macOS, and CDB on Windows, or any other platform on which at Linux, LLDB on macOS, and CDB on Windows, or any other platform on which at
least one of the three supported backends is available. least one of the three supported backends is available.
\section2 Adding Custom Debugging Helpers
To add debugging helpers for your own types, no compilation is required, To add debugging helpers for your own types, no compilation is required,
just adding a few lines of Python. The scripts can address multiple versions just adding a few lines of Python. The scripts can address multiple versions
of Qt, or of your own library, at the same time. of Qt, or of your own library, at the same time.
@@ -991,6 +993,45 @@
\uicontrol {Additional Startup Commands} in \uicontrol Tools > \uicontrol {Additional Startup Commands} in \uicontrol Tools >
\uicontrol Options > \uicontrol Debugger > \uicontrol GDB. \uicontrol Options > \uicontrol Debugger > \uicontrol GDB.
To get started with implementing debugging helpers for your own data types,
you can put their implementation into the file
\c share/qtcreator/debugger/personaltypes.py in your \QC installation. The
file contains one example implementation:
\quotefromfile ../../share/qtcreator/debugger/personaltypes.py
\skipto qdump__
\printuntil d.putItem
To add debugging helpers:
\list 1
\li Open the \c share/qtcreator/debugger/personaltypes.py file for
editing. For example, if your Qt installation is located in the
\c Qt5 directory on Windows, look in
\c C:\Qt5\Tools\QtCreator\share\qtcreator\debugger.
\li Add your dumper implementation to the end of the \c personaltypes.py
file. For more information about implementing debugging helpers,
see the following sections.
\li To prevent \c personaltypes.py from being overwritten when you
update your \QC installation (when updating your Qt installation,
for example), copy it to a safe location outside the \QC
installation in your file system and specify the location in
\uicontrol Tools > \uicontrol Options > \uicontrol Debugger >
\uicontrol {Locals & Expressions} >
\uicontrol {Extra Debugging Helpers}.
\image qtcreator-debugging-helper-options.png
\endlist
The custom debugging helpers will be automatically picked up from
\c personaltypes.py when you start a debugging session in \QC or select
\uicontrol {Reload Debugging Helpers} from the context menu of the
\uicontrol {Debugger Log} view.
\section2 Debugging Helper Overview \section2 Debugging Helper Overview
The implementation of a debugging helper typically consists of a single The implementation of a debugging helper typically consists of a single

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the Qt Creator documentation. ** This file is part of the Qt Creator documentation.
@@ -82,11 +82,12 @@
supported for QNX Neutrino devices, and requires the QNX SDK to be supported for QNX Neutrino devices, and requires the QNX SDK to be
installed on the development PC. installed on the development PC.
\li \l{Connecting Windows Runtime Devices} \li \l{Connecting UWP Devices}
You can build Windows Store Apps and run them on Windows Phones, the You can build applications for the Universal Windows Platform (UWP)
Windows Phone Emulator, or the Windows computer in Modern UI mode. and run them on any Windows 10 devices, such as PC, tablet, or
You can install the necessary tool chains as part of Qt 5.3. phone. You can install the necessary tool chains as part of Qt 5.9
or later.
\endlist \endlist

View File

@@ -44,7 +44,7 @@
\li QNX \li QNX
\li Windows Runtime (including Windows Phone) \li Universal Windows Platform (UWP)
\endlist \endlist
@@ -96,7 +96,7 @@
\li \inlineimage ok \li \inlineimage ok
* *
\row \row
\li Windows Runtime \li UWP
\li \li
\li \li
\li \image ok \li \image ok

View File

@@ -31,7 +31,7 @@
/*! /*!
\contentspage {Qt Creator Manual} \contentspage {Qt Creator Manual}
\previouspage creator-developing-winrt.html \previouspage creator-developing-uwp.html
\page creator-build-process-customizing.html \page creator-build-process-customizing.html
\nextpage creator-testing.html \nextpage creator-testing.html

View File

@@ -32,7 +32,7 @@
\contentspage {Qt Creator Manual} \contentspage {Qt Creator Manual}
\previouspage creator-developing-ios.html \previouspage creator-developing-ios.html
\page creator-developing-qnx.html \page creator-developing-qnx.html
\nextpage creator-developing-winrt.html \nextpage creator-developing-uwp.html
\title Connecting QNX Devices \title Connecting QNX Devices

View File

@@ -156,7 +156,7 @@
\li \l{Connecting Embedded Linux Devices} \li \l{Connecting Embedded Linux Devices}
\li \l{Connecting iOS Devices} \li \l{Connecting iOS Devices}
\li \l{Connecting QNX Devices} \li \l{Connecting QNX Devices}
\li \l{Connecting Windows Runtime Devices} \li \l{Connecting UWP Devices}
\endlist \endlist
\li \l{Customizing the Build Process} \li \l{Customizing the Build Process}
\endlist \endlist

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the Qt Creator documentation. ** This file is part of the Qt Creator documentation.
@@ -27,29 +27,30 @@
\contentspage {Qt Creator Manual} \contentspage {Qt Creator Manual}
\previouspage creator-developing-qnx.html \previouspage creator-developing-qnx.html
\page creator-developing-winrt.html \page creator-developing-uwp.html
\nextpage creator-build-process-customizing.html \nextpage creator-build-process-customizing.html
\title Connecting Windows Runtime Devices \title Connecting UWP Devices
You can build Windows Store Apps and run them on Windows Phones, Windows You can build applications for the Universal Windows Platform (UWP) and run
Phone Emulator, or the Windows computer in Modern UI mode. them on any Windows 10 devices, such as PC, tablet, or phone.
\QC uses the integrated \c windeployqt and \c winrtrunner tools to deploy \QC uses the integrated \c windeployqt and \c winrtrunner tools to deploy
and run applications. You can also run the tools manually from the command and run applications. You can also run the tools manually from the command
line. line.
The Qt 5.3 installer adds Windows Runtime and Windows Phone Qt versions to Since 5.3, the Qt installers add the Windows Runtime and Windows Phone Qt
\QC and creates the necessary kits. versions to \QC and create the necessary kits. In Qt 5.9, the packages were
renamed as UWP packages.
\image creator-winrt-kits.png "WinRT kits" \image creator-uwp-kits.png "UWP kits"
To connect Windows Runtime devices: To connect UWP devices:
\list 1 \list 1
\li Select \uicontrol Help > \uicontrol {About Plugins} > \uicontrol {Device Support} > \li Select \uicontrol Help > \uicontrol {About Plugins} > \uicontrol {Device Support} >
\uicontrol WinRT to enable the experimental Windows Runtime plugin. \uicontrol WinRT to enable the experimental UWP plugin.
\li Restart \QC to be able to use the plugin. \li Restart \QC to be able to use the plugin.
@@ -61,9 +62,8 @@
device. device.
\li Select \uicontrol Projects > \uicontrol {Build & Run} to \li Select \uicontrol Projects > \uicontrol {Build & Run} to
enable a kit for building applications and running them on Windows enable a kit for building applications and running them on UWP
Runtime devices (the local computer, for now), Windows Phones, devices.
or the Windows Phone emulator.
\endlist \endlist

View File

@@ -1649,7 +1649,7 @@ class Dumper(DumperBase):
result += '{line="%s"' % lineNumber result += '{line="%s"' % lineNumber
result += ',file="%s"' % fileName result += ',file="%s"' % fileName
if 0 < lineNumber and lineNumber <= len(source): if 0 < lineNumber and lineNumber <= len(source):
result += ',data="%s"' % source[lineNumber - 1] result += ',hexdata="%s"' % self.hexencode(source[lineNumber - 1])
result += ',hunk="%s"}' % hunk result += ',hunk="%s"}' % hunk
result += '{address="%s"' % loadAddr result += '{address="%s"' % loadAddr
result += ',data="%s %s"' % (insn.GetMnemonic(self.target), result += ',data="%s %s"' % (insn.GetMnemonic(self.target),

View File

@@ -24,16 +24,15 @@
############################################################################ ############################################################################
# This is a place to add your own dumpers for testing purposes. # This is a place to add your own dumpers for testing purposes.
# Any contents here will be picked up by GDB and LLDB based # Any contents here will be picked up by GDB, LLDB, and CDB based
# debugging in Qt Creator automatically. This code is not used # debugging in Qt Creator automatically.
# when debugging with CDB on Windows.
# NOTE: This file will get overwritten when updating Qt Creator. # NOTE: This file will get overwritten when updating Qt Creator.
# #
# To add dumpers that don't get overwritten, copy this file here # To add dumpers that don't get overwritten, copy this file here
# to a safe location outside the Qt Creator installation and # to a safe location outside the Qt Creator installation and
# make this location known to Qt Creator using the Debugger / # make this location known to Qt Creator using the Debugger >
# GDB / Dumper customization / Additional file setting. # Locals & Expressions > Extra Debugging Helpers setting.
# Example to display a simple type # Example to display a simple type
# template<typename U, typename V> struct MapNode # template<typename U, typename V> struct MapNode

View File

@@ -75,10 +75,7 @@ def qdump__QArrayData(d, value):
d.check(alloc == 0 or (0 <= size and size <= alloc and alloc <= 100000000)) d.check(alloc == 0 or (0 <= size and size <= alloc and alloc <= 100000000))
d.putValue(d.readMemory(data, size), 'latin1') d.putValue(d.readMemory(data, size), 'latin1')
d.putNumChild(1) d.putNumChild(1)
if d.isExpanded(): d.putPlainChildren(value)
with Children(d):
d.putIntItem('size', size)
d.putIntItem('alloc', alloc)
def qdump__QByteArrayData(d, value): def qdump__QByteArrayData(d, value):
qdump__QArrayData(d, value) qdump__QArrayData(d, value)
@@ -1369,8 +1366,9 @@ def qdump__QStringData(d, value):
(ref, size, alloc, pad, offset) = value.split('III@p') (ref, size, alloc, pad, offset) = value.split('III@p')
elided, shown = d.computeLimit(size, d.displayStringLimit) elided, shown = d.computeLimit(size, d.displayStringLimit)
data = d.readMemory(value.address() + offset, shown * 2) data = d.readMemory(value.address() + offset, shown * 2)
d.putNumChild(0)
d.putValue(data, 'utf16', elided=elided) d.putValue(data, 'utf16', elided=elided)
d.putNumChild(1)
d.putPlainChildren(value)
def qdump__QHashedString(d, value): def qdump__QHashedString(d, value):
qdump__QString(d, value) qdump__QString(d, value)

View File

@@ -42,8 +42,8 @@ Product {
+ product.moduleProperty("qtc", "ide_version_minor") + "\n"); + product.moduleProperty("qtc", "ide_version_minor") + "\n");
content = content.replace(/(\n#define IDE_VERSION_RELEASE) .+\n/, "$1 " content = content.replace(/(\n#define IDE_VERSION_RELEASE) .+\n/, "$1 "
+ product.moduleProperty("qtc", "ide_version_release") + "\n"); + product.moduleProperty("qtc", "ide_version_release") + "\n");
content = content.replace(/(\n#define IDE_COPYRIGHT_YEAR) .+\n/, "$1 " content = content.replace("$${QTCREATOR_COPYRIGHT_YEAR}",
+ product.moduleProperty("qtc", "qtcreator_copyright_year") + "\n"); product.moduleProperty("qtc", "qtcreator_copyright_year"));
file = new TextFile(output.filePath, TextFile.WriteOnly); file = new TextFile(output.filePath, TextFile.WriteOnly);
file.truncate(); file.truncate();
file.write(content); file.write(content);

View File

@@ -1295,13 +1295,13 @@ bool rescanExports(const QString &fileName, FindExportedCppTypes &finder,
return hasNewInfo; return hasNewInfo;
} }
void ModelManagerInterface::updateCppQmlTypes(QFutureInterface<void> &interface, void ModelManagerInterface::updateCppQmlTypes(QFutureInterface<void> &futureInterface,
ModelManagerInterface *qmlModelManager, ModelManagerInterface *qmlModelManager,
CPlusPlus::Snapshot snapshot, CPlusPlus::Snapshot snapshot,
QHash<QString, QPair<CPlusPlus::Document::Ptr, bool> > documents) QHash<QString, QPair<CPlusPlus::Document::Ptr, bool> > documents)
{ {
interface.setProgressRange(0, documents.size()); futureInterface.setProgressRange(0, documents.size());
interface.setProgressValue(0); futureInterface.setProgressValue(0);
CppDataHash newData; CppDataHash newData;
QHash<QString, QList<CPlusPlus::Document::Ptr> > newDeclarations; QHash<QString, QList<CPlusPlus::Document::Ptr> > newDeclarations;
@@ -1316,9 +1316,9 @@ void ModelManagerInterface::updateCppQmlTypes(QFutureInterface<void> &interface,
bool hasNewInfo = false; bool hasNewInfo = false;
typedef QPair<CPlusPlus::Document::Ptr, bool> DocScanPair; typedef QPair<CPlusPlus::Document::Ptr, bool> DocScanPair;
foreach (const DocScanPair &pair, documents) { foreach (const DocScanPair &pair, documents) {
if (interface.isCanceled()) if (futureInterface.isCanceled())
return; return;
interface.setProgressValue(interface.progressValue() + 1); futureInterface.setProgressValue(futureInterface.progressValue() + 1);
CPlusPlus::Document::Ptr doc = pair.first; CPlusPlus::Document::Ptr doc = pair.first;
const bool scan = pair.second; const bool scan = pair.second;

View File

@@ -242,7 +242,7 @@ protected:
ModelManagerInterface *modelManager, ModelManagerInterface *modelManager,
QmlJS::Dialect mainLanguage, QmlJS::Dialect mainLanguage,
bool emitDocChangedOnDisk); bool emitDocChangedOnDisk);
static void updateCppQmlTypes(QFutureInterface<void> &interface, static void updateCppQmlTypes(QFutureInterface<void> &futureInterface,
ModelManagerInterface *qmlModelManager, ModelManagerInterface *qmlModelManager,
CPlusPlus::Snapshot snapshot, CPlusPlus::Snapshot snapshot,
QHash<QString, QPair<CPlusPlus::Document::Ptr, bool> > documents); QHash<QString, QPair<CPlusPlus::Document::Ptr, bool> > documents);

View File

@@ -689,6 +689,13 @@ void TreeItem::insertChild(int pos, TreeItem *item)
} }
} }
void TreeItem::insertOrderedChild(TreeItem *item,
const std::function<bool (const TreeItem *, const TreeItem *)> &cmp)
{
auto where = std::lower_bound(begin(), end(), item, cmp);
insertChild(int(where - begin()), item);
}
void TreeItem::removeChildAt(int pos) void TreeItem::removeChildAt(int pos)
{ {
QTC_ASSERT(0 <= pos && pos < m_children.count(), return); QTC_ASSERT(0 <= pos && pos < m_children.count(), return);

View File

@@ -54,6 +54,9 @@ public:
void prependChild(TreeItem *item); void prependChild(TreeItem *item);
void appendChild(TreeItem *item); void appendChild(TreeItem *item);
void insertChild(int pos, TreeItem *item); void insertChild(int pos, TreeItem *item);
void insertOrderedChild(TreeItem *item,
const std::function<bool(const TreeItem *, const TreeItem *)> &cmp);
void removeChildAt(int pos); void removeChildAt(int pos);
void removeChildren(); void removeChildren();
void sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp); void sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp);
@@ -135,6 +138,14 @@ public:
ParentType *parent() const { ParentType *parent() const {
return static_cast<ParentType *>(TreeItem::parent()); return static_cast<ParentType *>(TreeItem::parent());
} }
void insertOrderedChild(ChildType *item, const std::function<bool(const ChildType *, const ChildType *)> &cmp)
{
const auto cmp0 = [cmp](const TreeItem *lhs, const TreeItem *rhs) {
return cmp(static_cast<const ChildType *>(lhs), static_cast<const ChildType *>(rhs));
};
TreeItem::insertOrderedChild(item, cmp0);
}
}; };
class QTCREATOR_UTILS_EXPORT StaticTreeItem : public TreeItem class QTCREATOR_UTILS_EXPORT StaticTreeItem : public TreeItem

View File

@@ -133,6 +133,7 @@ void AndroidDebugSupport::start()
.appendPath(toNdkArch(AndroidManager::targetArch(target))).toString(); .appendPath(toNdkArch(AndroidManager::targetArch(target))).toString();
} }
if (isQmlDebugging()) { if (isQmlDebugging()) {
params.qmlServer.host = m_runner->qmlServerHost();
params.qmlServer.port = m_runner->qmlServerPort(); params.qmlServer.port = m_runner->qmlServerPort();
//TODO: Not sure if these are the right paths. //TODO: Not sure if these are the right paths.
QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(kit); QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(kit);

View File

@@ -241,7 +241,7 @@ void AndroidManager::setDeviceSerialNumber(ProjectExplorer::Target *target, cons
QPair<int, int> AndroidManager::apiLevelRange() QPair<int, int> AndroidManager::apiLevelRange()
{ {
return qMakePair(9, 23); return qMakePair(9, 26);
} }
QString AndroidManager::androidNameForApiLevel(int x) QString AndroidManager::androidNameForApiLevel(int x)
@@ -291,6 +291,8 @@ QString AndroidManager::androidNameForApiLevel(int x)
return QLatin1String("Android 7.0"); return QLatin1String("Android 7.0");
case 25: case 25:
return QLatin1String("Android 7.1"); return QLatin1String("Android 7.1");
case 26:
return QLatin1String("Android 8.0");
default: default:
return tr("Unknown Android version. API Level: %1").arg(QString::number(x)); return tr("Unknown Android version. API Level: %1").arg(QString::number(x));
} }

View File

@@ -226,7 +226,8 @@ public:
Utils::Port localGdbServerPort() const { return m_localGdbServerPort; } Utils::Port localGdbServerPort() const { return m_localGdbServerPort; }
signals: signals:
void remoteProcessStarted(Utils::Port gdbServerPort, Utils::Port qmlServerPort, int pid); void remoteProcessStarted(Utils::Port gdbServerPort, Utils::Port qmlServerPort,
QString qmlServerHost, int pid);
void remoteProcessFinished(const QString &errString = QString()); void remoteProcessFinished(const QString &errString = QString());
void remoteOutput(const QString &output); void remoteOutput(const QString &output);
@@ -257,6 +258,7 @@ private:
bool m_useCppDebugger = false; bool m_useCppDebugger = false;
QmlDebug::QmlDebugServicesPreset m_qmlDebugServices; QmlDebug::QmlDebugServicesPreset m_qmlDebugServices;
Utils::Port m_localGdbServerPort; // Local end of forwarded debug socket. Utils::Port m_localGdbServerPort; // Local end of forwarded debug socket.
QString m_qmlServerHost;
Utils::Port m_qmlPort; Utils::Port m_qmlPort;
QString m_pingFile; QString m_pingFile;
QString m_pongFile; QString m_pongFile;
@@ -295,6 +297,7 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunControl *runControl, const AndroidRu
QTC_ASSERT(server.listen(QHostAddress::LocalHost) QTC_ASSERT(server.listen(QHostAddress::LocalHost)
|| server.listen(QHostAddress::LocalHostIPv6), || server.listen(QHostAddress::LocalHostIPv6),
qDebug() << tr("No free ports available on host for QML debugging.")); qDebug() << tr("No free ports available on host for QML debugging."));
m_qmlServerHost = server.serverAddress().toString();
m_qmlPort = Utils::Port(server.serverPort()); m_qmlPort = Utils::Port(server.serverPort());
} else { } else {
m_qmlPort = Utils::Port(); m_qmlPort = Utils::Port();
@@ -638,7 +641,7 @@ void AndroidRunnerWorker::onProcessIdChanged(qint64 pid)
} else { } else {
// In debugging cases this will be funneled to the engine to actually start // In debugging cases this will be funneled to the engine to actually start
// and attach gdb. Afterwards this ends up in handleRemoteDebuggerRunning() below. // and attach gdb. Afterwards this ends up in handleRemoteDebuggerRunning() below.
emit remoteProcessStarted(m_localGdbServerPort, m_qmlPort, m_processPID); emit remoteProcessStarted(m_localGdbServerPort, m_qmlPort, m_qmlServerHost, m_processPID);
logcatReadStandardOutput(); logcatReadStandardOutput();
QTC_ASSERT(!m_psIsAlive, /**/); QTC_ASSERT(!m_psIsAlive, /**/);
m_psIsAlive.reset(new QProcess); m_psIsAlive.reset(new QProcess);
@@ -782,10 +785,12 @@ void AndroidRunner::remoteErrorOutput(const QString &output)
m_outputParser.processOutput(output); m_outputParser.processOutput(output);
} }
void AndroidRunner::handleRemoteProcessStarted(Utils::Port gdbServerPort, Utils::Port qmlServerPort, int pid) void AndroidRunner::handleRemoteProcessStarted(Utils::Port gdbServerPort, Utils::Port qmlServerPort,
QString qmlServerHost, int pid)
{ {
m_pid = ProcessHandle(pid); m_pid = ProcessHandle(pid);
m_gdbServerPort = gdbServerPort; m_gdbServerPort = gdbServerPort;
m_qmlServerHost = qmlServerHost;
m_qmlServerPort = qmlServerPort; m_qmlServerPort = qmlServerPort;
reportStarted(); reportStarted();
} }

View File

@@ -57,6 +57,7 @@ public:
const AndroidRunnable &runnable() const { return m_androidRunnable; } const AndroidRunnable &runnable() const { return m_androidRunnable; }
Utils::Port gdbServerPort() const { return m_gdbServerPort; } Utils::Port gdbServerPort() const { return m_gdbServerPort; }
QString qmlServerHost() const { return m_qmlServerHost; }
Utils::Port qmlServerPort() const { return m_qmlServerPort; } Utils::Port qmlServerPort() const { return m_qmlServerPort; }
Utils::ProcessHandle pid() const { return m_pid; } Utils::ProcessHandle pid() const { return m_pid; }
@@ -76,7 +77,8 @@ private:
void remoteOutput(const QString &output); void remoteOutput(const QString &output);
void remoteErrorOutput(const QString &output); void remoteErrorOutput(const QString &output);
void gotRemoteOutput(const QString &output); void gotRemoteOutput(const QString &output);
void handleRemoteProcessStarted(Utils::Port gdbServerPort, Utils::Port qmlServerPort, int pid); void handleRemoteProcessStarted(Utils::Port gdbServerPort, Utils::Port qmlServerPort,
QString qmlServerHost, int pid);
void handleRemoteProcessFinished(const QString &errString = QString()); void handleRemoteProcessFinished(const QString &errString = QString());
void checkAVD(); void checkAVD();
void launchAVD(); void launchAVD();
@@ -88,6 +90,7 @@ private:
QScopedPointer<AndroidRunnerWorker> m_worker; QScopedPointer<AndroidRunnerWorker> m_worker;
QPointer<ProjectExplorer::Target> m_target; QPointer<ProjectExplorer::Target> m_target;
Utils::Port m_gdbServerPort; Utils::Port m_gdbServerPort;
QString m_qmlServerHost;
Utils::Port m_qmlServerPort; Utils::Port m_qmlServerPort;
Utils::ProcessHandle m_pid; Utils::ProcessHandle m_pid;
QmlDebug::QmlOutputParser m_outputParser; QmlDebug::QmlOutputParser m_outputParser;

View File

@@ -203,7 +203,8 @@ bool AndroidToolChain::fromMap(const QVariantMap &data)
FileNameList AndroidToolChain::suggestedMkspecList() const FileNameList AndroidToolChain::suggestedMkspecList() const
{ {
return FileNameList()<< FileName::fromLatin1("android-g++"); return FileNameList() << FileName::fromLatin1("android-g++")
<< FileName::fromLatin1("android-clang");
} }
QString AndroidToolChain::makeCommand(const Environment &env) const QString AndroidToolChain::makeCommand(const Environment &env) const

View File

@@ -45,7 +45,7 @@ bool isWarningOrNote(ClangBackEnd::DiagnosticSeverity severity)
Q_UNREACHABLE(); Q_UNREACHABLE();
} }
bool isBlackListedDiagnostic(const ClangBackEnd::DiagnosticContainer &diagnostic, bool isBlackListedHeaderDiagnostic(const ClangBackEnd::DiagnosticContainer &diagnostic,
bool isHeaderFile) bool isHeaderFile)
{ {
static const Utf8StringVector blackList{ static const Utf8StringVector blackList{
@@ -56,6 +56,21 @@ bool isBlackListedDiagnostic(const ClangBackEnd::DiagnosticContainer &diagnostic
return isHeaderFile && blackList.contains(diagnostic.text()); return isHeaderFile && blackList.contains(diagnostic.text());
} }
bool isBlackListedQtDiagnostic(const ClangBackEnd::DiagnosticContainer &diagnostic)
{
static const Utf8StringVector blackList{
// From Q_OBJECT:
Utf8StringLiteral("warning: "
"'metaObject' overrides a member function but is not marked 'override'"),
Utf8StringLiteral("warning: "
"'qt_metacast' overrides a member function but is not marked 'override'"),
Utf8StringLiteral("warning: "
"'qt_metacall' overrides a member function but is not marked 'override'"),
};
return blackList.contains(diagnostic.text());
}
template <class Condition> template <class Condition>
QVector<ClangBackEnd::DiagnosticContainer> QVector<ClangBackEnd::DiagnosticContainer>
filterDiagnostics(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, filterDiagnostics(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
@@ -97,7 +112,8 @@ void ClangDiagnosticFilter::filterDocumentRelatedWarnings(
const auto isLocalWarning = [this, isHeaderFile] const auto isLocalWarning = [this, isHeaderFile]
(const ClangBackEnd::DiagnosticContainer &diagnostic) { (const ClangBackEnd::DiagnosticContainer &diagnostic) {
return isWarningOrNote(diagnostic.severity()) return isWarningOrNote(diagnostic.severity())
&& !isBlackListedDiagnostic(diagnostic, isHeaderFile) && !isBlackListedHeaderDiagnostic(diagnostic, isHeaderFile)
&& !isBlackListedQtDiagnostic(diagnostic)
&& diagnostic.location().filePath() == m_filePath; && diagnostic.location().filePath() == m_filePath;
}; };

View File

@@ -1019,6 +1019,7 @@ void LldbEngine::fetchDisassembler(DisassemblerAgent *agent)
dl.data = line["rawdata"].data(); dl.data = line["rawdata"].data();
if (!dl.data.isEmpty()) if (!dl.data.isEmpty())
dl.data += QString(30 - dl.data.size(), QLatin1Char(' ')); dl.data += QString(30 - dl.data.size(), QLatin1Char(' '));
dl.data += fromHex(line["hexdata"].data());
dl.data += line["data"].data(); dl.data += line["data"].data();
dl.offset = line["offset"].toInt(); dl.offset = line["offset"].toInt();
dl.lineNumber = line["line"].toInt(); dl.lineNumber = line["line"].toInt();

View File

@@ -427,7 +427,7 @@ void QmlEngine::beginConnection(Utils::Port port)
QString host = runParameters().qmlServer.host; QString host = runParameters().qmlServer.host;
// Use localhost as default // Use localhost as default
if (host.isEmpty()) if (host.isEmpty())
host = "localhost"; host = QHostAddress(QHostAddress::LocalHost).toString();
/* /*
* Let plugin-specific code override the port printed by the application. This is necessary * Let plugin-specific code override the port printed by the application. This is necessary

View File

@@ -198,6 +198,16 @@ bool FlatModel::setData(const QModelIndex &index, const QVariant &value, int rol
return true; return true;
} }
static bool compareProjectNames(const WrapperNode *lhs, const WrapperNode *rhs)
{
Node *p1 = lhs->m_node;
Node *p2 = rhs->m_node;
const int displayNameResult = caseFriendlyCompare(p1->displayName(), p2->displayName());
if (displayNameResult != 0)
return displayNameResult < 0;
return p1 < p2; // sort by pointer value
}
void FlatModel::addOrRebuildProjectModel(Project *project) void FlatModel::addOrRebuildProjectModel(Project *project)
{ {
WrapperNode *container = nodeForProject(project); WrapperNode *container = nodeForProject(project);
@@ -205,7 +215,7 @@ void FlatModel::addOrRebuildProjectModel(Project *project)
container->removeChildren(); container->removeChildren();
} else { } else {
container = new WrapperNode(project->containerNode()); container = new WrapperNode(project->containerNode());
rootItem()->appendChild(container); rootItem()->insertOrderedChild(container, &compareProjectNames);
} }
QSet<Node *> seen; QSet<Node *> seen;
@@ -260,16 +270,7 @@ void FlatModel::updateSubtree(FolderNode *node)
void FlatModel::rebuildModel() void FlatModel::rebuildModel()
{ {
QList<Project *> projects = SessionManager::projects(); const QList<Project *> projects = SessionManager::projects();
QTC_CHECK(projects.size() == rootItem()->childCount());
Utils::sort(projects, [](Project *p1, Project *p2) {
const int displayNameResult = caseFriendlyCompare(p1->displayName(), p2->displayName());
if (displayNameResult != 0)
return displayNameResult < 0;
return p1 < p2; // sort by pointer value
});
for (Project *project : projects) for (Project *project : projects)
addOrRebuildProjectModel(project); addOrRebuildProjectModel(project);
} }

View File

@@ -90,7 +90,7 @@ bool QmlProfilerPlugin::initialize(const QStringList &arguments, QString *errorS
void QmlProfilerPlugin::extensionsInitialized() void QmlProfilerPlugin::extensionsInitialized()
{ {
(void) new QmlProfilerTool(this); m_profilerTool = new QmlProfilerTool(this);
addAutoReleasedObject(new QmlProfilerOptionsPage); addAutoReleasedObject(new QmlProfilerOptionsPage);
@@ -112,6 +112,9 @@ void QmlProfilerPlugin::extensionsInitialized()
ExtensionSystem::IPlugin::ShutdownFlag QmlProfilerPlugin::aboutToShutdown() ExtensionSystem::IPlugin::ShutdownFlag QmlProfilerPlugin::aboutToShutdown()
{ {
delete m_profilerTool;
m_profilerTool = nullptr;
// Save settings. // Save settings.
// Disconnect from signals that are not needed during shutdown // Disconnect from signals that are not needed during shutdown
// Hide UI (if you add UI that is not in the main window directly) // Hide UI (if you add UI that is not in the main window directly)

View File

@@ -34,6 +34,8 @@
namespace QmlProfiler { namespace QmlProfiler {
namespace Internal { namespace Internal {
class QmlProfilerTool;
class QmlProfilerPlugin : public ExtensionSystem::IPlugin class QmlProfilerPlugin : public ExtensionSystem::IPlugin
{ {
Q_OBJECT Q_OBJECT
@@ -47,6 +49,9 @@ public:
static QmlProfilerSettings *globalSettings(); static QmlProfilerSettings *globalSettings();
QList<QObject *> createTestObjects() const override; QList<QObject *> createTestObjects() const override;
private:
QmlProfilerTool *m_profilerTool = nullptr;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -64,7 +64,7 @@ static QString QmlServerUrl = "QmlServerUrl";
class QmlProfilerRunner::QmlProfilerRunnerPrivate class QmlProfilerRunner::QmlProfilerRunnerPrivate
{ {
public: public:
QmlProfilerStateManager *m_profilerState = 0; QPointer<QmlProfilerStateManager> m_profilerState;
}; };
// //

View File

@@ -709,6 +709,7 @@ void ExamplesListModelFilter::timerEvent(QTimerEvent *timerEvent)
{ {
if (m_timerId == timerEvent->timerId()) { if (m_timerId == timerEvent->timerId()) {
invalidateFilter(); invalidateFilter();
emit layoutChanged();
killTimer(m_timerId); killTimer(m_timerId);
m_timerId = 0; m_timerId = 0;
} }