Merge "Merge remote-tracking branch 'origin/4.5'"

This commit is contained in:
Eike Ziller
2017-11-21 13:11:05 +00:00
committed by The Qt Project
26 changed files with 201 additions and 42 deletions

58
dist/changes-4.5.0.md vendored
View File

@@ -14,10 +14,13 @@ General
* Changed `File System` pane to tree view with top level directory selectable * Changed `File System` pane to tree view with top level directory selectable
from `Computer`, `Home`, `Projects`, and individual project root directories from `Computer`, `Home`, `Projects`, and individual project root directories
(QTCREATORBUG-8305) (QTCREATORBUG-8305)
* Fixed crash when closing Qt Creator while searching for updates
(QTCREATORBUG-19165)
Editing Editing
* Added shortcut for sorting selected lines * Added `Edit` > `Advanced` > `Sort Selected Lines`, replacing `Tools` >
`External` > `Text` > `Sort Selection`
All Projects All Projects
@@ -25,12 +28,27 @@ All Projects
* Added support for changing the maximum number of lines shown in compile output * Added support for changing the maximum number of lines shown in compile output
(QTCREATORBUG-2200) (QTCREATORBUG-2200)
QMake Projects
* Fixed support of wildcards in `INSTALLS` variable (QTCREATORBUG-17935)
* Fixed that `QMAKE_CFLAGS` was not passed to code model
CMake Projects CMake Projects
* Added groups to CMake configuration UI * Added groups to CMake configuration UI
* Added option to change configuration variable types * Added option to change configuration variable types
* Added option to unset configuration variable
* Improved handling of CMake configuration changes on disk (QTCREATORBUG-17555)
* Improved simplified project tree (QTCREATORBUG-19040)
* Fixed that value was removed when renaming configuration variable * Fixed that value was removed when renaming configuration variable
(QTCREATORBUG-17926) (QTCREATORBUG-17926)
* Fixed that `PATH` environment was unnecessarily modified (QTCREATORBUG-18714)
* Fixed that QML errors in application output where not linked to the source
(QTCREATORBUG-18586)
Qbs Projects
* Fixed that custom `installRoot` was not saved (QTCREATORBUG-18895)
C++ Support C++ Support
@@ -39,6 +57,7 @@ C++ Support
* Fixed detection of macros defined by tool chain for `C` * Fixed detection of macros defined by tool chain for `C`
* Fixed that `Refactoring` context menu blocked UI while checking for available * Fixed that `Refactoring` context menu blocked UI while checking for available
actions actions
* Fixed crash when refactoring class with errors (QTCREATORBUG-19180)
* Clang Code Model * Clang Code Model
* Added sanity check to `Clang Code Model Warnings` option * Added sanity check to `Clang Code Model Warnings` option
(QTCREATORBUG-18864) (QTCREATORBUG-18864)
@@ -52,6 +71,7 @@ C++ Support
QML Support QML Support
* Added wizards with different starting UI layouts * Added wizards with different starting UI layouts
* Fixed that undo history was lost when reformatting file (QTCREATORBUG-18645)
Python Support Python Support
@@ -65,6 +85,11 @@ Debugging
* LLDB / macOS * LLDB / macOS
* Added pretty printing of Core Foundation and Foundation string-like types * Added pretty printing of Core Foundation and Foundation string-like types
(QTCREATORBUG-18638) (QTCREATORBUG-18638)
* CDB
* Fixed attaching to running process with command line arguments
(QTCREATORBUG-19034)
* QML
* Fixed changing values of ECMAScript strings (QTCREATORBUG-19032)
QML Profiler QML Profiler
@@ -73,11 +98,25 @@ QML Profiler
Qt Quick Designer Qt Quick Designer
* Added option to only show visible items in navigator * Added option to only show visible items in navigator
* Fixed crash in integrated code editor (QTCREATORBUG-19079)
* Fixed crash when Ctrl-clicking on newly refactored QML file
(QTCREATORBUG-19064)
* Fixed filtering in Library view (QTCREATORBUG-19054)
* Fixed `Cmd + Left` in integrated code editor on macOS (QTCREATORBUG-19272)
* Fixed crash with `Become Last Sibling` and multiline expressions
(QTCREATORBUG-19284)
Version Control Systems Version Control Systems
* Added query for saving modified files before opening commit editor * Added query for saving modified files before opening commit editor
(QTCREATORBUG-3857) (QTCREATORBUG-3857)
* Git
* Fixed issues with localized tool output (QTCREATORBUG-19017)
Test Integration
* Fixed issue with finding test target with CMake projects (QTCREATORBUG-17882,
QTCREATORBUG-18922, QTCREATORBUG-18932)
Beautifier Beautifier
@@ -98,6 +137,7 @@ Platform Specific
Windows Windows
* Fixed detection of Visual Studio Build Tools 2017 (QTCREATORBUG-19053)
* Fixed that environment variable keys were converted to upper case in build * Fixed that environment variable keys were converted to upper case in build
and run configurations (QTCREATORBUG-18915) and run configurations (QTCREATORBUG-18915)
@@ -111,8 +151,16 @@ Android
* Removed support for local deployment (QTBUG-62995) * Removed support for local deployment (QTBUG-62995)
* Removed support for Ant * Removed support for Ant
* Added UI for managing Android SDKs (QTCREATORBUG-18978)
* Improved Android settings
* Improved checks for minimum requirements of Android tools (QTCREATORBUG-18837) * Improved checks for minimum requirements of Android tools (QTCREATORBUG-18837)
iOS
* Fixed check for minimum Xcode version (QTCREATORBUG-18091)
* Fixed switching between simulator device types with Xcode 9
(QTCREATORBUG-19270)
Universal Windows Platform Universal Windows Platform
* Fixed deployment on Windows 10 Phone emulator * Fixed deployment on Windows 10 Phone emulator
@@ -122,19 +170,24 @@ Alessandro Portale
Alexander Volkov Alexander Volkov
Andre Hartmann Andre Hartmann
André Pönitz André Pönitz
Benjamin Terrier
Christian Kandeler Christian Kandeler
Christian Stenger Christian Stenger
Claus Steuer Claus Steuer
Daniel Trevitz Daniel Trevitz
David Schulz David Schulz
Donald Carr
Eike Ziller Eike Ziller
Filipe Azevedo
Friedemann Kleint Friedemann Kleint
Ivan Donchevskii Ivan Donchevskii
Jake Petroules Jake Petroules
Jaroslaw Kobus Jaroslaw Kobus
Jochen Becher Jochen Becher
Kai Köhne
Knud Dollereder Knud Dollereder
Laurent Montel Laurent Montel
Leena Miettinen
Marco Benelli Marco Benelli
Marco Bubke Marco Bubke
Mitch Curtis Mitch Curtis
@@ -145,6 +198,8 @@ Orgad Shaneh
Robert Löhning Robert Löhning
Ryuji Kakemizu Ryuji Kakemizu
Samuel Gaist Samuel Gaist
scootergrisen
Sergey Belyashov
Serhii Moroz Serhii Moroz
Thiago Macieira Thiago Macieira
Thomas Hartmann Thomas Hartmann
@@ -152,3 +207,4 @@ Tim Jenssen
Tobias Hunger Tobias Hunger
Ulf Hermann Ulf Hermann
Vikas Pachdha Vikas Pachdha
Viktor Kireev

