Merge "Merge remote-tracking branch 'origin/13.0' into qds/dev" into qds/dev

This commit is contained in:
The Qt Project
2024-02-14 10:46:30 +00:00
19 changed files with 404 additions and 293 deletions

View File

@@ -34,18 +34,18 @@ General
dock area
* Added the option to show file paths relative to the active project to the
search results view
(QTCREATORBUG-29462)
([QTCREATORBUG-29462](https://bugreports.qt.io/browse/QTCREATORBUG-29462))
* Added a `Current` button for selecting the directory of the current document
for searching in `Files in File System`
* Added `Copy to Clipboard` to the `About Qt Creator` dialog
(QTCREATORBUG-29886)
([QTCREATORBUG-29886](https://bugreports.qt.io/browse/QTCREATORBUG-29886))
Editing
-------
* Made syntax highlighting asynchronous
* Fixed that `Shift+Tab` did not always unindent
(QTCREATORBUG-29742)
([QTCREATORBUG-29742](https://bugreports.qt.io/browse/QTCREATORBUG-29742))
* Fixed that `Surround text selection with brackets` did nothing for `<`
* Fixed following links without a file name in documents without a file name
@@ -53,34 +53,39 @@ Editing
* Added the `Move Definition Here` refactoring action that moves an existing
function definition to its declaration
(QTCREATORBUG-9515)
([QTCREATORBUG-9515](https://bugreports.qt.io/browse/QTCREATORBUG-9515))
* Added the `Enclose in QByteArrayLiteral` refactoring action
([QTCREATORBUG-12995](https://bugreports.qt.io/browse/QTCREATORBUG-12995))
* Enabled the completion inside comments and strings by falling back to the
built-in code model
(QTCREATORBUG-20828)
([QTCREATORBUG-20828](https://bugreports.qt.io/browse/QTCREATORBUG-20828))
* Improved the position of headers inserted by refactoring operations
(QTCREATORBUG-21826)
([QTCREATORBUG-21826](https://bugreports.qt.io/browse/QTCREATORBUG-21826))
* Improved the coding style settings by separating Clang Format and other coding
style settings, and using a plain text editor for custom Clang Format settings
* Fixed that the class wizards used the class name for the include guard
instead of the file name
(QTCREATORBUG-30140)
([QTCREATORBUG-30140](https://bugreports.qt.io/browse/QTCREATORBUG-30140))
* Fixed that renaming classes did not change the include directive for the
renamed header in the source file
(QTCREATORBUG-30154)
([QTCREATORBUG-30154](https://bugreports.qt.io/browse/QTCREATORBUG-30154))
* Fixed issues with refactoring template functions
(QTCREATORBUG-29408)
([QTCREATORBUG-29408](https://bugreports.qt.io/browse/QTCREATORBUG-29408))
* Fixed the `Add Definition` refactoring action for member functions of a
template class in a namespace
([QTCREATORBUG-22076](https://bugreports.qt.io/browse/QTCREATORBUG-22076))
* Clangd
* Fixed that `Follow Symbol Under Cursor` only worked for exact matches
(QTCREATORBUG-29814)
([QTCREATORBUG-29814](https://bugreports.qt.io/browse/QTCREATORBUG-29814))
### QML
* Added navigation from QML components to the C++ code in the project
(QTCREATORBUG-28086)
([QTCREATORBUG-28086](https://bugreports.qt.io/browse/QTCREATORBUG-28086))
* Added a button for launching the QML Preview on the current document to
the editor tool bar
* Added color previews when hovering Qt color functions
(QTCREATORBUG-29966)
([QTCREATORBUG-29966](https://bugreports.qt.io/browse/QTCREATORBUG-29966))
### Python
@@ -95,7 +100,7 @@ Editing
### Widget Designer
* Fixed the indentation of the code that is inserted by `Go to slot`
(QTCREATORBUG-11730)
([QTCREATORBUG-11730](https://bugreports.qt.io/browse/QTCREATORBUG-11730))
### Compiler Explorer
@@ -108,6 +113,10 @@ Editing
endings) to the tool bar
* Added support for following links to the text editor
### Binary Files
* Fixed issues with large addresses
Projects
--------
@@ -115,41 +124,62 @@ Projects
was configured for kits that have vanished, as a replacement for the automatic
creation of "Replacement" kits
* Added the status of devices to the device lists
(QTCREATORBUG-20941)
([QTCREATORBUG-20941](https://bugreports.qt.io/browse/QTCREATORBUG-20941))
* Added the `Preferences > Build & Run > General > Application environment`
option for globally modifying the environment for all run configurations
(QTCREATORBUG-29530)
([QTCREATORBUG-29530](https://bugreports.qt.io/browse/QTCREATORBUG-29530))
* Added a file wizard for Qt translation (`.ts`) files
(QTCREATORBUG-29775)
([QTCREATORBUG-29775](https://bugreports.qt.io/browse/QTCREATORBUG-29775))
* Increased the maximum width of the target selector
(QTCREATORBUG-30038)
([QTCREATORBUG-30038](https://bugreports.qt.io/browse/QTCREATORBUG-30038))
* Fixed that the `Left` cursor key did not always collapse the current item
(QTBUG-118515)
([QTBUG-118515](https://bugreports.qt.io/browse/QTBUG-118515))
* Fixed inconsistent folder hierarchies in the project tree
(QTCREATORBUG-29923)
([QTCREATORBUG-29923](https://bugreports.qt.io/browse/QTCREATORBUG-29923))
### CMake
* Added support for custom output parsers for the configuration of projects
(QTCREATORBUG-29992)
([QTCREATORBUG-29992](https://bugreports.qt.io/browse/QTCREATORBUG-29992))
* Made cache variables available even if project configuration failed
* CMake Presets
* Fixed `Reload CMake Presets` if the project was not configured yet
([QTCREATORBUG-30238](https://bugreports.qt.io/browse/QTCREATORBUG-30238))
* Fixed that kits were accumulating on the project setup page
([QTCREATORBUG-29535](https://bugreports.qt.io/browse/QTCREATORBUG-29535))
* Fixed that `binaryDir` was not handled for all presets
([QTCREATORBUG-30236](https://bugreports.qt.io/browse/QTCREATORBUG-30236))
* Fixed a freeze with nested presets
([QTCREATORBUG-30288](https://bugreports.qt.io/browse/QTCREATORBUG-30288))
* Conan
* Fixed that backslashes were wrongly used for paths on Windows
([QTCREATORBUG-30326](https://bugreports.qt.io/browse/QTCREATORBUG-30326))
### Qbs
* Added support for code completion with the Qbs language server
(QBS-395)
### Python
* Added `Generate Kit` to the Python interpreter preferences for generating a
Python kit with this interpreter
* Added the target setup page when loading unconfigured Python projects
* Added a `requirements.txt` file to the application wizard
* Fixed that the same Python interpreter could be auto-detected multiple times
under different names
Debugging
---------
* Added a `dr` locator filter for debugging a project
### C++
* Added a pretty printer for `std::tuple`
* Fixed that breakpoints were not hit while the message dialog about missing
debug information was shown
(QTCREATORBUG-30168)
([QTCREATORBUG-30168](https://bugreports.qt.io/browse/QTCREATORBUG-30168))
### Debug Adapter Protocol
@@ -161,7 +191,7 @@ Analyzer
### Clang
* Added `Edit Checks as Strings` for Clazy
(QTCREATORBUG-24846)
([QTCREATORBUG-24846](https://bugreports.qt.io/browse/QTCREATORBUG-24846))
### Axivion
@@ -171,16 +201,19 @@ Terminal
--------
* Added `Select All` to the context menu
(QTCREATORBUG-29922)
([QTCREATORBUG-29922](https://bugreports.qt.io/browse/QTCREATORBUG-29922))
* Fixed the startup performance on Windows
(QTCREATORBUG-29840)
([QTCREATORBUG-29840](https://bugreports.qt.io/browse/QTCREATORBUG-29840))
* Fixed the integration of the `fish` shell
* Fixed that `Ctrl+W` closed the terminal even when shortcuts were blocked
(QTCREATORBUG-30070)
([QTCREATORBUG-30070](https://bugreports.qt.io/browse/QTCREATORBUG-30070))
* Fixed issues with Windows Powershell
Version Control Systems
-----------------------
* Added support for remote version control operations
### Git
* Added the upstream status for untracked branches to `Branches` view
@@ -195,22 +228,27 @@ Test Integration
Platforms
---------
### Windows
* Fixed Clang compiler ABI detection for WOA64
([QTCREATORBUG-30060](https://bugreports.qt.io/browse/QTCREATORBUG-30060))
### Android
* Add support for target-based android-build directories (??? is that ready? Qt 6.8+ ???)
(QTBUG-117443)
([QTBUG-117443](https://bugreports.qt.io/browse/QTBUG-117443))
### iOS
* Fixed the detection of iOS 17 devices
* Fixed deployment and running applications for iOS 17 devices
(application output, debugging, and profiling are not supported)
(QTCREATORBUG-29682)
([QTCREATORBUG-29682](https://bugreports.qt.io/browse/QTCREATORBUG-29682))
### Remote Linux
* Fixed that debugging unnecessarily downloaded files from the remote system
(QTCREATORBUG-29614)
([QTCREATORBUG-29614](https://bugreports.qt.io/browse/QTCREATORBUG-29614))
Credits for these changes go to:
--------------------------------
@@ -238,6 +276,7 @@ Esa Törmänen
Fabian Kosmale
Friedemann Kleint
Henning Gruendl
Ilya Kulakov
Jaroslaw Kobus
Johanna Vanhatapio
Karim Abdelrahman
@@ -249,6 +288,7 @@ Marcus Tillmanns
Mathias Hasselmann
Mats Honkamaa
Mehdi Salem
Michael Weghorn
Miikka Heikkinen
Mitch Curtis
Olivier De Cannière
@@ -257,6 +297,7 @@ Pranta Dastider
Robert Löhning
Sami Shalayel
Samuel Jose Raposo Vieira Mira
Samuel Mira
Serg Kryvonos
Shrief Gabr
Sivert Krøvel

View File

@@ -0,0 +1,49 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page creator-how-to-contact-qt.html
\previouspage creator-how-tos.html
\ingroup creator-how-to-use
\title Contact Qt
To report bugs and tell us what you think about \QC and Qt,
go to \uicontrol Help.
\section1 Report bugs and suggest improvements
To report bugs and add suggestions for improvement to the
\l{https://bugreports.qt.io/}{Qt Project Bug Tracker},
go to \uicontrol Help > \uicontrol {Report Bug}.
To copy information about your \QC version that you can paste to the bug
report, go to \uicontrol Help > \uicontrol {About \QC} and select
\uicontrol {Copy and Close}.
To copy detailed information about your system that you can paste to the bug
report, go to \uicontrol Help > \uicontrol {System Information} and select
\uicontrol {Copy to Clipboard}.
To get commercial Qt support, go to \uicontrol Help >
\uicontrol {Commercial Qt Support} and create a service request.
To check your licenses and services, go to \uicontrol Help >
\uicontrol {Qt Account}.
\section1 Give feedback
To rate \QC and send us feedback, go to \uicontrol Help >
\uicontrol {Give Feedback}.
Or, give feedback from your Qt account.
\section1 Join discussions
To join the \l{https://lists.qt-project.org/listinfo/qt-creator}
{\QC mailing list} or \l{https://web.libera.chat/#qt-creator}
{#qt-creator} channel on Libera.Chat IRC, go to \uicontrol Help >
\uicontrol Contact.
\sa {Pasting and Fetching Code Snippets}, {Technical Support}
*/

View File

@@ -87,7 +87,25 @@
To run in a clean system environment, select \uicontrol {Clean Environment}.
\section2 Run on devices
\section2 Set the environment for all run configurations
To set environment variables for running and debugging applications, so
that they don't affect \QC itself, set environment variables for run
configurations of all projects:
\list 1
\li Go to \preferences > \uicontrol {Build & Run} > \uicontrol General.
\li Select \uicontrol Change in \uicontrol {Application environment}.
\li Set environment variables in \uicontrol {Edit Environment}.
\image qtcreator-edit-environment.webp {Edit Environment dialog}
\endlist
For example, set \c QT_FORCE_STDERR_LOGGING=1 to see application output
in \l {Application Output} instead of a journal or system log.
Or, set \c QT_MESSAGE_PATTERN to add information to debugging messages.
\section2 Use device environment
When running on a mobile device connected to the development host, \QC
fetches information about the \uicontrol {Device Environment} from the device.

View File

@@ -86,6 +86,7 @@
\endlist
\li \b {\l{Reference}}
\list
\li \l {Acknowledgements}
\li \l {Build Systems}
\li \l {Command-Line Options}
\li \l {Custom Wizards}
@@ -94,21 +95,5 @@
\li \l {Supported Platforms}
\li \l {Reference}{See More...}
\endlist
\row
\li {4,1} \b {Contact Us}
\list
\li To report bugs and suggestions to the
\l{https://bugreports.qt.io/}{Qt Project Bug Tracker},
select \uicontrol Help > \uicontrol {Report Bug}.
\li To copy and paste detailed information about your
system to the bug report, select \uicontrol Help >
\uicontrol {System Information}.
\li To join the \l{https://lists.qt-project.org/listinfo/qt-creator}
{\QC mailing list} or \l{https://web.libera.chat/#qt-creator}
{#qt-creator} channel on Libera.Chat IRC, select
\uicontrol Help > \uicontrol Contact.
\li For credits and a list of third-party libraries, see
\l {Acknowledgements}.
\endlist
\endtable
*/

View File

@@ -204,7 +204,7 @@ def qdump__CPlusPlus__Internal__Value(d, value):
def qdump__Utils__FilePath(d, value):
data, path_len, scheme_len, host_len = d.split("{@QString}IHH", value)
elided, enc = d.encodeStringHelper(data, d.displayStringLimit)
length, enc = d.encodeStringHelper(data, d.displayStringLimit)
# enc is concatenated path + scheme + host
if scheme_len:
scheme_pos = path_len * 4
@@ -221,7 +221,7 @@ def qdump__Utils__FilePath(d, value):
val += path_enc
else:
val = enc
d.putValue(val, "utf16", elided=elided)
d.putValue(val, "utf16", length=length)
d.putPlainChildren(value)

View File

@@ -44,15 +44,15 @@ class ReportItem():
subsequent better guesses during a putItem() run.
"""
def __init__(self, value=None, encoding=None, priority=-100, elided=None):
def __init__(self, value=None, encoding=None, priority=-100, length=None):
self.value = value
self.priority = priority
self.encoding = encoding
self.elided = elided
self.length = length
def __str__(self):
return 'Item(value: %s, encoding: %s, priority: %s, elided: %s)' \
% (self.value, self.encoding, self.priority, self.elided)
return 'Item(value: %s, encoding: %s, priority: %s, length: %s)' \
% (self.value, self.encoding, self.priority, self.length)
class Timer():
@@ -349,8 +349,8 @@ class DumperBase():
else:
if self.currentValue.encoding is not None:
self.put('valueencoded="%s",' % self.currentValue.encoding)
if self.currentValue.elided:
self.put('valueelided="%s",' % self.currentValue.elided)
if self.currentValue.length:
self.put('valuelen="%s",' % self.currentValue.length)
self.put('value="%s",' % self.currentValue.value)
except:
pass
@@ -376,7 +376,7 @@ class DumperBase():
b = bytes(bytearray.fromhex(value))
value = codecs.decode(b, 'utf-16')
self.put('"%s"' % value)
if self.currentValue.elided:
if self.currentValue.length:
self.put('...')
if self.currentType.value:
@@ -545,40 +545,40 @@ class DumperBase():
# assume no Qt 3 support by default
return False
# Clamps size to limit.
def computeLimit(self, size, limit):
# Clamps length to limit.
def computeLimit(self, length, limit=0):
if limit == 0:
limit = self.displayStringLimit
if limit is None or size <= limit:
return 0, size
return size, limit
if limit is None or length <= limit:
return length
return limit
def vectorData(self, value):
if self.qtVersion() >= 0x060000:
data, size, alloc = self.qArrayData(value)
data, length, alloc = self.qArrayData(value)
elif self.qtVersion() >= 0x050000:
vector_data_ptr = self.extractPointer(value)
if self.ptrSize() == 4:
(ref, size, alloc, offset) = self.split('IIIp', vector_data_ptr)
(ref, length, alloc, offset) = self.split('IIIp', vector_data_ptr)
else:
(ref, size, alloc, pad, offset) = self.split('IIIIp', vector_data_ptr)
(ref, length, alloc, pad, offset) = self.split('IIIIp', vector_data_ptr)
alloc = alloc & 0x7ffffff
data = vector_data_ptr + offset
else:
vector_data_ptr = self.extractPointer(value)
(ref, alloc, size) = self.split('III', vector_data_ptr)
(ref, alloc, length) = self.split('III', vector_data_ptr)
data = vector_data_ptr + 16
self.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000)
return data, size
self.check(0 <= length and length <= alloc and alloc <= 1000 * 1000 * 1000)
return data, length
def qArrayData(self, value):
if self.qtVersion() >= 0x60000:
dd, data, size = self.split('ppp', value)
dd, data, length = self.split('ppp', value)
if dd:
_, _, alloc = self.split('iip', dd)
else: # fromRawData
alloc = size
return data, size, alloc
alloc = length
return data, length, alloc
return self.qArrayDataHelper(self.extractPointer(value))
def qArrayDataHelper(self, array_data_ptr):
@@ -586,10 +586,10 @@ class DumperBase():
if self.qtVersion() >= 0x050000:
# QTypedArray:
# - QtPrivate::RefCount ref
# - int size
# - int length
# - uint alloc : 31, capacityReserved : 1
# - qptrdiff offset
(ref, size, alloc, offset) = self.split('IIpp', array_data_ptr)
(ref, length, alloc, offset) = self.split('IIpp', array_data_ptr)
alloc = alloc & 0x7ffffff
data = array_data_ptr + offset
if self.ptrSize() == 4:
@@ -599,43 +599,42 @@ class DumperBase():
elif self.qtVersion() >= 0x040000:
# Data:
# - QBasicAtomicInt ref;
# - int alloc, size;
# - int alloc, length;
# - [padding]
# - char *data;
if self.ptrSize() == 4:
(ref, alloc, size, data) = self.split('IIIp', array_data_ptr)
(ref, alloc, length, data) = self.split('IIIp', array_data_ptr)
else:
(ref, alloc, size, pad, data) = self.split('IIIIp', array_data_ptr)
(ref, alloc, length, pad, data) = self.split('IIIIp', array_data_ptr)
else:
# Data:
# - QShared count;
# - QChar *unicode
# - char *ascii
# - uint len: 30
(dummy, dummy, dummy, size) = self.split('IIIp', array_data_ptr)
size = self.extractInt(array_data_ptr + 3 * self.ptrSize()) & 0x3ffffff
alloc = size # pretend.
(dummy, dummy, dummy, length) = self.split('IIIp', array_data_ptr)
length = self.extractInt(array_data_ptr + 3 * self.ptrSize()) & 0x3ffffff
alloc = length # pretend.
data = self.extractPointer(array_data_ptr + self.ptrSize())
return data, size, alloc
return data, length, alloc
def encodeStringHelper(self, value, limit):
data, size, alloc = self.qArrayData(value)
data, length, alloc = self.qArrayData(value)
if alloc != 0:
self.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000)
elided, shown = self.computeLimit(2 * size, 2 * limit)
return elided, self.readMemory(data, shown)
self.check(0 <= length and length <= alloc and alloc <= 100 * 1000 * 1000)
shown = self.computeLimit(2 * length, 2 * limit)
return length, self.readMemory(data, shown)
def encodeByteArrayHelper(self, value, limit):
data, size, alloc = self.qArrayData(value)
data, length, alloc = self.qArrayData(value)
if alloc != 0:
self.check(0 <= size and size <= alloc and alloc <= 100 * 1000 * 1000)
elided, shown = self.computeLimit(size, limit)
return elided, self.readMemory(data, shown)
self.check(0 <= length and length <= alloc and alloc <= 100 * 1000 * 1000)
shown = self.computeLimit(length, limit)
return length, self.readMemory(data, shown)
def putCharArrayValue(self, data, size, charSize,
def putCharArrayValue(self, data, length, charSize,
displayFormat=DisplayFormat.Automatic):
bytelen = size * charSize
elided, shown = self.computeLimit(bytelen, self.displayStringLimit)
shown = self.computeLimit(length, self.displayStringLimit)
mem = self.readMemory(data, shown)
if charSize == 1:
if displayFormat in (DisplayFormat.Latin1String, DisplayFormat.SeparateLatin1String):
@@ -650,13 +649,13 @@ class DumperBase():
encodingType = 'ucs4'
#childType = 'int'
self.putValue(mem, encodingType, elided=elided)
self.putValue(mem, encodingType, length=length)
if displayFormat in (
DisplayFormat.SeparateLatin1String,
DisplayFormat.SeparateUtf8String,
DisplayFormat.Separate):
elided, shown = self.computeLimit(bytelen, 100000)
shown = self.computeLimit(length, 100000)
self.putDisplay(encodingType + ':separate', self.readMemory(data, shown))
def putCharArrayHelper(self, data, size, charType,
@@ -676,15 +675,15 @@ class DumperBase():
return self.hexencode(bytes(self.readRawMemory(addr, size)))
def encodeByteArray(self, value, limit=0):
elided, data = self.encodeByteArrayHelper(value, limit)
_, data = self.encodeByteArrayHelper(value, limit)
return data
def putByteArrayValue(self, value):
elided, data = self.encodeByteArrayHelper(value, self.displayStringLimit)
self.putValue(data, 'latin1', elided=elided)
length, data = self.encodeByteArrayHelper(value, self.displayStringLimit)
self.putValue(data, 'latin1', length=length)
def encodeString(self, value, limit=0):
elided, data = self.encodeStringHelper(value, limit)
_, data = self.encodeStringHelper(value, limit)
return data
def encodedUtf16ToUtf8(self, s):
@@ -730,8 +729,8 @@ class DumperBase():
return inner
def putStringValue(self, value):
elided, data = self.encodeStringHelper(value, self.displayStringLimit)
self.putValue(data, 'utf16', elided=elided)
length, data = self.encodeStringHelper(value, self.displayStringLimit)
self.putValue(data, 'utf16', length=length)
def putPtrItem(self, name, value):
with SubItem(self, name):
@@ -900,12 +899,12 @@ class DumperBase():
if not self.isInt(thing):
raise RuntimeError('Expected an integral value, got %s' % type(thing))
def readToFirstZero(self, base, tsize, maximum):
def readToFirstZero(self, base, typesize, maximum):
self.checkIntType(base)
self.checkIntType(tsize)
self.checkIntType(typesize)
self.checkIntType(maximum)
code = self.packCode + (None, 'b', 'H', None, 'I')[tsize]
code = self.packCode + (None, 'b', 'H', None, 'I')[typesize]
#blob = self.readRawMemory(base, 1)
blob = bytes()
while maximum > 1:
@@ -916,8 +915,8 @@ class DumperBase():
maximum = int(maximum / 2)
self.warn('REDUCING READING MAXIMUM TO %s' % maximum)
#DumperBase.warn('BASE: 0x%x TSIZE: %s MAX: %s' % (base, tsize, maximum))
for i in range(0, maximum, tsize):
#DumperBase.warn('BASE: 0x%x TSIZE: %s MAX: %s' % (base, typesize, maximum))
for i in range(0, maximum, typesize):
t = struct.unpack_from(code, blob, i)[0]
if t == 0:
return 0, i, self.hexencode(blob[:i])
@@ -925,9 +924,9 @@ class DumperBase():
# Real end is unknown.
return -1, maximum, self.hexencode(blob[:maximum])
def encodeCArray(self, p, tsize, limit):
elided, shown, blob = self.readToFirstZero(p, tsize, limit)
return elided, blob
def encodeCArray(self, p, typesize, limit):
length, shown, blob = self.readToFirstZero(p, typesize, limit)
return length, blob
def putItemCount(self, count, maximum=1000000000):
# This needs to override the default value, so don't use 'put' directly.
@@ -1043,12 +1042,12 @@ class DumperBase():
self.currentType.value = typish.name
self.currentType.priority = priority
def putValue(self, value, encoding=None, priority=0, elided=None):
def putValue(self, value, encoding=None, priority=0, length=None):
# Higher priority values override lower ones.
# elided = 0 indicates all data is available in value,
# length = None indicates all data is available in value,
# otherwise it's the true length.
if priority >= self.currentValue.priority:
self.currentValue = ReportItem(value, encoding, priority, elided)
self.currentValue = ReportItem(value, encoding, priority, length)
def putSpecialValue(self, encoding, value='', children=None):
self.putValue(value, encoding)
@@ -1226,13 +1225,13 @@ class DumperBase():
return False
def putSimpleCharArray(self, base, size=None):
if size is None:
elided, shown, data = self.readToFirstZero(base, 1, self.displayStringLimit)
def putSimpleCharArray(self, base, length=None):
if length is None:
length, shown, data = self.readToFirstZero(base, 1, self.displayStringLimit)
else:
elided, shown = self.computeLimit(int(size), self.displayStringLimit)
shown = self.computeLimit(length)
data = self.readMemory(base, shown)
self.putValue(data, 'latin1', elided=elided)
self.putValue(data, 'latin1', length=length)
def putDisplay(self, editFormat, value):
self.putField('editformat', editFormat)
@@ -1248,8 +1247,8 @@ class DumperBase():
if targetType.name in ('char', 'signed char', 'unsigned char', 'uint8_t', 'CHAR'):
# Use UTF-8 as default for char *.
self.putType(typeName)
(elided, shown, data) = self.readToFirstZero(ptr, 1, limit)
self.putValue(data, 'utf8', elided=elided)
(length, shown, data) = self.readToFirstZero(ptr, 1, limit)
self.putValue(data, 'utf8', length=length)
if self.isExpanded():
self.putArrayData(ptr, shown, innerType)
return True
@@ -1257,55 +1256,55 @@ class DumperBase():
if targetType.name in ('wchar_t', 'WCHAR'):
self.putType(typeName)
charSize = self.lookupType('wchar_t').size()
(elided, data) = self.encodeCArray(ptr, charSize, limit)
(length, data) = self.encodeCArray(ptr, charSize, limit)
if charSize == 2:
self.putValue(data, 'utf16', elided=elided)
self.putValue(data, 'utf16', length=length)
else:
self.putValue(data, 'ucs4', elided=elided)
self.putValue(data, 'ucs4', length=length)
return True
if displayFormat == DisplayFormat.Latin1String:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'latin1', elided=elided)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'latin1', length=length)
return True
if displayFormat == DisplayFormat.SeparateLatin1String:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'latin1', elided=elided)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'latin1', length=length)
self.putDisplay('latin1:separate', data)
return True
if displayFormat == DisplayFormat.Utf8String:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'utf8', elided=elided)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'utf8', length=length)
return True
if displayFormat == DisplayFormat.SeparateUtf8String:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'utf8', elided=elided)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'utf8', length=length)
self.putDisplay('utf8:separate', data)
return True
if displayFormat == DisplayFormat.Local8BitString:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'local8bit', elided=elided)
(length, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'local8bit', length=length)
return True
if displayFormat == DisplayFormat.Utf16String:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 2, limit)
self.putValue(data, 'utf16', elided=elided)
(length, data) = self.encodeCArray(ptr, 2, limit)
self.putValue(data, 'utf16', length=length)
return True
if displayFormat == DisplayFormat.Ucs4String:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 4, limit)
self.putValue(data, 'ucs4', elided=elided)
(length, data) = self.encodeCArray(ptr, 4, limit)
self.putValue(data, 'ucs4', length=length)
return True
return False
@@ -2577,17 +2576,17 @@ class DumperBase():
def extractQStringFromQDataStream(self, buf, offset):
""" Read a QString from the stream """
size = struct.unpack_from('!I', buf, offset)[0]
length = struct.unpack_from('!I', buf, offset)[0]
offset += 4
string = buf[offset:offset + size].decode('utf-16be')
return (string, offset + size)
string = buf[offset:offset + length].decode('utf-16be')
return (string, offset + length)
def extractQByteArrayFromQDataStream(self, buf, offset):
""" Read a QByteArray from the stream """
size = struct.unpack_from('!I', buf, offset)[0]
length = struct.unpack_from('!I', buf, offset)[0]
offset += 4
string = buf[offset:offset + size].decode('latin1')
return (string, offset + size)
string = buf[offset:offset + length].decode('latin1')
return (string, offset + length)
def extractIntFromQDataStream(self, buf, offset):
""" Read an int from the stream """

View File

@@ -28,46 +28,46 @@ def qform__QByteArray():
def qedit__QByteArray(d, value, data):
d.call('void', value, 'resize', str(len(data)))
(base, size, alloc) = d.stringData(value)
(base, length, alloc) = d.stringData(value)
d.setValues(base, 'char', [ord(c) for c in data])
def qdump__QByteArray(d, value):
if d.qtVersion() >= 0x60000:
dd, data, size = value.split('ppi')
dd, data, length = value.split('ppi')
if dd:
_, _, alloc = d.split('iii', dd)
else: # fromRawData
alloc = size
alloc = length
else:
data, size, alloc = d.qArrayData(value)
data, length, alloc = d.qArrayData(value)
d.check(alloc == 0 or (0 <= size and size <= alloc and alloc <= 100000000))
if size > 0:
d.check(alloc == 0 or (0 <= length and length <= alloc and alloc <= 100000000))
if length > 0:
d.putExpandable()
elided, shown = d.computeLimit(size, d.displayStringLimit)
shown = d.computeLimit(length, d.displayStringLimit)
p = d.readMemory(data, shown)
displayFormat = d.currentItemFormat()
if displayFormat == DisplayFormat.Automatic or displayFormat == DisplayFormat.Latin1String:
d.putValue(p, 'latin1', elided=elided)
d.putValue(p, 'latin1', length=length)
elif displayFormat == DisplayFormat.SeparateLatin1String:
d.putValue(p, 'latin1', elided=elided)
d.putValue(p, 'latin1', length=length)
d.putDisplay('latin1:separate', d.encodeByteArray(value, limit=100000))
elif displayFormat == DisplayFormat.Utf8String:
d.putValue(p, 'utf8', elided=elided)
d.putValue(p, 'utf8', length=length)
elif displayFormat == DisplayFormat.SeparateUtf8String:
d.putValue(p, 'utf8', elided=elided)
d.putValue(p, 'utf8', length=length)
d.putDisplay('utf8:separate', d.encodeByteArray(value, limit=100000))
if d.isExpanded():
d.putArrayData(data, size, d.charType())
d.putArrayData(data, length, d.charType())
#def qdump__QArrayData(d, value):
# data, size, alloc = d.qArrayDataHelper(value.address())
# d.check(alloc == 0 or (0 <= size and size <= alloc and alloc <= 100000000))
# d.putValue(d.readMemory(data, size), 'latin1')
# data, length, alloc = d.qArrayDataHelper(value.address())
# d.check(alloc == 0 or (0 <= length and length <= alloc and alloc <= 100000000))
# d.putValue(d.readMemory(data, length), 'latin1')
# d.putPlainChildren(value)
@@ -81,10 +81,10 @@ def qdump__QBitArray(d, value):
else:
data, basize, _ = d.qArrayData(value['d'])
unused = d.extractByte(data) if data else 0
size = basize * 8 - unused
d.putItemCount(size)
length = basize * 8 - unused
d.putItemCount(length)
if d.isExpanded():
with Children(d, size, maxNumChild=10000):
with Children(d, length, maxNumChild=10000):
for i in d.childRange():
q = data + 1 + int(i / 8)
with SubItem(d, i):
@@ -1621,17 +1621,17 @@ def qdumpHelper_QSet45(d, value):
ptrSize = d.ptrSize()
dptr = d.extractPointer(value)
(fakeNext, buckets, ref, size, nodeSize, userNumBits, numBits, numBuckets) = \
(fakeNext, buckets, ref, length, nodeSize, userNumBits, numBits, numBuckets) = \
d.split('ppiiihhi', dptr)
d.check(0 <= size and size <= 100 * 1000 * 1000)
d.check(0 <= length and length <= 100 * 1000 * 1000)
d.check(-1 <= ref and ref < 100000)
d.putItemCount(size)
d.putItemCount(length)
if d.isExpanded():
keyType = value.type[0]
isShort = d.qtVersion() < 0x050000 and keyType.name == 'int'
with Children(d, size, childType=keyType):
with Children(d, length, childType=keyType):
node = hashDataFirstNode()
for i in d.childRange():
if isShort:
@@ -1714,15 +1714,15 @@ def qdump__QStack(d, value):
def qdump__QPolygonF(d, value):
data, size = d.vectorData(value)
d.putItemCount(size)
d.putPlotData(data, size, d.createType('@QPointF'))
data, length = d.vectorData(value)
d.putItemCount(length)
d.putPlotData(data, length, d.createType('@QPointF'))
def qdump__QPolygon(d, value):
data, size = d.vectorData(value)
d.putItemCount(size)
d.putPlotData(data, size, d.createType('@QPoint'))
data, length = d.vectorData(value)
d.putItemCount(length)
d.putPlotData(data, length, d.createType('@QPoint'))
def qdump__QGraphicsPolygonItem(d, value):
@@ -1741,14 +1741,14 @@ def qdump__QGraphicsPolygonItem(d, value):
offset = 328 if d.isMsvcTarget() else 320
else:
offset = 308
data, size = d.vectorData(dptr + offset)
d.putItemCount(size)
d.putPlotData(data, size, d.createType('@QPointF'))
data, length = d.vectorData(dptr + offset)
d.putItemCount(length)
d.putPlotData(data, length, d.createType('@QPointF'))
def qedit__QString(d, value, data):
d.call('void', value, 'resize', str(len(data)))
(base, size, alloc) = d.stringData(value)
(base, length, alloc) = d.stringData(value)
d.setValues(base, 'short', [ord(c) for c in data])
@@ -1758,14 +1758,14 @@ def qform__QString():
def qdump__QString(d, value):
d.putStringValue(value)
data, size, _ = d.stringData(value)
data, length, _ = d.stringData(value)
displayFormat = d.currentItemFormat()
if displayFormat == DisplayFormat.Separate:
d.putDisplay('utf16:separate', d.encodeString(value, limit=100000))
if (size > 0):
if (length > 0):
d.putExpandable()
if d.isExpanded():
d.putArrayData(data, size, d.createType('@QChar'))
d.putArrayData(data, length, d.createType('@QChar'))
def qdump__QSettingsKey(d, value):
@@ -1774,8 +1774,8 @@ def qdump__QSettingsKey(d, value):
def qdump__QStaticStringData(d, value):
size = value.type[0]
(ref, size, alloc, pad, offset, data) = value.split('iii@p%ss' % (2 * size))
length = value.type[0]
(ref, length, alloc, pad, offset, data) = value.split('iii@p%ss' % (2 * length))
d.putValue(d.hexencode(data), 'utf16')
d.putPlainChildren(value)
@@ -1788,28 +1788,28 @@ def qdump__QTypedArrayData(d, value):
def qdump__QStringData(d, value):
(ref, size, alloc, pad, offset) = value.split('III@p')
elided, shown = d.computeLimit(size, d.displayStringLimit)
(ref, length, alloc, pad, offset) = value.split('III@p')
shown = d.computeLimit(length, d.displayStringLimit)
data = d.readMemory(value.address() + offset, shown * 2)
d.putValue(data, 'utf16', elided=elided)
d.putValue(data, 'utf16', length=length)
d.putPlainChildren(value)
def qdump__QAnyStringView(d, value):
data, size = value.split('pp')
data, length = value.split('pp')
bits = d.ptrSize() * 8 - 2
tag = size >> bits
size = size & (2**bits - 1)
elided, shown = d.computeLimit(size, d.displayStringLimit)
tag = length >> bits
length = length & (2**bits - 1)
shown = d.computeLimit(length, d.displayStringLimit)
if tag == 0:
mem = d.readMemory(data, shown)
d.putValue(mem, 'utf8', elided=elided)
d.putValue(mem, 'utf8', length=length)
elif tag == 1:
mem = d.readMemory(data, shown)
d.putValue(mem, 'latin1', elided=elided)
d.putValue(mem, 'latin1', length=length)
elif tag == 2:
mem = d.readMemory(data, shown * 2)
d.putValue(mem, 'utf16', elided=elided)
d.putValue(mem, 'utf16', length=length)
else:
d.putSpecialValue('empty')
d.putPlainChildren(value)
@@ -1825,16 +1825,15 @@ def qdump__QStringView(d, value):
if idata == 0:
d.putValue('(null)')
return
size = value['m_size']
isize = size.integer()
elided, shown = d.computeLimit(isize, d.displayStringLimit)
length = value['m_size'].integer()
shown = d.computeLimit(length, d.displayStringLimit)
mem = d.readMemory(idata, shown * 2)
d.putValue(mem, 'utf16', elided=elided)
d.putValue(mem, 'utf16', length=length)
if d.currentItemFormat() == DisplayFormat.Separate:
d.putDisplay('utf16:separate', mem)
d.putExpandable()
if d.isExpanded():
d.putArrayData(idata, isize, d.createType('char16_t'))
d.putArrayData(idata, length, d.createType('char16_t'))
def qdump__QHashedString(d, value):
@@ -1848,12 +1847,12 @@ def qdump__QQmlRefCount(d, value):
def qdump__QStringRef(d, value):
(stringptr, pos, size) = value.split('pii')
(stringptr, pos, length) = value.split('pii')
if stringptr == 0:
d.putValue('(null)')
return
data, ssize, alloc = d.stringData(d.createValue(stringptr, '@QString'))
d.putValue(d.readMemory(data + 2 * pos, 2 * size), 'utf16')
d.putValue(d.readMemory(data + 2 * pos, 2 * length), 'utf16')
d.putPlainChildren(value)
@@ -1937,7 +1936,7 @@ def qdump__QUrl(d, value):
userNameEnc = d.encodeString(userName)
hostEnc = d.encodeString(host)
elided, pathEnc = d.encodeStringHelper(path, d.displayStringLimit)
length, pathEnc = d.encodeStringHelper(path, d.displayStringLimit)
url = d.encodeString(scheme)
url += '3a002f002f00' # '://'
if len(userNameEnc):
@@ -1946,7 +1945,7 @@ def qdump__QUrl(d, value):
if port >= 0:
url += '3a00' + ''.join(['%02x00' % ord(c) for c in str(port)])
url += pathEnc
d.putValue(url, 'utf16', elided=elided)
d.putValue(url, 'utf16', length=length)
displayFormat = d.currentItemFormat()
if displayFormat == DisplayFormat.Separate:
@@ -2162,7 +2161,7 @@ def qdumpHelper__QVariant6(d, value):
qdumpHelper_QVariant_0(d, value)
return
revision, alignment, size, flags, variantType, metaObjectPtr, name = \
revision, alignment, length, flags, variantType, metaObjectPtr, name = \
d.split('HHIIIpp', metaTypeInterface)
# Well-known simple type.
@@ -2241,7 +2240,7 @@ def qdumpHelper__QVariant45(d, value):
base1 = d.extractPointer(value)
#DumperBase.warn('BASE 1: %s %s' % (base1, innert))
base = d.extractPointer(base1)
#DumperBase.warn('SIZE 1: %s' % size)
#DumperBase.warn('SIZE 1: %s' % length)
val = d.createValue(base, innerType)
else:
#DumperBase.warn('DIRECT ITEM 1: %s' % innerType)
@@ -2268,7 +2267,7 @@ def qdumpHelper__QVariant45(d, value):
d.putSpecialValue('notcallable')
return None
ptr = p.pointer()
(elided, blob) = d.encodeCArray(ptr, 1, 100)
(_, blob) = d.encodeCArray(ptr, 1, 100)
innerType = d.hexdecode(blob)
# Prefer namespaced version.
@@ -2303,34 +2302,34 @@ def qform__QVector():
def qdump__QVector(d, value):
if d.qtVersion() >= 0x060000:
data, size = d.listData(value)
d.putItemCount(size)
d.putPlotData(data, size, d.createType(value.type.ltarget[0]))
data, length = d.listData(value)
d.putItemCount(length)
d.putPlotData(data, length, d.createType(value.type.ltarget[0]))
# g++ 9.3 does not add the template parameter list to the debug info.
# Fake it for the common case:
if value.type.name == d.qtNamespace() + "QVector":
d.putBetterType(value.type.name + '<' + value.type.ltarget[0].name + '>')
else:
data, size = d.vectorData(value)
d.putItemCount(size)
d.putPlotData(data, size, d.createType(value.type[0]))
data, length = d.vectorData(value)
d.putItemCount(length)
d.putPlotData(data, length, d.createType(value.type[0]))
if False:
def qdump__QObjectConnectionList(d, value):
data, size = d.vectorData(value)
d.putItemCount(size)
d.putPlotData(data, size, d.createType('@QObjectPrivate::ConnectionList'))
data, length = d.vectorData(value)
d.putItemCount(length)
d.putPlotData(data, length, d.createType('@QObjectPrivate::ConnectionList'))
def qdump__QVarLengthArray(d, value):
if d.qtVersion() >= 0x060000:
cap, size, data = value.split('QQp')
cap, length, data = value.split('QQp')
else:
cap, size, data = value.split('iip')
d.check(0 <= size)
d.putItemCount(size)
d.putPlotData(data, size, value.type[0])
cap, length, data = value.split('iip')
d.check(0 <= length)
d.putItemCount(length)
d.putPlotData(data, length, value.type[0])
def qdump__QSharedPointer(d, value):
@@ -2401,20 +2400,20 @@ def qdump__QXmlAttributes(d, value):
def qdump__QXmlStreamStringRef(d, value):
s = value['m_string']
(data, size, alloc) = d.stringData(s)
(data, length, alloc) = d.stringData(s)
data += 2 * int(value['m_position'])
size = int(value['m_size'])
s = d.readMemory(data, 2 * size)
length = int(value['m_size'])
s = d.readMemory(data, 2 * length)
d.putValue(s, 'utf16')
d.putPlainChildren(value)
def qdump__QXmlStreamAttribute(d, value):
s = value['m_name']['m_string']
(data, size, alloc) = d.stringData(s)
(data, length, alloc) = d.stringData(s)
data += 2 * int(value['m_name']['m_position'])
size = int(value['m_name']['m_size'])
s = d.readMemory(data, 2 * size)
length = int(value['m_name']['m_size'])
s = d.readMemory(data, 2 * length)
d.putValue(s, 'utf16')
d.putPlainChildren(value)
@@ -2505,8 +2504,8 @@ def qdump__QV4__ExecutionContext(d, value):
def qdump__QQmlSourceLocation(d, value):
(sourceFile, line, col) = value.split('pHH')
(data, size, alloc) = d.stringData(value)
d.putValue(d.readMemory(data, 2 * size), 'utf16')
(data, length, alloc) = d.stringData(value)
d.putValue(d.readMemory(data, 2 * length), 'utf16')
d.putField('valuesuffix', ':%s:%s' % (line, col))
d.putPlainChildren(value)
@@ -3345,9 +3344,7 @@ def qdump__QJsonValue(d, value):
return
if t == 3:
d.putType('QJsonValue (String)')
string = value.split('{@QString}')[0]
elided, base = d.encodeString(string, d.displayStringLimit)
d.putValue(base, 'utf16', elided=elided)
d.putStringValue(value.split('{@QString}')[0])
return
if t == 4:
d.putType('QJsonValue (Array)')
@@ -3472,9 +3469,9 @@ def qdumpHelper_QCbor_string(d, container_ptr, element_index, is_bytes):
bytedata_len = d.extractInt(bytedata)
bytedata_data = bytedata + 4 # sizeof(QtCbor::ByteData) header part
elided, shown = d.computeLimit(bytedata_len, d.displayStringLimit)
shown = d.computeLimit(bytedata_len, d.displayStringLimit)
res = d.readMemory(bytedata_data, shown)
d.putValue(res, enc, elided=elided)
d.putValue(res, enc, length=bytedata_len)
def qdumpHelper_QCborArray_valueAt(d, container_ptr, elements_data_ptr, idx, bytedata, is_cbor):

View File

@@ -3,7 +3,6 @@ add_qtc_library(Nanotrace
SOURCES
nanotraceglobals.h
nanotrace.cpp nanotrace.h
nanotracehr.cpp nanotracehr.h
PUBLIC_DEPENDS Qt::Core Qt::Gui
PROPERTIES
CXX_VISIBILITY_PRESET default
@@ -16,3 +15,9 @@ extend_qtc_library(Nanotrace
CONDITION DESIGN_STUDIO_USE_NANOTRACE
PUBLIC_DEFINES NANOTRACE_DESIGNSTUDIO_ENABLED
)
option(NANOTRACEHR_ENABLED "Enables collecting high resolution performance data" OFF)
extend_qtc_library(Nanotrace
SOURCES
nanotracehr.cpp nanotracehr.h
)

View File

@@ -34,7 +34,7 @@ enum class Tracing { IsDisabled, IsEnabled };
constexpr Tracing tracingStatus()
{
#ifdef NANOTRACE_ENABLED
#ifdef NANOTRACEHR_ENABLED
return Tracing::IsEnabled;
#else
return Tracing::IsDisabled;
@@ -1569,7 +1569,7 @@ template<typename Category, typename... Arguments>
Tracer(typename Category::ArgumentType name, Category &category, Arguments &&...)
-> Tracer<Category, typename Category::IsActive>;
#ifdef NANOTRACE_ENABLED
#ifdef NANOTRACEHR_ENABLED
class GlobalTracer
{
public:

View File

@@ -19,7 +19,20 @@ void NetworkQuery::start()
emit done(DoneResult::Error);
return;
}
switch (m_operation) {
case NetworkOperation::Get:
m_reply.reset(m_manager->get(m_request));
break;
case NetworkOperation::Put:
m_reply.reset(m_manager->put(m_request, m_writeData));
break;
case NetworkOperation::Post:
m_reply.reset(m_manager->post(m_request, m_writeData));
break;
case NetworkOperation::Delete:
m_reply.reset(m_manager->deleteResource(m_request));
break;
}
connect(m_reply.get(), &QNetworkReply::finished, this, [this] {
disconnect(m_reply.get(), &QNetworkReply::finished, this, nullptr);
emit done(toDoneResult(m_reply->error() == QNetworkReply::NoError));

View File

@@ -22,6 +22,8 @@ namespace Tasking {
// is independent on Qt::Network.
// Possibly, it could be placed inside Qt::Network library, as a wrapper around QNetworkReply.
enum class NetworkOperation { Get, Put, Post, Delete };
class TASKING_EXPORT NetworkQuery final : public QObject
{
Q_OBJECT
@@ -29,6 +31,8 @@ class TASKING_EXPORT NetworkQuery final : public QObject
public:
~NetworkQuery();
void setRequest(const QNetworkRequest &request) { m_request = request; }
void setOperation(NetworkOperation operation) { m_operation = operation; }
void setWriteData(const QByteArray &data) { m_writeData = data; }
void setNetworkAccessManager(QNetworkAccessManager *manager) { m_manager = manager; }
QNetworkReply *reply() const { return m_reply.get(); }
void start();
@@ -39,6 +43,8 @@ signals:
private:
QNetworkRequest m_request;
NetworkOperation m_operation = NetworkOperation::Get;
QByteArray m_writeData; // Used by Put and Post
QNetworkAccessManager *m_manager = nullptr;
std::unique_ptr<QNetworkReply> m_reply;
};

View File

@@ -420,6 +420,7 @@ void TerminalInterface::start()
connect(d->stubConnectTimeoutTimer.get(), &QTimer::timeout, this, [this] {
killInferiorProcess();
killStubProcess();
emitFinished(-1, QProcess::ExitStatus::CrashExit);
});
d->stubConnectTimeoutTimer->setSingleShot(true);
d->stubConnectTimeoutTimer->start(10000);

View File

@@ -266,8 +266,8 @@ static QUrl urlForProject(const QString &projectName)
}
static constexpr int httpStatusCodeOk = 200;
static const QLatin1String jsonContentType{ "application/json" };
static const QLatin1String htmlContentType{ "text/html" };
constexpr char s_htmlContentType[] = "text/html";
constexpr char s_jsonContentType[] = "application/json";
static Group fetchHtmlRecipe(const QUrl &url, const std::function<void(const QByteArray &)> &handler)
{
@@ -284,15 +284,11 @@ static Group fetchHtmlRecipe(const QUrl &url, const std::function<void(const QBy
const auto onQuerySetup = [storage, url](NetworkQuery &query) {
QNetworkRequest request(url);
request.setRawHeader(QByteArrayLiteral("Accept"),
QByteArray(htmlContentType.data(), htmlContentType.size()));
request.setRawHeader(QByteArrayLiteral("Authorization"),
storage->credentials);
const QByteArray ua = QByteArrayLiteral("Axivion")
+ QCoreApplication::applicationName().toUtf8()
+ QByteArrayLiteral("Plugin/")
+ QCoreApplication::applicationVersion().toUtf8();
request.setRawHeader(QByteArrayLiteral("X-Axivion-User-Agent"), ua);
request.setRawHeader("Accept", s_htmlContentType);
request.setRawHeader("Authorization", storage->credentials);
const QByteArray ua = "Axivion" + QCoreApplication::applicationName().toUtf8() +
"Plugin/" + QCoreApplication::applicationVersion().toUtf8();
request.setRawHeader("X-Axivion-User-Agent", ua);
query.setRequest(request);
query.setNetworkAccessManager(&dd->m_networkAccessManager);
};
@@ -307,11 +303,10 @@ static Group fetchHtmlRecipe(const QUrl &url, const std::function<void(const QBy
.trimmed()
.toLower();
if (doneWith == DoneWith::Success && statusCode == httpStatusCodeOk
&& contentType == htmlContentType) {
&& contentType == s_htmlContentType) {
handler(reply->readAll());
return DoneResult::Success;
}
return DoneResult::Error;
};
@@ -340,22 +335,19 @@ static Group fetchDataRecipe(const QUrl &url,
storage->credentials = QByteArrayLiteral("AxToken ") + settings().server.token.toUtf8();
};
const auto onQuerySetup = [storage, url](NetworkQuery &query) {
const auto onNetworkQuerySetup = [storage, url](NetworkQuery &query) {
QNetworkRequest request(url);
request.setRawHeader(QByteArrayLiteral("Accept"),
QByteArray(jsonContentType.data(), jsonContentType.size()));
request.setRawHeader(QByteArrayLiteral("Authorization"),
storage->credentials);
const QByteArray ua = QByteArrayLiteral("Axivion")
+ QCoreApplication::applicationName().toUtf8()
+ QByteArrayLiteral("Plugin/")
+ QCoreApplication::applicationVersion().toUtf8();
request.setRawHeader(QByteArrayLiteral("X-Axivion-User-Agent"), ua);
request.setRawHeader("Accept", s_jsonContentType);
request.setRawHeader("Authorization", storage->credentials);
const QByteArray ua = "Axivion" + QCoreApplication::applicationName().toUtf8() +
"Plugin/" + QCoreApplication::applicationVersion().toUtf8();
request.setRawHeader("X-Axivion-User-Agent", ua);
query.setRequest(request);
query.setNetworkAccessManager(&dd->m_networkAccessManager);
return SetupResult::Continue;
};
const auto onQueryDone = [storage, url](const NetworkQuery &query, DoneWith doneWith) {
const auto onNetworkQueryDone = [storage, url](const NetworkQuery &query, DoneWith doneWith) {
QNetworkReply *reply = query.reply();
const QNetworkReply::NetworkError error = reply->error();
const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
@@ -366,13 +358,13 @@ static Group fetchDataRecipe(const QUrl &url,
.trimmed()
.toLower();
if (doneWith == DoneWith::Success && statusCode == httpStatusCodeOk
&& contentType == jsonContentType) {
&& contentType == s_jsonContentType) {
storage->serializableData = reply->readAll();
return DoneResult::Success;
}
const auto getError = [&]() -> Error {
if (contentType == jsonContentType) {
if (contentType == s_jsonContentType) {
try {
return DashboardError(reply->url(), statusCode,
reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(),
@@ -389,8 +381,7 @@ static Group fetchDataRecipe(const QUrl &url,
return NetworkError(reply->url(), error, reply->errorString());
};
MessageManager::writeFlashing(
QStringLiteral("Axivion: %1").arg(getError().message()));
MessageManager::writeFlashing(QStringLiteral("Axivion: %1").arg(getError().message()));
return DoneResult::Error;
};
@@ -411,7 +402,7 @@ static Group fetchDataRecipe(const QUrl &url,
const Group recipe {
storage,
Sync(onCredentialSetup),
NetworkQueryTask(onQuerySetup, onQueryDone),
NetworkQueryTask(onNetworkQuerySetup, onNetworkQueryDone),
AsyncTask<SerializableType>(onDeserializeSetup, onDeserializeDone)
};

View File

@@ -323,6 +323,10 @@ void CppEditorPlugin::addPerSymbolActions()
switchDeclDef.setTouchBarText(Tr::tr("Decl/Def", "text on macOS touch bar"));
switchDeclDef.addToContainers(menus, Constants::G_SYMBOL);
switchDeclDef.addToContainer(Core::Constants::TOUCH_BAR, Core::Constants::G_TOUCHBAR_NAVIGATION);
switchDeclDef.addOnTriggered(this, [] {
if (CppEditorWidget *editorWidget = currentCppEditorWidget())
editorWidget->switchDeclarationDefinition(/*inNextSplit*/ false);
});
ActionBuilder openDeclDefSplit(this, Constants::OPEN_DECLARATION_DEFINITION_IN_NEXT_SPLIT);
openDeclDefSplit.setText(Tr::tr("Open Function Declaration/Definition in Next Split"));

View File

@@ -151,8 +151,8 @@ QString WatchItem::toString() const
if (!value.isEmpty())
str << "value=\"" << value << doubleQuoteComma;
if (elided)
str << "valueelided=\"" << elided << doubleQuoteComma;
if (valuelen)
str << "valuelen=\"" << valuelen << doubleQuoteComma;
if (!editvalue.isEmpty())
str << "editvalue=\"<...>\",";
@@ -300,9 +300,9 @@ void WatchItem::parseHelper(const GdbMi &input, bool maySort)
if (mi.isValid())
id = mi.toInt();
mi = input["valueelided"];
mi = input["valuelen"];
if (mi.isValid())
elided = mi.toInt();
valuelen = mi.toInt();
mi = input["bitpos"];
if (mi.isValid())

View File

@@ -72,7 +72,7 @@ public:
uint bitsize = 0; // Size in case of bit fields
uint autoDerefCount = 0; // number of levels of automatic dereferencing that has taken place (for pointer types)
uint variablesReference = 0;// reference to the variable in the variables request DAP related
int elided = 0; // Full size if value was cut off, -1 if cut on unknown size, 0 otherwise
int valuelen = 0; // -1 if cut on unknown size, full size otherwise
int arrayIndex = -1; // -1 if not an array member
uchar sortGroup = 0; // 0 - ordinary member, 1 - vptr, 2 - base class
bool wantsChildren = false;

View File

@@ -818,14 +818,24 @@ static QString formattedValue(const WatchItem *item)
return reformatInteger(integer, format, item->size, false);
}
if (item->elided) {
QString v = item->value;
const int maxLength = settings().displayStringLimit();
QString v = quoteUnprintable(item->value);
if (v.endsWith('"')) {
if (item->valuelen > maxLength) {
v.chop(1);
QString len = item->elided > 0 ? QString::number(item->elided) : "unknown length";
return quoteUnprintable(v) + "\"... (" + len + ')';
v.append("...\"");
}
if (item->valuelen > 0)
v += QString(" (%1)").arg(item->valuelen);
return v;
}
return quoteUnprintable(item->value);
if (v.size() > maxLength) {
v.truncate(maxLength);
v += QLatin1String("...");
}
return v;
}
// Get a pointer address from pointer values reported by the debugger.
@@ -886,18 +896,6 @@ QVariant WatchItem::editValue() const
return QVariant(quoteUnprintable(stringValue));
}
// Truncate value for item view, maintaining quotes.
static QString truncateValue(QString v)
{
enum { maxLength = 512 };
if (v.size() < maxLength)
return v;
const bool isQuoted = v.endsWith('"'); // check for 'char* "Hallo"'
v.truncate(maxLength);
v += QLatin1String(isQuoted ? "...\"" : "...");
return v;
}
static QString displayName(const WatchItem *item)
{
QString result;
@@ -939,13 +937,9 @@ static QString displayName(const WatchItem *item)
return result;
}
void WatchItem::updateValueCache() const
{
QString formatted = truncateValue(formattedValue(this));
if (formatted.endsWith('"'))
formatted.append(QString(" (%1)").arg(this->value.length() - 2));
valueCache = formatted;
valueCache = formattedValue(this);
valueCache = watchModel(this)->removeNamespaces(valueCache);
if (valueCache.isEmpty() && this->address)
valueCache += QString::fromLatin1("@0x" + QByteArray::number(this->address, 16));
@@ -1303,7 +1297,7 @@ Qt::ItemFlags WatchModel::flags(const QModelIndex &idx) const
// FIXME: Forcing types is not implemented yet.
//if (idx.column() == 2)
// return editable; // Watcher types can be set by force.
if (column == ValueColumn && item->valueEditable && !item->elided)
if (column == ValueColumn && item->valueEditable && item->valuelen >= 0)
return editable; // Watcher values are sometimes editable.
}
} else if (item->isLocal()) {
@@ -1311,7 +1305,7 @@ Qt::ItemFlags WatchModel::flags(const QModelIndex &idx) const
return notEditable;
if (isRunning && !m_engine->hasCapability(AddWatcherWhileRunningCapability))
return notEditable;
if (column == ValueColumn && item->valueEditable && !item->elided)
if (column == ValueColumn && item->valueEditable && item->valuelen >= 0)
return editable; // Locals values are sometimes editable.
if (column == ValueColumn && item->arrayIndex >= 0)
return editable;

View File

@@ -1007,7 +1007,7 @@ LinuxDevice::LinuxDevice()
setOpenTerminal([this](const Environment &env,
const FilePath &workingDir) -> expected_str<void> {
Process proc;
Process *proc = new Process;
// If we will not set any environment variables, we can leave out the shell executable
// as the "ssh ..." call will automatically launch the default shell if there are
@@ -1015,11 +1015,19 @@ LinuxDevice::LinuxDevice()
// specify the shell executable.
const QString shell = env.hasChanges() ? env.value_or("SHELL", "/bin/sh") : QString();
proc.setCommand({filePath(shell), {}});
proc.setTerminalMode(TerminalMode::Detached);
proc.setEnvironment(env);
proc.setWorkingDirectory(workingDir);
proc.start();
proc->setCommand({filePath(shell), {}});
proc->setTerminalMode(TerminalMode::Run);
proc->setEnvironment(env);
proc->setWorkingDirectory(workingDir);
proc->start();
QObject::connect(proc, &Process::done, proc, [proc](){
if (proc->exitCode() != 0){
qCWarning(linuxDeviceLog) << proc->exitMessage();
Core::MessageManager::writeFlashing(proc->exitMessage());
}
proc->deleteLater();
});
return {};
});