View File

@@ -260,6 +260,7 @@ public:
BuildToolsMarker = 0x080, BuildToolsMarker = 0x080,
SdkToolsMarker = 0x100, SdkToolsMarker = 0x100,
PlatformToolsMarker = 0x200, PlatformToolsMarker = 0x200,
EmulatorToolsMarker = 0x400,
SectionMarkers = InstalledPackagesMarker | AvailablePackagesMarkers | AvailableUpdatesMarker SectionMarkers = InstalledPackagesMarker | AvailablePackagesMarkers | AvailableUpdatesMarker
}; };
@@ -278,6 +279,7 @@ private:
BuildTools *parseBuildToolsPackage(const QStringList &data) const; BuildTools *parseBuildToolsPackage(const QStringList &data) const;
SdkTools *parseSdkToolsPackage(const QStringList &data) const; SdkTools *parseSdkToolsPackage(const QStringList &data) const;
PlatformTools *parsePlatformToolsPackage(const QStringList &data) const; PlatformTools *parsePlatformToolsPackage(const QStringList &data) const;
EmulatorTools *parseEmulatorToolsPackage(const QStringList &data) const;
MarkerTag parseMarkers(const QString &line); MarkerTag parseMarkers(const QString &line);
MarkerTag m_currentSection = MarkerTag::None; MarkerTag m_currentSection = MarkerTag::None;
@@ -292,7 +294,8 @@ const std::map<SdkManagerOutputParser::MarkerTag, const char *> markerTags {
{SdkManagerOutputParser::MarkerTag::SystemImageMarker, "system-images"}, {SdkManagerOutputParser::MarkerTag::SystemImageMarker, "system-images"},
{SdkManagerOutputParser::MarkerTag::BuildToolsMarker, "build-tools"}, {SdkManagerOutputParser::MarkerTag::BuildToolsMarker, "build-tools"},
{SdkManagerOutputParser::MarkerTag::SdkToolsMarker, "tools"}, {SdkManagerOutputParser::MarkerTag::SdkToolsMarker, "tools"},
{SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"} {SdkManagerOutputParser::MarkerTag::PlatformToolsMarker, "platform-tools"},
{SdkManagerOutputParser::MarkerTag::EmulatorToolsMarker, "emulator"}
}; };
AndroidSdkManager::AndroidSdkManager(const AndroidConfig &config, QObject *parent): AndroidSdkManager::AndroidSdkManager(const AndroidConfig &config, QObject *parent):
@@ -543,6 +546,10 @@ void SdkManagerOutputParser::parsePackageData(MarkerTag packageMarker, const QSt
createPackage(&SdkManagerOutputParser::parsePlatformToolsPackage); createPackage(&SdkManagerOutputParser::parsePlatformToolsPackage);
break; break;
case MarkerTag::EmulatorToolsMarker:
createPackage(&SdkManagerOutputParser::parseEmulatorToolsPackage);
break;
case MarkerTag::PlatformMarker: case MarkerTag::PlatformMarker:
createPackage(&SdkManagerOutputParser::parsePlatform); createPackage(&SdkManagerOutputParser::parsePlatform);
break; break;
@@ -705,6 +712,22 @@ PlatformTools *SdkManagerOutputParser::parsePlatformToolsPackage(const QStringLi
return platformTools; return platformTools;
} }
EmulatorTools *SdkManagerOutputParser::parseEmulatorToolsPackage(const QStringList &data) const
{
EmulatorTools *emulatorTools = nullptr;
GenericPackageData packageData;
if (parseAbstractData(packageData, data, 1, "Emulator-tools")) {
emulatorTools = new EmulatorTools(packageData.revision, data.at(0));
emulatorTools->setDescriptionText(packageData.description);
emulatorTools->setDisplayText(packageData.description);
emulatorTools->setInstalledLocation(packageData.installedLocation);
} else {
qCDebug(sdkManagerLog) << "Emulator-tools: Parsing failed. Minimum required data "
"unavailable:" << data;
}
return emulatorTools;
}
SdkManagerOutputParser::MarkerTag SdkManagerOutputParser::parseMarkers(const QString &line) SdkManagerOutputParser::MarkerTag SdkManagerOutputParser::parseMarkers(const QString &line)
{ {
if (line.isEmpty()) if (line.isEmpty())

View File

@@ -253,4 +253,20 @@ AndroidSdkPackage::PackageType PlatformTools::type() const
return AndroidSdkPackage::PlatformToolsPackage; return AndroidSdkPackage::PlatformToolsPackage;
} }
EmulatorTools::EmulatorTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent):
AndroidSdkPackage(revision, sdkStylePathStr, parent)
{
}
bool EmulatorTools::isValid() const
{
return installedLocation().exists();
}
AndroidSdkPackage::PackageType EmulatorTools::type() const
{
return AndroidSdkPackage::EmulatorToolsPackage;
}
} // namespace Android } // namespace Android

View File

@@ -52,8 +52,9 @@ public:
PlatformToolsPackage = 1 << 3, PlatformToolsPackage = 1 << 3,
SdkPlatformPackage = 1 << 4, SdkPlatformPackage = 1 << 4,
SystemImagePackage = 1 << 5, SystemImagePackage = 1 << 5,
EmulatorToolsPackage = 1 << 6,
AnyValidType = SdkToolsPackage | BuildToolsPackage | PlatformToolsPackage | AnyValidType = SdkToolsPackage | BuildToolsPackage | PlatformToolsPackage |
SdkPlatformPackage | SystemImagePackage SdkPlatformPackage | SystemImagePackage | EmulatorToolsPackage
}; };
enum PackageState { enum PackageState {
@@ -169,6 +170,17 @@ public:
PackageType type() const override; PackageType type() const override;
}; };
class EmulatorTools : public AndroidSdkPackage
{
public:
EmulatorTools(QVersionNumber revision, QString sdkStylePathStr, QObject *parent = nullptr);
// AndroidSdkPackage Overrides
public:
bool isValid() const override;
PackageType type() const override;
};
class SdkTools : public AndroidSdkPackage class SdkTools : public AndroidSdkPackage
{ {
public: public:

View File

@@ -148,8 +148,8 @@ static CPlusPlus::Document::Ptr declaringDocument(CPlusPlus::Document::Ptr doc,
} }
} }
if (lookupItems.size()) { for (const CPlusPlus::LookupItem &item : lookupItems) {
if (CPlusPlus::Symbol *symbol = lookupItems.first().declaration()) { if (CPlusPlus::Symbol *symbol = item.declaration()) {
if (CPlusPlus::Class *toeClass = symbol->asClass()) { if (CPlusPlus::Class *toeClass = symbol->asClass()) {
const QString declFileName = QLatin1String(toeClass->fileId()->chars(), const QString declFileName = QLatin1String(toeClass->fileId()->chars(),
toeClass->fileId()->size()); toeClass->fileId()->size());

View File

@@ -123,8 +123,12 @@ TestConfiguration *QuickTestTreeItem::testConfiguration() const
switch (type()) { switch (type()) {
case TestCase: { case TestCase: {
QStringList testFunctions; QStringList testFunctions;
for (int row = 0, count = childCount(); row < count; ++row) for (int row = 0, count = childCount(); row < count; ++row) {
testFunctions << name() + "::" + childItem(row)->name(); const TestTreeItem *child = childItem(row);
if (child->type() == TestTreeItem::TestSpecialFunction)
continue;
testFunctions << name() + "::" + child->name();
}
config = new QuickTestConfiguration; config = new QuickTestConfiguration;
config->setTestCases(testFunctions); config->setTestCases(testFunctions);
config->setProjectFile(proFile()); config->setProjectFile(proFile());

View File

@@ -101,7 +101,7 @@ TestNavigationWidget::TestNavigationWidget(QWidget *parent) :
connect(m_model->parser(), &TestCodeParser::parsingFailed, connect(m_model->parser(), &TestCodeParser::parsingFailed,
this, &TestNavigationWidget::onParsingFinished); this, &TestNavigationWidget::onParsingFinished);
connect(m_model, &TestTreeModel::updatedActiveFrameworks, connect(m_model, &TestTreeModel::updatedActiveFrameworks,
[this] (int numberOfActive) { this, [this] (int numberOfActive) {
m_missingFrameworksWidget->setVisible(numberOfActive == 0); m_missingFrameworksWidget->setVisible(numberOfActive == 0);
}); });
connect(m_progressTimer, &QTimer::timeout, connect(m_progressTimer, &QTimer::timeout,

View File

@@ -95,6 +95,12 @@ public:
addWrappedQtHeadersIncludePath(); addWrappedQtHeadersIncludePath();
} }
void addToolchainAndProjectMacros() final
{
addMacros({ProjectExplorer::Macro("Q_CREATOR_RUN", "1")});
CompilerOptionsBuilder::addToolchainAndProjectMacros();
}
void addExtraOptions() final void addExtraOptions() final
{ {
addDummyUiHeaderOnDiskIncludePath(); addDummyUiHeaderOnDiskIncludePath();

View File

@@ -88,8 +88,9 @@ public:
REPARSE_URGENT = 1, // Do not wait for more requests, start ASAP REPARSE_URGENT = 1, // Do not wait for more requests, start ASAP
REPARSE_FORCE_CONFIGURATION = 2, // Force configuration arguments to cmake REPARSE_FORCE_CONFIGURATION = 2, // Force configuration arguments to cmake
REPARSE_CHECK_CONFIGURATION = 4, // Check and warn if on-disk config and QtC config differ REPARSE_CHECK_CONFIGURATION = 4, // Check and warn if on-disk config and QtC config differ
REPARSE_IGNORE = 8, // Do not reparse:-) REPARSE_SCAN = 8,
REPARSE_FAIL = 16 // Do not reparse and raise a warning REPARSE_IGNORE = 16, // Do not reparse:-)
REPARSE_FAIL = 32 // Do not reparse and raise a warning
}; };
signals: signals:

View File

@@ -390,25 +390,27 @@ bool CMakeProject::supportsKit(Kit *k, QString *errorMessage) const
void CMakeProject::runCMake() void CMakeProject::runCMake()
{ {
if (isParsing()) CMakeBuildConfiguration *bc = activeBc(this);
if (isParsing() || !bc)
return; return;
CMakeBuildConfiguration *bc = activeBc(this); BuildDirParameters parameters(bc);
if (bc) { m_buildDirManager.setParametersAndRequestParse(parameters,
BuildDirParameters parameters(bc); BuildDirManager::REPARSE_CHECK_CONFIGURATION,
m_buildDirManager.setParametersAndRequestParse(parameters, BuildDirManager::REPARSE_CHECK_CONFIGURATION);
BuildDirManager::REPARSE_CHECK_CONFIGURATION,
BuildDirManager::REPARSE_CHECK_CONFIGURATION);
}
} }
void CMakeProject::runCMakeAndScanProjectTree() void CMakeProject::runCMakeAndScanProjectTree()
{ {
if (!m_treeScanner.isFinished()) CMakeBuildConfiguration *bc = activeBc(this);
if (isParsing() || !bc)
return; return;
QTC_ASSERT(m_treeScanner.isFinished(), return);
m_waitingForScan = true; BuildDirParameters parameters(bc);
runCMake(); m_buildDirManager.setParametersAndRequestParse(parameters,
BuildDirManager::REPARSE_CHECK_CONFIGURATION | BuildDirManager::REPARSE_SCAN,
BuildDirManager::REPARSE_CHECK_CONFIGURATION | BuildDirManager::REPARSE_SCAN);
} }
void CMakeProject::buildCMakeTarget(const QString &buildTarget) void CMakeProject::buildCMakeTarget(const QString &buildTarget)
@@ -452,6 +454,8 @@ void CMakeProject::handleReparseRequest(int reparseParameters)
m_delayedParsingTimer.setInterval((reparseParameters & BuildDirManager::REPARSE_URGENT) ? 0 : 1000); m_delayedParsingTimer.setInterval((reparseParameters & BuildDirManager::REPARSE_URGENT) ? 0 : 1000);
m_delayedParsingTimer.start(); m_delayedParsingTimer.start();
m_delayedParsingParameters = m_delayedParsingParameters | reparseParameters; m_delayedParsingParameters = m_delayedParsingParameters | reparseParameters;
if (m_allFiles.isEmpty())
m_delayedParsingParameters |= BuildDirManager::REPARSE_SCAN;
} }
void CMakeProject::startParsing(int reparseParameters) void CMakeProject::startParsing(int reparseParameters)
@@ -466,6 +470,7 @@ void CMakeProject::startParsing(int reparseParameters)
emitParsingStarted(); emitParsingStarted();
m_waitingForScan = reparseParameters & BuildDirManager::REPARSE_SCAN;
m_waitingForParse = true; m_waitingForParse = true;
m_combinedScanAndParseResult = true; m_combinedScanAndParseResult = true;

View File

@@ -58,6 +58,7 @@ QStringList CompilerOptionsBuilder::build(CppTools::ProjectFile::Kind fileKind,
addToolchainAndProjectMacros(); addToolchainAndProjectMacros();
undefineClangVersionMacrosForMsvc(); undefineClangVersionMacrosForMsvc();
undefineCppLanguageFeatureMacrosForMsvc2015(); undefineCppLanguageFeatureMacrosForMsvc2015();
addDefineFunctionMacrosMsvc();
addPredefinedHeaderPathsOptions(); addPredefinedHeaderPathsOptions();
addPrecompiledHeaderOptions(pchUsage); addPrecompiledHeaderOptions(pchUsage);
@@ -389,6 +390,12 @@ void CompilerOptionsBuilder::undefineCppLanguageFeatureMacrosForMsvc2015()
} }
} }
void CompilerOptionsBuilder::addDefineFunctionMacrosMsvc()
{
if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID)
addMacros({{"__FUNCSIG__", "\"\""}, {"__FUNCTION__", "\"\""}, {"__FUNCDNAME__", "\"\""}});
}
QString CompilerOptionsBuilder::includeDirOption() const QString CompilerOptionsBuilder::includeDirOption() const
{ {
return QLatin1String("-I"); return QLatin1String("-I");

View File

@@ -64,11 +64,12 @@ public:
void addWordWidth(); void addWordWidth();
void addHeaderPathOptions(); void addHeaderPathOptions();
void addPrecompiledHeaderOptions(PchUsage pchUsage); void addPrecompiledHeaderOptions(PchUsage pchUsage);
void addToolchainAndProjectMacros(); virtual void addToolchainAndProjectMacros();
void addMacros(const ProjectExplorer::Macros &macros); void addMacros(const ProjectExplorer::Macros &macros);
void addMsvcCompatibilityVersion(); void addMsvcCompatibilityVersion();
void undefineCppLanguageFeatureMacrosForMsvc2015(); void undefineCppLanguageFeatureMacrosForMsvc2015();
void addDefineFunctionMacrosMsvc();
void addProjectConfigFileInclude(); void addProjectConfigFileInclude();
void undefineClangVersionMacrosForMsvc(); void undefineClangVersionMacrosForMsvc();

View File

@@ -2102,7 +2102,7 @@ void DebuggerPlugin::attachExternalApplication(RunControl *rc)
ProcessHandle pid = rc->applicationProcessHandle(); ProcessHandle pid = rc->applicationProcessHandle();
RunConfiguration *runConfig = rc->runConfiguration(); RunConfiguration *runConfig = rc->runConfiguration();
auto runControl = new RunControl(runConfig, ProjectExplorer::Constants::DEBUG_RUN_MODE); auto runControl = new RunControl(runConfig, ProjectExplorer::Constants::DEBUG_RUN_MODE);
auto debugger = new DebuggerRunTool(runControl, guessKitFromAbis({rc->abi()})); auto debugger = new DebuggerRunTool(runControl, guessKitFromAbis({rc->abi()}), false);
debugger->setAttachPid(pid); debugger->setAttachPid(pid);
debugger->setRunControlName(tr("Process %1").arg(pid.pid())); debugger->setRunControlName(tr("Process %1").arg(pid.pid()));
debugger->setStartMode(AttachExternal); debugger->setStartMode(AttachExternal);

View File

@@ -795,7 +795,7 @@ Internal::TerminalRunner *DebuggerRunTool::terminalRunner() const
return d->terminalRunner; return d->terminalRunner;
} }
DebuggerRunTool::DebuggerRunTool(RunControl *runControl, Kit *kit) DebuggerRunTool::DebuggerRunTool(RunControl *runControl, Kit *kit, bool allowTerminal)
: RunWorker(runControl), d(new DebuggerRunToolPrivate) : RunWorker(runControl), d(new DebuggerRunToolPrivate)
{ {
setDisplayName("DebuggerRunTool"); setDisplayName("DebuggerRunTool");
@@ -839,7 +839,7 @@ DebuggerRunTool::DebuggerRunTool(RunControl *runControl, Kit *kit)
// Normalize to work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch'...) // Normalize to work around QTBUG-17529 (QtDeclarative fails with 'File name case mismatch'...)
m_runParameters.inferior.workingDirectory = m_runParameters.inferior.workingDirectory =
FileUtils::normalizePathName(m_runParameters.inferior.workingDirectory); FileUtils::normalizePathName(m_runParameters.inferior.workingDirectory);
setUseTerminal(m_runParameters.inferior.runMode == ApplicationLauncher::Console); setUseTerminal(allowTerminal && m_runParameters.inferior.runMode == ApplicationLauncher::Console);
} }
const QByteArray envBinary = qgetenv("QTC_DEBUGGER_PATH"); const QByteArray envBinary = qgetenv("QTC_DEBUGGER_PATH");

View File

@@ -47,7 +47,8 @@ class DEBUGGER_EXPORT DebuggerRunTool : public ProjectExplorer::RunWorker
public: public:
explicit DebuggerRunTool(ProjectExplorer::RunControl *runControl, explicit DebuggerRunTool(ProjectExplorer::RunControl *runControl,
ProjectExplorer::Kit *kit = nullptr); ProjectExplorer::Kit *kit = nullptr,
bool allowTerminal = true);
~DebuggerRunTool(); ~DebuggerRunTool();
Internal::DebuggerEngine *engine() const { return m_engine; } Internal::DebuggerEngine *engine() const { return m_engine; }

View File

@@ -87,6 +87,7 @@ public:
void bringToForeground(); void bringToForeground();
qint64 applicationPID() const; qint64 applicationPID() const;
bool isRunning() const; bool isRunning() const;
bool isRemoteRunning() const;
// Remote // Remote
void doReportError(const QString &message); void doReportError(const QString &message);
@@ -220,6 +221,11 @@ bool ApplicationLauncher::isRunning() const
return d->isRunning(); return d->isRunning();
} }
bool ApplicationLauncher::isRemoteRunning() const
{
return d->isRemoteRunning();
}
bool ApplicationLauncherPrivate::isRunning() const bool ApplicationLauncherPrivate::isRunning() const
{ {
if (m_currentMode == ApplicationLauncher::Gui) if (m_currentMode == ApplicationLauncher::Gui)
@@ -227,6 +233,11 @@ bool ApplicationLauncherPrivate::isRunning() const
return m_consoleProcess.isRunning(); return m_consoleProcess.isRunning();
} }
bool ApplicationLauncherPrivate::isRemoteRunning() const
{
return m_isLocal ? false : m_deviceProcess->state() == QProcess::Running;
}
ProcessHandle ApplicationLauncher::applicationPID() const ProcessHandle ApplicationLauncher::applicationPID() const
{ {
return ProcessHandle(d->applicationPID()); return ProcessHandle(d->applicationPID());

View File

@@ -61,6 +61,7 @@ public:
void stop(); void stop();
bool isRunning() const; bool isRunning() const;
Utils::ProcessHandle applicationPID() const; Utils::ProcessHandle applicationPID() const;
bool isRemoteRunning() const;
QString errorString() const; QString errorString() const;
QProcess::ProcessError processError() const; QProcess::ProcessError processError() const;

View File

@@ -275,7 +275,7 @@ bool QbsProject::addFilesToProduct(const QStringList &filePaths,
} }
if (notAdded->count() != filePaths.count()) { if (notAdded->count() != filePaths.count()) {
m_projectData = m_qbsProject.projectData(); m_projectData = m_qbsProject.projectData();
rebuildProjectTree(); delayedUpdateAfterParse();
} }
return notAdded->isEmpty(); return notAdded->isEmpty();
} }
@@ -302,8 +302,7 @@ bool QbsProject::removeFilesFromProduct(const QStringList &filePaths,
} }
if (notRemoved->count() != filePaths.count()) { if (notRemoved->count() != filePaths.count()) {
m_projectData = m_qbsProject.projectData(); m_projectData = m_qbsProject.projectData();
rebuildProjectTree(); delayedUpdateAfterParse();
emit fileListChanged();
} }
return notRemoved->isEmpty(); return notRemoved->isEmpty();
} }
@@ -472,6 +471,11 @@ void QbsProject::updateAfterParse()
emit fileListChanged(); emit fileListChanged();
} }
void QbsProject::delayedUpdateAfterParse()
{
QTimer::singleShot(0, this, &QbsProject::updateAfterParse);
}
void QbsProject::updateProjectNodes() void QbsProject::updateProjectNodes()
{ {
OpTimer opTimer("updateProjectNodes"); OpTimer opTimer("updateProjectNodes");

View File

@@ -136,6 +136,7 @@ private:
void handleRuleExecutionDone(); void handleRuleExecutionDone();
bool checkCancelStatus(); bool checkCancelStatus();
void updateAfterParse(); void updateAfterParse();
void delayedUpdateAfterParse();
void updateProjectNodes(); void updateProjectNodes();
void projectLoaded() override; void projectLoaded() override;

View File

@@ -63,7 +63,7 @@ const char QBS_INSTALLSTEP_ID[] = "Qbs.InstallStep";
const char QBS_VARIANT_DEBUG[] = "debug"; const char QBS_VARIANT_DEBUG[] = "debug";
const char QBS_VARIANT_RELEASE[] = "release"; const char QBS_VARIANT_RELEASE[] = "release";
const char QBS_CONFIG_VARIANT_KEY[] = "qbs.buildVariant"; const char QBS_CONFIG_VARIANT_KEY[] = "qbs.defaultBuildVariant";
const char QBS_CONFIG_PROFILE_KEY[] = "qbs.profile"; const char QBS_CONFIG_PROFILE_KEY[] = "qbs.profile";
const char QBS_INSTALL_ROOT_KEY[] = "qbs.installRoot"; const char QBS_INSTALL_ROOT_KEY[] = "qbs.installRoot";
const char QBS_CONFIG_DECLARATIVE_DEBUG_KEY[] = "Qt.declarative.qmlDebugging"; const char QBS_CONFIG_DECLARATIVE_DEBUG_KEY[] = "Qt.declarative.qmlDebugging";

View File

@@ -55,6 +55,7 @@
#include <QSet> #include <QSet>
#include <QDir> #include <QDir>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QRegularExpression>
using namespace LanguageUtils; using namespace LanguageUtils;
using namespace QmlJS; using namespace QmlJS;
@@ -330,6 +331,19 @@ static inline QString extractComponentFromQml(const QString &source)
return result; return result;
} }
static QString normalizeJavaScriptExpression(const QString &expression)
{
static const QRegularExpression regExp("\\n(\\s)+");
QString result = expression;
return result.replace(regExp, "\n");
}
static bool compareJavaScriptExpression(const QString &expression1, const QString &expression2)
{
return normalizeJavaScriptExpression(expression1) == normalizeJavaScriptExpression(expression2);
}
} // anonymous namespace } // anonymous namespace
namespace QmlDesigner { namespace QmlDesigner {
@@ -1379,7 +1393,7 @@ void TextToModelMerger::syncExpressionProperty(AbstractProperty &modelProperty,
{ {
if (modelProperty.isBindingProperty()) { if (modelProperty.isBindingProperty()) {
BindingProperty bindingProperty = modelProperty.toBindingProperty(); BindingProperty bindingProperty = modelProperty.toBindingProperty();
if (bindingProperty.expression() != javascript if (!compareJavaScriptExpression(bindingProperty.expression(), javascript)
|| astType.isEmpty() == bindingProperty.isDynamic() || astType.isEmpty() == bindingProperty.isDynamic()
|| astType != bindingProperty.dynamicTypeName()) { || astType != bindingProperty.dynamicTypeName()) {
differenceHandler.bindingExpressionsDiffer(bindingProperty, javascript, astType); differenceHandler.bindingExpressionsDiffer(bindingProperty, javascript, astType);
@@ -1574,7 +1588,7 @@ void ModelValidator::bindingExpressionsDiffer(BindingProperty &modelProperty,
Q_UNUSED(modelProperty) Q_UNUSED(modelProperty)
Q_UNUSED(javascript) Q_UNUSED(javascript)
Q_UNUSED(astType) Q_UNUSED(astType)
Q_ASSERT(modelProperty.expression() == javascript); Q_ASSERT(compareJavaScriptExpression(modelProperty.expression(), javascript));
Q_ASSERT(modelProperty.dynamicTypeName() == astType); Q_ASSERT(modelProperty.dynamicTypeName() == astType);
Q_ASSERT(0); Q_ASSERT(0);
} }

View File

@@ -298,7 +298,9 @@ void Parser::Private::parseHeader(QIODevice *device)
// now that we're done checking if we're done (heh) with the header, parse the address // now that we're done checking if we're done (heh) with the header, parse the address
// and cost column descriptions. speed is unimportant here. // and cost column descriptions. speed is unimportant here.
if (line.startsWith("positions: ")) { if (line.startsWith('#')) {
continue;
} else if (line.startsWith("positions: ")) {
QString values = getValue(line, 11); QString values = getValue(line, 11);
data->setPositions(values.split(QLatin1Char(' '), QString::SkipEmptyParts)); data->setPositions(values.split(QLatin1Char(' '), QString::SkipEmptyParts));
addressValuesCount = data->positions().count(); addressValuesCount = data->positions().count();

View File

@@ -62,8 +62,6 @@ ValgrindConfigWidget::ValgrindConfigWidget(ValgrindBaseSettings *settings,
connect(m_ui->valgrindExeChooser, &Utils::PathChooser::rawPathChanged, connect(m_ui->valgrindExeChooser, &Utils::PathChooser::rawPathChanged,
m_settings, &ValgrindBaseSettings::setValgrindExecutable); m_settings, &ValgrindBaseSettings::setValgrindExecutable);
connect(m_settings, &ValgrindBaseSettings::valgrindExecutableChanged,
m_ui->valgrindExeChooser, &Utils::PathChooser::setPath);
connect(m_ui->smcDetectionComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), connect(m_ui->smcDetectionComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
m_settings, &ValgrindBaseSettings::setSelfModifyingCodeDetection); m_settings, &ValgrindBaseSettings::setSelfModifyingCodeDetection);

View File

@@ -143,10 +143,7 @@ void ValgrindBaseSettings::toMap(QVariantMap &map) const
void ValgrindBaseSettings::setValgrindExecutable(const QString &valgrindExecutable) void ValgrindBaseSettings::setValgrindExecutable(const QString &valgrindExecutable)
{ {
if (m_valgrindExecutable != valgrindExecutable) { m_valgrindExecutable = valgrindExecutable;
m_valgrindExecutable = valgrindExecutable;
emit valgrindExecutableChanged(valgrindExecutable);
}
} }
void ValgrindBaseSettings::setSelfModifyingCodeDetection(int smcDetection) void ValgrindBaseSettings::setSelfModifyingCodeDetection(int smcDetection)

View File

@@ -78,7 +78,6 @@ public:
void setSelfModifyingCodeDetection(int); void setSelfModifyingCodeDetection(int);
signals: signals:
void valgrindExecutableChanged(const QString &);
void selfModifyingCodeDetectionChanged(int); void selfModifyingCodeDetectionChanged(int);
private: private: