Merge remote-tracking branch 'origin/2.6'
Conflicts: qtcreator.pri qtcreator.qbp src/libs/ssh/sshconnection.cpp Change-Id: I2946cbec1b5159eef9e47949860b28fba1e51529
2
README
@@ -107,7 +107,7 @@ SDK (release builds of Qt using MinGW and Visual C++ 2008).
|
|||||||
For the Visual C++ compilers, it is recommended to use the tool 'jom'.
|
For the Visual C++ compilers, it is recommended to use the tool 'jom'.
|
||||||
It is a replacement for nmake that utilizes all CPU cores and thus
|
It is a replacement for nmake that utilizes all CPU cores and thus
|
||||||
speeds up compilation significantly. Download it from
|
speeds up compilation significantly. Download it from
|
||||||
ftp://ftp.qt.nokia.com/jom/ and add the executable to the path.
|
http://releases.qt-project.org/jom/ and add the executable to the path.
|
||||||
|
|
||||||
8. For convenience, we recommend creating shell prompts with the correct
|
8. For convenience, we recommend creating shell prompts with the correct
|
||||||
environment. This can be done by creating a .bat-file
|
environment. This can be done by creating a .bat-file
|
||||||
|
|||||||
24
dist/installer/ifw/config/config-linux.xml.in
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<Installer>
|
||||||
|
<Name>Qt Creator</Name>
|
||||||
|
<Version>{version}</Version>
|
||||||
|
<Title>Qt Creator {version}</Title>
|
||||||
|
<MaintenanceTitle>Qt Creator Maintenance</MaintenanceTitle>
|
||||||
|
<Publisher>Qt Project</Publisher>
|
||||||
|
<ProductUrl>http://qt-project.org</ProductUrl>
|
||||||
|
|
||||||
|
<Icon>logo.png</Icon>
|
||||||
|
<Watermark>watermark.png</Watermark>
|
||||||
|
<UninstallerName>QtCreatorUninstaller</UninstallerName>
|
||||||
|
<!-- @homeDir@ and @rootDir@ are some of the supported vars -->
|
||||||
|
<TargetDir>@homeDir@/qtcreator-{version}</TargetDir>
|
||||||
|
<AdminTargetDir>/opt/qtcreator-{version}</AdminTargetDir>
|
||||||
|
|
||||||
|
<Pages>
|
||||||
|
<Page name="LicenseAgreementPage">
|
||||||
|
<AcceptLicenseLabel>I have read and understood the terms contained in the above license agreements.</AcceptLicenseLabel>
|
||||||
|
<RejectLicenseLabel>I do not accept the terms contained in the above license agreements.</RejectLicenseLabel>
|
||||||
|
</Page>
|
||||||
|
</Pages>
|
||||||
|
|
||||||
|
</Installer>
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<Installer>
|
<Installer>
|
||||||
<Name>Qt Creator</Name>
|
<Name>Qt Creator</Name>
|
||||||
<Version>{version}</Version>
|
<Version>{version}</Version>
|
||||||
<Title>Qt Creator</Title>
|
<Title>Qt Creator {version}</Title>
|
||||||
<MaintenanceTitle>Qt Creator Maintenance</MaintenanceTitle>
|
<MaintenanceTitle>Qt Creator Maintenance</MaintenanceTitle>
|
||||||
<Publisher>Qt Project</Publisher>
|
<Publisher>Qt Project</Publisher>
|
||||||
<ProductUrl>http://qt-project.org</ProductUrl>
|
<ProductUrl>http://qt-project.org</ProductUrl>
|
||||||
@@ -11,8 +11,7 @@
|
|||||||
<Watermark>watermark.png</Watermark>
|
<Watermark>watermark.png</Watermark>
|
||||||
<UninstallerName>QtCreatorUninstaller</UninstallerName>
|
<UninstallerName>QtCreatorUninstaller</UninstallerName>
|
||||||
<!-- @homeDir@ and @rootDir@ are some of the supported vars -->
|
<!-- @homeDir@ and @rootDir@ are some of the supported vars -->
|
||||||
<TargetDir>@homeDir@/QtCreator</TargetDir>
|
<TargetDir>@rootDir@/Qt/qtcreator-{version}</TargetDir>
|
||||||
<AdminTargetDir>/opt/QtCreator</AdminTargetDir>
|
|
||||||
|
|
||||||
<Pages>
|
<Pages>
|
||||||
<Page name="LicenseAgreementPage">
|
<Page name="LicenseAgreementPage">
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
function Component()
|
function Component()
|
||||||
{
|
{
|
||||||
installer.finishButtonClicked.connect(this, Component.prototype.installationFinished);
|
installer.finishButtonClicked.connect(this, Component.prototype.installationFinished);
|
||||||
|
installer.setDefaultPageVisible(QInstaller.ComponentSelection, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.prototype.beginInstallation = function()
|
Component.prototype.beginInstallation = function()
|
||||||
@@ -120,7 +121,7 @@ Component.prototype.createOperations = function()
|
|||||||
"@TargetDir@\\bin\\qtcreator.exe",
|
"@TargetDir@\\bin\\qtcreator.exe",
|
||||||
"@StartMenuDir@/Qt Creator.lnk",
|
"@StartMenuDir@/Qt Creator.lnk",
|
||||||
"workingDirectory=@homeDir@" );
|
"workingDirectory=@homeDir@" );
|
||||||
component.addElevatedOperation("Execute", "{0,3010}", "@TargetDir@\\lib\\vcredist_msvc2010\\vcredist_x86.exe", "/q");
|
component.addElevatedOperation("Execute", "{0,3010}", "@TargetDir@\\lib\\vcredist_msvc2010\\vcredist_x86.exe", "/norestart", "/q");
|
||||||
registerWindowsFileTypeExtensions();
|
registerWindowsFileTypeExtensions();
|
||||||
}
|
}
|
||||||
if ( installer.value("os") == "x11" )
|
if ( installer.value("os") == "x11" )
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 30 KiB |
@@ -167,7 +167,7 @@
|
|||||||
|
|
||||||
On Windows, nmake does not support the \c{-j} parameter. Instead, we
|
On Windows, nmake does not support the \c{-j} parameter. Instead, we
|
||||||
provide a drop-in replacement called jom. You can download a precompiled
|
provide a drop-in replacement called jom. You can download a precompiled
|
||||||
version of jom from \l{ftp://ftp.qt.nokia.com/jom/}{Qt FTP server}.
|
version of jom from \l{http://releases.qt-project.org/jom/}{Qt Project Release server}.
|
||||||
Put jom.exe in a location in the %PATH%. Go to the \gui {Build Settings}
|
Put jom.exe in a location in the %PATH%. Go to the \gui {Build Settings}
|
||||||
and set jom.exe as the make command.
|
and set jom.exe as the make command.
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,14 @@
|
|||||||
|
|
||||||
\image qtcreator-pprunsettings.png
|
\image qtcreator-pprunsettings.png
|
||||||
|
|
||||||
|
The \gui {Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)} option
|
||||||
|
(available on Mac OS, only) enables you to debug (for example, step into)
|
||||||
|
linked frameworks, such as the Qt framework itself. You do not need this
|
||||||
|
option for debugging your application code. If you select this option, a
|
||||||
|
crash might occur when debugging applications on Mac OS X Snow Leopard. For
|
||||||
|
more information, see
|
||||||
|
\l{Application Crashes when Debugging on Mac OS X Snow Leopard}.
|
||||||
|
|
||||||
You can also create custom executable run configurations where you
|
You can also create custom executable run configurations where you
|
||||||
can set the executable to be run. For more information, see
|
can set the executable to be run. For more information, see
|
||||||
\l{Specifying a Custom Executable to Run}.
|
\l{Specifying a Custom Executable to Run}.
|
||||||
|
|||||||
@@ -77,32 +77,8 @@
|
|||||||
|
|
||||||
\section1 Creating Qt Quick UI Projects
|
\section1 Creating Qt Quick UI Projects
|
||||||
|
|
||||||
\list 1
|
Select \gui {File > New File or Project > Applications > Qt Quick UI >
|
||||||
|
Choose} and follow the instructions of the wizard.
|
||||||
\o Select \gui {File > New File or Project > Applications >
|
|
||||||
Qt Quick UI > Choose}.
|
|
||||||
|
|
||||||
The \gui{Introduction and Project Location} dialog opens.
|
|
||||||
|
|
||||||
\image qmldesigner-new-ui-project-location.png "Introduction and Project Location dialog"
|
|
||||||
|
|
||||||
\o In the \gui Name field, give a name to the project.
|
|
||||||
|
|
||||||
Do not use spaces and special characters in the project name and
|
|
||||||
path.
|
|
||||||
|
|
||||||
\o In the \gui {Create in} field, enter the path for the project files.
|
|
||||||
For example, \c {C:\Qt\examples}. To select the path from a
|
|
||||||
directory tree, click \gui Browse.
|
|
||||||
|
|
||||||
\o Click \gui{Next}.
|
|
||||||
|
|
||||||
\image qmldesigner-new-ui-project-summary.png "Project Management dialog"
|
|
||||||
|
|
||||||
\o Review the project settings, and click \gui{Finish} to create the
|
|
||||||
project.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
|
|
||||||
\QC creates the following files:
|
\QC creates the following files:
|
||||||
|
|
||||||
@@ -127,78 +103,19 @@
|
|||||||
|
|
||||||
\section1 Creating Qt Quick Applications
|
\section1 Creating Qt Quick Applications
|
||||||
|
|
||||||
\list 1
|
Select \gui File > \gui {New File or Project} > \gui Applications >
|
||||||
|
\gui {Qt Quick Application 1 (Built-in Elements)} or \gui {Qt Quick
|
||||||
|
Application 2 (Built-in Elements)} > \gui Choose, and follow the
|
||||||
|
instructions of the wizard.
|
||||||
|
|
||||||
\o Select \gui {File > New File or Project > Applications >
|
\note The SDK for a particular target platform might install additional
|
||||||
Qt Quick Application (Built-in Elements) > Choose}.
|
templates for that platform. For example, the \gui {Qt Quick Application for
|
||||||
|
MeeGo Harmattan} template is installed as part of the MeeGo Harmattan tool
|
||||||
\note We recommend that you use the \gui {Qt Quick Application for
|
chain and the QNX templates are installed as part of the BlackBerry NDK or
|
||||||
MeeGo Harmattan} template when you develop for MeeGo Harmattan
|
the QNX SDK.
|
||||||
devices.
|
|
||||||
|
|
||||||
The \gui{Introduction and Project Location} dialog opens.
|
|
||||||
|
|
||||||
\image qmldesigner-new-project-location.png "Introduction and Project Location dialog"
|
|
||||||
|
|
||||||
\o In the \gui Name field, give a name to the project.
|
|
||||||
|
|
||||||
Do not use spaces and special characters in the project name and
|
|
||||||
path.
|
|
||||||
|
|
||||||
\o In the \gui {Create in} field, enter the path for the project files.
|
|
||||||
For example, \c {C:\Qt\examples}. To select the path from a
|
|
||||||
directory tree, click \gui Browse.
|
|
||||||
|
|
||||||
\o Click \gui{Next}.
|
|
||||||
|
|
||||||
The \gui {Kit Selection} dialog opens.
|
|
||||||
|
|
||||||
\image qmldesigner-new-project-qt-versions.png "Kit Selection dialog"
|
|
||||||
|
|
||||||
\o Select build and run \l{glossary-buildandrun-kit}{kits} for your project,
|
|
||||||
and then click \gui{Next}.
|
|
||||||
|
|
||||||
\note If only one kit is specified in \gui Tools > \gui Options >
|
|
||||||
\gui {Build & Run} > \gui Kits, this dialog is skipped.
|
|
||||||
|
|
||||||
The \gui {Mobile Options} dialog opens.
|
|
||||||
|
|
||||||
\image qmldesigner-new-app-project-mobile-options.png "Mobile Options dialog"
|
|
||||||
|
|
||||||
\o In the \gui {Orientation behavior} field, determine how the
|
|
||||||
application behaves when the orientation of the device display
|
|
||||||
rotates between portrait and landscape, and then click \gui Next.
|
|
||||||
|
|
||||||
\note This dialog opens only if you select a \l{glossary-buildandrun-kit}{kit}
|
|
||||||
with \gui Maemo5 device type in the \gui {Kit Selection} dialog. On
|
|
||||||
Harmattan, the Qt Quick Components for MeeGo provide native-looking
|
|
||||||
rotation.
|
|
||||||
|
|
||||||
\o Click \gui Next.
|
|
||||||
|
|
||||||
The \gui {Harmattan Specific} dialog opens.
|
|
||||||
|
|
||||||
\image qmldesigner-new-project-harmattan-options.png "Harmattan Specific dialog"
|
|
||||||
|
|
||||||
\o In the \gui {Application icon} field, select the application
|
|
||||||
icon to use on Maemo or Harmattan devices, or use the default icon.
|
|
||||||
|
|
||||||
The \gui {Project Management} dialog opens.
|
|
||||||
|
|
||||||
\image qmldesigner-new-project-summary.png "Project Management dialog"
|
|
||||||
|
|
||||||
\o In the \gui {Add to project} field, you can add this project to
|
|
||||||
another project as a subproject.
|
|
||||||
|
|
||||||
\o In the \gui {Add to version control} field, you can add the project
|
|
||||||
to a version control system.
|
|
||||||
|
|
||||||
\o Click \gui Finish to create the project.
|
|
||||||
|
|
||||||
\endlist
|
|
||||||
|
|
||||||
\QC creates the necessary boilerplate files. Some of the files are
|
\QC creates the necessary boilerplate files. Some of the files are
|
||||||
specific to the Maemo or MeeGo Harmattan platform.
|
specific to a particular target platform.
|
||||||
|
|
||||||
\section1 Importing QML Applications
|
\section1 Importing QML Applications
|
||||||
|
|
||||||
|
|||||||
4
doc/templates/scripts/functions.js
vendored
@@ -53,7 +53,7 @@ var articleCount = 0;
|
|||||||
var exampleCount = 0;
|
var exampleCount = 0;
|
||||||
var qturl = ""; // change from "http://doc.qt.nokia.com/4.6/" to 0 so we can have relative links
|
var qturl = ""; // change from "http://doc.qt.nokia.com/4.6/" to 0 so we can have relative links
|
||||||
|
|
||||||
function processNokiaData(response){
|
function processData(response){
|
||||||
var propertyTags = response.getElementsByTagName('page');
|
var propertyTags = response.getElementsByTagName('page');
|
||||||
|
|
||||||
for (var i=0; i< propertyTags.length; i++) {
|
for (var i=0; i< propertyTags.length; i++) {
|
||||||
@@ -180,7 +180,7 @@ else
|
|||||||
$('.searching').remove();
|
$('.searching').remove();
|
||||||
$('#pageType').removeClass('loading');
|
$('#pageType').removeClass('loading');
|
||||||
$('.list ul').prepend('<li class="menuAlert searching">Searching...</li>');
|
$('.list ul').prepend('<li class="menuAlert searching">Searching...</li>');
|
||||||
processNokiaData(response);
|
processData(response);
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -86,8 +86,15 @@ def main():
|
|||||||
raise Exception('Archive not specified (--archive)!')
|
raise Exception('Archive not specified (--archive)!')
|
||||||
|
|
||||||
installer_name = args[0]
|
installer_name = args[0]
|
||||||
|
config_postfix = ''
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
installer_name = installer_name + '.dmg'
|
installer_name = installer_name + '.dmg'
|
||||||
|
if sys.platform.startswith('win'):
|
||||||
|
config_postfix = '-windows'
|
||||||
|
if sys.platform.startswith('linux'):
|
||||||
|
config_postfix = '-linux'
|
||||||
|
|
||||||
|
config_name = 'config' + config_postfix + '.xml'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
temp_dir = tempfile.mkdtemp()
|
temp_dir = tempfile.mkdtemp()
|
||||||
@@ -121,7 +128,7 @@ def main():
|
|||||||
os.makedirs(data_path)
|
os.makedirs(data_path)
|
||||||
shutil.copy(archive, data_path)
|
shutil.copy(archive, data_path)
|
||||||
|
|
||||||
ifw_call = [os.path.join(ifw_location, 'bin', 'binarycreator'), '-c', os.path.join(out_config_dir, 'config.xml'), '-p', out_packages_dir, installer_name, '--offline-only' ]
|
ifw_call = [os.path.join(ifw_location, 'bin', 'binarycreator'), '-c', os.path.join(out_config_dir, config_name), '-p', out_packages_dir, installer_name, '--offline-only' ]
|
||||||
subprocess.check_call(ifw_call, stderr=subprocess.STDOUT)
|
subprocess.check_call(ifw_call, stderr=subprocess.STDOUT)
|
||||||
finally:
|
finally:
|
||||||
print 'Cleaning up...'
|
print 'Cleaning up...'
|
||||||
|
|||||||
@@ -16,8 +16,6 @@
|
|||||||
<env var="QML_IMPORT_PATH" value="app/native/imports"/>
|
<env var="QML_IMPORT_PATH" value="app/native/imports"/>
|
||||||
<env var="QT_PLUGIN_PATH" value="app/native/plugins:/usr/lib/qt4/plugins"/>
|
<env var="QT_PLUGIN_PATH" value="app/native/plugins:/usr/lib/qt4/plugins"/>
|
||||||
<env var="LD_LIBRARY_PATH" value="app/native/lib:/usr/lib/qt4/lib/"/>
|
<env var="LD_LIBRARY_PATH" value="app/native/lib:/usr/lib/qt4/lib/"/>
|
||||||
<arg>-platform</arg>
|
|
||||||
<arg>blackberry</arg>
|
|
||||||
<arg>-style</arg>
|
<arg>-style</arg>
|
||||||
<arg>qnxlight</arg>
|
<arg>qnxlight</arg>
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,6 @@
|
|||||||
<env var="QML_IMPORT_PATH" value="app/native/imports"/>
|
<env var="QML_IMPORT_PATH" value="app/native/imports"/>
|
||||||
<env var="QT_PLUGIN_PATH" value="app/native/plugins:/usr/lib/qt4/plugins"/>
|
<env var="QT_PLUGIN_PATH" value="app/native/plugins:/usr/lib/qt4/plugins"/>
|
||||||
<env var="LD_LIBRARY_PATH" value="app/native/lib:/usr/lib/qt4/lib/"/>
|
<env var="LD_LIBRARY_PATH" value="app/native/lib:/usr/lib/qt4/lib/"/>
|
||||||
<arg>-platform</arg>
|
|
||||||
<arg>blackberry</arg>
|
|
||||||
|
|
||||||
<action system="true">run_native</action>
|
<action system="true">run_native</action>
|
||||||
<asset entry="true" path="%ProjectName%" type="Qnx/Elf">%ProjectName%</asset>
|
<asset entry="true" path="%ProjectName%" type="Qnx/Elf">%ProjectName%</asset>
|
||||||
|
|||||||
@@ -15,8 +15,6 @@
|
|||||||
<env var="QML_IMPORT_PATH" value="app/native/imports"/>
|
<env var="QML_IMPORT_PATH" value="app/native/imports"/>
|
||||||
<env var="QT_PLUGIN_PATH" value="app/native/plugins:/usr/lib/qt4/plugins"/>
|
<env var="QT_PLUGIN_PATH" value="app/native/plugins:/usr/lib/qt4/plugins"/>
|
||||||
<env var="LD_LIBRARY_PATH" value="app/native/lib:/usr/lib/qt4/lib/"/>
|
<env var="LD_LIBRARY_PATH" value="app/native/lib:/usr/lib/qt4/lib/"/>
|
||||||
<arg>-platform</arg>
|
|
||||||
<arg>blackberry</arg>
|
|
||||||
|
|
||||||
<action system="true">run_native</action>
|
<action system="true">run_native</action>
|
||||||
<asset entry="true" path="%ProjectName%" type="Qnx/Elf">%ProjectName%</asset>
|
<asset entry="true" path="%ProjectName%" type="Qnx/Elf">%ProjectName%</asset>
|
||||||
|
|||||||
@@ -7774,7 +7774,7 @@ konnte dem Projekt '%2' nicht hinzugefügt werden.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source><a href="qthelp://com.nokia.qtcreator/doc/creator-project-managing-sessions.html">What is a Session?</a></source>
|
<source><a href="qthelp://com.nokia.qtcreator/doc/creator-project-managing-sessions.html">What is a Session?</a></source>
|
||||||
<translation><a href="qthelp://com.nokia.qtcreator/doc/creator-project-managing-sessions.htm">Was ist eine Sitzung?</a></translation>
|
<translation><a href="qthelp://com.nokia.qtcreator/doc/creator-project-managing-sessions.html">Was ist eine Sitzung?</a></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Automatically restore the last session when Qt Creator is started.</source>
|
<source>Automatically restore the last session when Qt Creator is started.</source>
|
||||||
|
|||||||
15
src/libs/3rdparty/cplusplus/Name.cpp
vendored
@@ -18,10 +18,13 @@
|
|||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
// THE SOFTWARE.
|
// THE SOFTWARE.
|
||||||
|
|
||||||
|
#include "Literals.h"
|
||||||
#include "Name.h"
|
#include "Name.h"
|
||||||
#include "Names.h"
|
#include "Names.h"
|
||||||
#include "NameVisitor.h"
|
#include "NameVisitor.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
using namespace CPlusPlus;
|
using namespace CPlusPlus;
|
||||||
|
|
||||||
Name::Name()
|
Name::Name()
|
||||||
@@ -65,4 +68,16 @@ void Name::accept(const Name *name, NameVisitor *visitor)
|
|||||||
name->accept(visitor);
|
name->accept(visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Name::Compare::operator()(const Name *name, const Name *other) const
|
||||||
|
{
|
||||||
|
if (name == 0)
|
||||||
|
return other != 0;
|
||||||
|
if (other == 0)
|
||||||
|
return false;
|
||||||
|
if (name == other)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const Identifier *id = name->identifier();
|
||||||
|
const Identifier *otherId = other->identifier();
|
||||||
|
return std::strcmp(id->chars(), otherId->chars()) < 0;
|
||||||
|
}
|
||||||
|
|||||||
6
src/libs/3rdparty/cplusplus/Name.h
vendored
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include "CPlusPlusForwardDeclarations.h"
|
#include "CPlusPlusForwardDeclarations.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
namespace CPlusPlus {
|
namespace CPlusPlus {
|
||||||
|
|
||||||
@@ -55,6 +56,11 @@ public:
|
|||||||
void accept(NameVisitor *visitor) const;
|
void accept(NameVisitor *visitor) const;
|
||||||
static void accept(const Name *name, NameVisitor *visitor);
|
static void accept(const Name *name, NameVisitor *visitor);
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct Compare: std::binary_function<const Name *, const Name *, bool> {
|
||||||
|
bool operator()(const Name *name, const Name *other) const;
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void accept0(NameVisitor *visitor) const = 0;
|
virtual void accept0(NameVisitor *visitor) const = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
4
src/libs/3rdparty/cplusplus/Templates.cpp
vendored
@@ -514,10 +514,12 @@ Symbol *Clone::instantiate(Template *templ, const FullySpecifiedType *const args
|
|||||||
//
|
//
|
||||||
// substitutions
|
// substitutions
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
FullySpecifiedType Subst::apply(const Name *name) const
|
FullySpecifiedType Subst::apply(const Name *name) const
|
||||||
{
|
{
|
||||||
if (name) {
|
if (name) {
|
||||||
std::map<const Name *, FullySpecifiedType>::const_iterator it = _map.find(name);
|
std::map<const Name *, FullySpecifiedType, Name::Compare>::const_iterator it = _map.find(name);
|
||||||
if (it != _map.end())
|
if (it != _map.end())
|
||||||
return it->second;
|
return it->second;
|
||||||
else if (_previous)
|
else if (_previous)
|
||||||
|
|||||||
3
src/libs/3rdparty/cplusplus/Templates.h
vendored
@@ -24,6 +24,7 @@
|
|||||||
#include "CPlusPlusForwardDeclarations.h"
|
#include "CPlusPlusForwardDeclarations.h"
|
||||||
#include "TypeVisitor.h"
|
#include "TypeVisitor.h"
|
||||||
#include "FullySpecifiedType.h"
|
#include "FullySpecifiedType.h"
|
||||||
|
#include "Name.h"
|
||||||
#include "NameVisitor.h"
|
#include "NameVisitor.h"
|
||||||
#include "SymbolVisitor.h"
|
#include "SymbolVisitor.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
@@ -56,7 +57,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
Control *_control;
|
Control *_control;
|
||||||
Subst *_previous;
|
Subst *_previous;
|
||||||
std::map<const Name *, FullySpecifiedType> _map;
|
std::map<const Name *, FullySpecifiedType, Name::Compare> _map;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CPLUSPLUS_EXPORT CloneType: protected TypeVisitor
|
class CPLUSPLUS_EXPORT CloneType: protected TypeVisitor
|
||||||
|
|||||||
@@ -120,21 +120,12 @@ bool compareFullyQualifiedName(const QList<const Name *> &path, const QList<cons
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClassOrNamespace::CompareName::operator()(const Name *name, const Name *other) const
|
|
||||||
{
|
|
||||||
Q_ASSERT(name != 0);
|
|
||||||
Q_ASSERT(other != 0);
|
|
||||||
|
|
||||||
const Identifier *id = name->identifier();
|
|
||||||
const Identifier *otherId = other->identifier();
|
|
||||||
return strcmp(id->chars(), otherId->chars()) < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
// LookupContext
|
// LookupContext
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
LookupContext::LookupContext()
|
LookupContext::LookupContext()
|
||||||
: _control(new Control())
|
: _control(new Control())
|
||||||
|
, m_expandTemplates(false)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
LookupContext::LookupContext(Document::Ptr thisDocument,
|
LookupContext::LookupContext(Document::Ptr thisDocument,
|
||||||
@@ -142,7 +133,8 @@ LookupContext::LookupContext(Document::Ptr thisDocument,
|
|||||||
: _expressionDocument(Document::create("<LookupContext>")),
|
: _expressionDocument(Document::create("<LookupContext>")),
|
||||||
_thisDocument(thisDocument),
|
_thisDocument(thisDocument),
|
||||||
_snapshot(snapshot),
|
_snapshot(snapshot),
|
||||||
_control(new Control())
|
_control(new Control()),
|
||||||
|
m_expandTemplates(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,7 +144,8 @@ LookupContext::LookupContext(Document::Ptr expressionDocument,
|
|||||||
: _expressionDocument(expressionDocument),
|
: _expressionDocument(expressionDocument),
|
||||||
_thisDocument(thisDocument),
|
_thisDocument(thisDocument),
|
||||||
_snapshot(snapshot),
|
_snapshot(snapshot),
|
||||||
_control(new Control())
|
_control(new Control()),
|
||||||
|
m_expandTemplates(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +154,8 @@ LookupContext::LookupContext(const LookupContext &other)
|
|||||||
_thisDocument(other._thisDocument),
|
_thisDocument(other._thisDocument),
|
||||||
_snapshot(other._snapshot),
|
_snapshot(other._snapshot),
|
||||||
_bindings(other._bindings),
|
_bindings(other._bindings),
|
||||||
_control(other._control)
|
_control(other._control),
|
||||||
|
m_expandTemplates(other.m_expandTemplates)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
LookupContext &LookupContext::operator = (const LookupContext &other)
|
LookupContext &LookupContext::operator = (const LookupContext &other)
|
||||||
@@ -171,6 +165,7 @@ LookupContext &LookupContext::operator = (const LookupContext &other)
|
|||||||
_snapshot = other._snapshot;
|
_snapshot = other._snapshot;
|
||||||
_bindings = other._bindings;
|
_bindings = other._bindings;
|
||||||
_control = other._control;
|
_control = other._control;
|
||||||
|
m_expandTemplates = other.m_expandTemplates;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,8 +222,10 @@ const Name *LookupContext::minimalName(Symbol *symbol, ClassOrNamespace *target,
|
|||||||
|
|
||||||
QSharedPointer<CreateBindings> LookupContext::bindings() const
|
QSharedPointer<CreateBindings> LookupContext::bindings() const
|
||||||
{
|
{
|
||||||
if (! _bindings)
|
if (! _bindings) {
|
||||||
_bindings = QSharedPointer<CreateBindings>(new CreateBindings(_thisDocument, _snapshot, control()));
|
_bindings = QSharedPointer<CreateBindings>(new CreateBindings(_thisDocument, _snapshot, control()));
|
||||||
|
_bindings->setExpandTemplates(m_expandTemplates);
|
||||||
|
}
|
||||||
|
|
||||||
return _bindings;
|
return _bindings;
|
||||||
}
|
}
|
||||||
@@ -728,7 +725,6 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
|
|||||||
instantiation->_instantiationOrigin = origin;
|
instantiation->_instantiationOrigin = origin;
|
||||||
|
|
||||||
// The instantiation should have all symbols, enums, and usings from the reference.
|
// The instantiation should have all symbols, enums, and usings from the reference.
|
||||||
instantiation->_symbols.append(reference->symbols());
|
|
||||||
instantiation->_enums.append(reference->enums());
|
instantiation->_enums.append(reference->enums());
|
||||||
instantiation->_usings.append(reference->usings());
|
instantiation->_usings.append(reference->usings());
|
||||||
|
|
||||||
@@ -736,6 +732,28 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
|
|||||||
// now must worry about dependent names in base classes.
|
// now must worry about dependent names in base classes.
|
||||||
if (Template *templ = referenceClass->enclosingTemplate()) {
|
if (Template *templ = referenceClass->enclosingTemplate()) {
|
||||||
const unsigned argumentCount = templId->templateArgumentCount();
|
const unsigned argumentCount = templId->templateArgumentCount();
|
||||||
|
|
||||||
|
if (_factory->expandTemplates()) {
|
||||||
|
Subst subst(_control.data());
|
||||||
|
for (unsigned i = 0, ei = std::min(argumentCount, templ->templateParameterCount()); i < ei; ++i) {
|
||||||
|
const TypenameArgument *tParam = templ->templateParameterAt(i)->asTypenameArgument();
|
||||||
|
if (!tParam)
|
||||||
|
continue;
|
||||||
|
const Name *name = tParam->name();
|
||||||
|
if (!name)
|
||||||
|
continue;
|
||||||
|
const FullySpecifiedType &ty = templId->templateArgumentAt(i);
|
||||||
|
subst.bind(name, ty);
|
||||||
|
}
|
||||||
|
|
||||||
|
Clone cloner(_control.data());
|
||||||
|
foreach (Symbol *s, reference->symbols()) {
|
||||||
|
instantiation->_symbols.append(cloner.symbol(s, &subst));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
instantiation->_symbols.append(reference->symbols());
|
||||||
|
}
|
||||||
|
|
||||||
QHash<const Name*, unsigned> templParams;
|
QHash<const Name*, unsigned> templParams;
|
||||||
for (unsigned i = 0; i < templ->templateParameterCount(); ++i)
|
for (unsigned i = 0; i < templ->templateParameterCount(); ++i)
|
||||||
templParams.insert(templ->templateParameterAt(i)->name(), i);
|
templParams.insert(templ->templateParameterAt(i)->name(), i);
|
||||||
@@ -794,6 +812,8 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
|
|||||||
if (baseBinding && !knownUsings.contains(baseBinding))
|
if (baseBinding && !knownUsings.contains(baseBinding))
|
||||||
instantiation->addUsing(baseBinding);
|
instantiation->addUsing(baseBinding);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
instantiation->_symbols.append(reference->symbols());
|
||||||
}
|
}
|
||||||
|
|
||||||
_alreadyConsideredTemplates.clear(templId);
|
_alreadyConsideredTemplates.clear(templId);
|
||||||
@@ -907,7 +927,7 @@ ClassOrNamespace *ClassOrNamespace::findOrCreateType(const Name *name, ClassOrNa
|
|||||||
}
|
}
|
||||||
|
|
||||||
CreateBindings::CreateBindings(Document::Ptr thisDocument, const Snapshot &snapshot, QSharedPointer<Control> control)
|
CreateBindings::CreateBindings(Document::Ptr thisDocument, const Snapshot &snapshot, QSharedPointer<Control> control)
|
||||||
: _snapshot(snapshot), _control(control)
|
: _snapshot(snapshot), _control(control), _expandTemplates(false)
|
||||||
{
|
{
|
||||||
_globalNamespace = allocClassOrNamespace(/*parent = */ 0);
|
_globalNamespace = allocClassOrNamespace(/*parent = */ 0);
|
||||||
_currentClassOrNamespace = _globalNamespace;
|
_currentClassOrNamespace = _globalNamespace;
|
||||||
|
|||||||
@@ -119,12 +119,7 @@ private:
|
|||||||
ClassOrNamespace *nestedType(const Name *name, ClassOrNamespace *origin);
|
ClassOrNamespace *nestedType(const Name *name, ClassOrNamespace *origin);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct CompareName: std::binary_function<const Name *, const Name *, bool> {
|
typedef std::map<const Name *, ClassOrNamespace *, Name::Compare> Table;
|
||||||
bool operator()(const Name *name, const Name *other) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef std::map<const Name *, ClassOrNamespace *, CompareName> Table;
|
|
||||||
CreateBindings *_factory;
|
CreateBindings *_factory;
|
||||||
ClassOrNamespace *_parent;
|
ClassOrNamespace *_parent;
|
||||||
QList<Symbol *> _symbols;
|
QList<Symbol *> _symbols;
|
||||||
@@ -163,6 +158,11 @@ public:
|
|||||||
/// \internal
|
/// \internal
|
||||||
QSharedPointer<Control> control() const;
|
QSharedPointer<Control> control() const;
|
||||||
|
|
||||||
|
bool expandTemplates() const
|
||||||
|
{ return _expandTemplates; }
|
||||||
|
void setExpandTemplates(bool expandTemplates)
|
||||||
|
{ _expandTemplates = expandTemplates; }
|
||||||
|
|
||||||
/// Searches in \a scope for symbols with the given \a name.
|
/// Searches in \a scope for symbols with the given \a name.
|
||||||
/// Store the result in \a results.
|
/// Store the result in \a results.
|
||||||
/// \internal
|
/// \internal
|
||||||
@@ -223,6 +223,7 @@ private:
|
|||||||
QList<ClassOrNamespace *> _entities;
|
QList<ClassOrNamespace *> _entities;
|
||||||
ClassOrNamespace *_globalNamespace;
|
ClassOrNamespace *_globalNamespace;
|
||||||
ClassOrNamespace *_currentClassOrNamespace;
|
ClassOrNamespace *_currentClassOrNamespace;
|
||||||
|
bool _expandTemplates;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CPLUSPLUS_EXPORT LookupContext
|
class CPLUSPLUS_EXPORT LookupContext
|
||||||
@@ -265,6 +266,9 @@ public:
|
|||||||
|
|
||||||
static const Name *minimalName(Symbol *symbol, ClassOrNamespace *target, Control *control);
|
static const Name *minimalName(Symbol *symbol, ClassOrNamespace *target, Control *control);
|
||||||
|
|
||||||
|
void setExpandTemplates(bool expandTemplates)
|
||||||
|
{ m_expandTemplates = expandTemplates; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// The current expression.
|
// The current expression.
|
||||||
Document::Ptr _expressionDocument;
|
Document::Ptr _expressionDocument;
|
||||||
@@ -279,6 +283,8 @@ private:
|
|||||||
mutable QSharedPointer<CreateBindings> _bindings;
|
mutable QSharedPointer<CreateBindings> _bindings;
|
||||||
|
|
||||||
QSharedPointer<Control> _control;
|
QSharedPointer<Control> _control;
|
||||||
|
|
||||||
|
bool m_expandTemplates;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool CPLUSPLUS_EXPORT compareName(const Name *name, const Name *other);
|
bool CPLUSPLUS_EXPORT compareName(const Name *name, const Name *other);
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ using namespace CPlusPlus;
|
|||||||
|
|
||||||
TypeOfExpression::TypeOfExpression():
|
TypeOfExpression::TypeOfExpression():
|
||||||
m_ast(0),
|
m_ast(0),
|
||||||
m_scope(0)
|
m_scope(0),
|
||||||
|
m_expandTemplates(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,6 +108,7 @@ QList<LookupItem> TypeOfExpression::operator()(ExpressionAST *expression,
|
|||||||
|
|
||||||
m_lookupContext = LookupContext(document, m_thisDocument, m_snapshot);
|
m_lookupContext = LookupContext(document, m_thisDocument, m_snapshot);
|
||||||
m_lookupContext.setBindings(m_bindings);
|
m_lookupContext.setBindings(m_bindings);
|
||||||
|
m_lookupContext.setExpandTemplates(m_expandTemplates);
|
||||||
|
|
||||||
ResolveExpression resolve(m_lookupContext);
|
ResolveExpression resolve(m_lookupContext);
|
||||||
const QList<LookupItem> items = resolve(m_ast, scope);
|
const QList<LookupItem> items = resolve(m_ast, scope);
|
||||||
@@ -127,6 +129,7 @@ QList<LookupItem> TypeOfExpression::reference(ExpressionAST *expression,
|
|||||||
|
|
||||||
m_lookupContext = LookupContext(document, m_thisDocument, m_snapshot);
|
m_lookupContext = LookupContext(document, m_thisDocument, m_snapshot);
|
||||||
m_lookupContext.setBindings(m_bindings);
|
m_lookupContext.setBindings(m_bindings);
|
||||||
|
m_lookupContext.setExpandTemplates(m_expandTemplates);
|
||||||
|
|
||||||
ResolveExpression resolve(m_lookupContext);
|
ResolveExpression resolve(m_lookupContext);
|
||||||
const QList<LookupItem> items = resolve.reference(m_ast, scope);
|
const QList<LookupItem> items = resolve.reference(m_ast, scope);
|
||||||
|
|||||||
@@ -123,6 +123,9 @@ public:
|
|||||||
ExpressionAST *expressionAST() const;
|
ExpressionAST *expressionAST() const;
|
||||||
QByteArray preprocessedExpression(const QByteArray &utf8code) const;
|
QByteArray preprocessedExpression(const QByteArray &utf8code) const;
|
||||||
|
|
||||||
|
void setExpandTemplates(bool expandTemplates)
|
||||||
|
{ m_expandTemplates = expandTemplates; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void processEnvironment(Document::Ptr doc, Environment *env,
|
void processEnvironment(Document::Ptr doc, Environment *env,
|
||||||
@@ -137,6 +140,8 @@ private:
|
|||||||
Scope *m_scope;
|
Scope *m_scope;
|
||||||
LookupContext m_lookupContext;
|
LookupContext m_lookupContext;
|
||||||
mutable QSharedPointer<Environment> m_environment;
|
mutable QSharedPointer<Environment> m_environment;
|
||||||
|
|
||||||
|
bool m_expandTemplates;
|
||||||
};
|
};
|
||||||
|
|
||||||
ExpressionAST CPLUSPLUS_EXPORT *extractExpressionAST(Document::Ptr doc);
|
ExpressionAST CPLUSPLUS_EXPORT *extractExpressionAST(Document::Ptr doc);
|
||||||
|
|||||||
@@ -188,9 +188,15 @@ void SshChannelManager::insertChannel(AbstractSshChannel *priv,
|
|||||||
|
|
||||||
int SshChannelManager::closeAllChannels(CloseAllMode mode)
|
int SshChannelManager::closeAllChannels(CloseAllMode mode)
|
||||||
{
|
{
|
||||||
const int count = m_channels.count();
|
int count = 0;
|
||||||
for (ChannelIterator it = m_channels.begin(); it != m_channels.end(); ++it)
|
for (ChannelIterator it = m_channels.begin(); it != m_channels.end(); ++it) {
|
||||||
it.value()->closeChannel();
|
AbstractSshChannel * const channel = it.value();
|
||||||
|
QSSH_ASSERT(channel->channelState() != AbstractSshChannel::Closed);
|
||||||
|
if (channel->channelState() != AbstractSshChannel::CloseRequested) {
|
||||||
|
channel->closeChannel();
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (mode == CloseAllAndReset) {
|
if (mode == CloseAllAndReset) {
|
||||||
m_channels.clear();
|
m_channels.clear();
|
||||||
m_sessions.clear();
|
m_sessions.clear();
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ using namespace Internal;
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const char BUILD_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory";
|
const char BUILD_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory";
|
||||||
|
const char USE_NINJA_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.UseNinja";
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) :
|
CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) :
|
||||||
@@ -74,6 +75,7 @@ QVariantMap CMakeBuildConfiguration::toMap() const
|
|||||||
{
|
{
|
||||||
QVariantMap map(ProjectExplorer::BuildConfiguration::toMap());
|
QVariantMap map(ProjectExplorer::BuildConfiguration::toMap());
|
||||||
map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
|
map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
|
||||||
|
map.insert(QLatin1String(USE_NINJA_KEY), m_useNinja);
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,6 +85,7 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
|
m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
|
||||||
|
m_useNinja = map.value(QLatin1String(USE_NINJA_KEY), false).toBool();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -228,6 +228,78 @@ void CppToolsPlugin::test_completion_template_1()
|
|||||||
QVERIFY(!completions.contains("func"));
|
QVERIFY(!completions.contains("func"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CppToolsPlugin::test_completion_template_2()
|
||||||
|
{
|
||||||
|
TestData data;
|
||||||
|
data.srcText = "\n"
|
||||||
|
"template <class T>\n"
|
||||||
|
"struct List\n"
|
||||||
|
"{\n"
|
||||||
|
" T &at(int);\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"struct Tupple { int a; int b; };\n"
|
||||||
|
"\n"
|
||||||
|
"void func() {\n"
|
||||||
|
" List<Tupple> l;\n"
|
||||||
|
" @\n"
|
||||||
|
" // padding so we get the scope right\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
setup(&data);
|
||||||
|
|
||||||
|
Utils::ChangeSet change;
|
||||||
|
QString txt = QLatin1String("l.at(0).");
|
||||||
|
change.insert(data.pos, txt);
|
||||||
|
QTextCursor cursor(data.doc);
|
||||||
|
change.apply(&cursor);
|
||||||
|
data.pos += txt.length();
|
||||||
|
|
||||||
|
QStringList completions = getCompletions(data);
|
||||||
|
|
||||||
|
QCOMPARE(completions.size(), 3);
|
||||||
|
QVERIFY(completions.contains("Tupple"));
|
||||||
|
QVERIFY(completions.contains("a"));
|
||||||
|
QVERIFY(completions.contains("b"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CppToolsPlugin::test_completion_template_3()
|
||||||
|
{
|
||||||
|
TestData data;
|
||||||
|
data.srcText = "\n"
|
||||||
|
"template <class T>\n"
|
||||||
|
"struct List\n"
|
||||||
|
"{\n"
|
||||||
|
" T t;\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"struct Tupple { int a; int b; };\n"
|
||||||
|
"\n"
|
||||||
|
"void func() {\n"
|
||||||
|
" List<Tupple> l;\n"
|
||||||
|
" @\n"
|
||||||
|
" // padding so we get the scope right\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
setup(&data);
|
||||||
|
|
||||||
|
Utils::ChangeSet change;
|
||||||
|
QString txt = QLatin1String("l.t.");
|
||||||
|
change.insert(data.pos, txt);
|
||||||
|
QTextCursor cursor(data.doc);
|
||||||
|
change.apply(&cursor);
|
||||||
|
data.pos += txt.length();
|
||||||
|
|
||||||
|
QStringList completions = getCompletions(data);
|
||||||
|
|
||||||
|
QCOMPARE(completions.size(), 3);
|
||||||
|
QVERIFY(completions.contains("Tupple"));
|
||||||
|
QVERIFY(completions.contains("a"));
|
||||||
|
QVERIFY(completions.contains("b"));
|
||||||
|
QVERIFY(completions.contains("a"));
|
||||||
|
QVERIFY(completions.contains("b"));
|
||||||
|
}
|
||||||
|
|
||||||
void CppToolsPlugin::test_completion()
|
void CppToolsPlugin::test_completion()
|
||||||
{
|
{
|
||||||
QFETCH(QByteArray, code);
|
QFETCH(QByteArray, code);
|
||||||
|
|||||||
@@ -102,7 +102,9 @@ public:
|
|||||||
, m_completionOperator(T_EOF_SYMBOL)
|
, m_completionOperator(T_EOF_SYMBOL)
|
||||||
, m_replaceDotForArrow(false)
|
, m_replaceDotForArrow(false)
|
||||||
, m_typeOfExpression(new TypeOfExpression)
|
, m_typeOfExpression(new TypeOfExpression)
|
||||||
{}
|
{
|
||||||
|
m_typeOfExpression->setExpandTemplates(true);
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool isSortable(const QString &prefix) const;
|
virtual bool isSortable(const QString &prefix) const;
|
||||||
virtual IAssistProposalItem *proposalItem(int index) const;
|
virtual IAssistProposalItem *proposalItem(int index) const;
|
||||||
@@ -831,7 +833,8 @@ int CppCompletionAssistProcessor::startOfOperator(int pos,
|
|||||||
else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) ||
|
else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) ||
|
||||||
(tk.isLiteral() && (*kind != T_STRING_LITERAL
|
(tk.isLiteral() && (*kind != T_STRING_LITERAL
|
||||||
&& *kind != T_ANGLE_STRING_LITERAL
|
&& *kind != T_ANGLE_STRING_LITERAL
|
||||||
&& *kind != T_SLASH))) {
|
&& *kind != T_SLASH
|
||||||
|
&& *kind != T_DOT))) {
|
||||||
*kind = T_EOF_SYMBOL;
|
*kind = T_EOF_SYMBOL;
|
||||||
start = pos;
|
start = pos;
|
||||||
}
|
}
|
||||||
@@ -858,7 +861,8 @@ int CppCompletionAssistProcessor::startOfOperator(int pos,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Check for include preprocessor directive
|
// Check for include preprocessor directive
|
||||||
else if (*kind == T_STRING_LITERAL || *kind == T_ANGLE_STRING_LITERAL || *kind == T_SLASH) {
|
else if (*kind == T_STRING_LITERAL || *kind == T_ANGLE_STRING_LITERAL|| *kind == T_SLASH
|
||||||
|
|| (*kind == T_DOT && (tk.is(T_STRING_LITERAL) || tk.is(T_ANGLE_STRING_LITERAL)))) {
|
||||||
bool include = false;
|
bool include = false;
|
||||||
if (tokens.size() >= 3) {
|
if (tokens.size() >= 3) {
|
||||||
if (tokens.at(0).is(T_POUND) && tokens.at(1).is(T_IDENTIFIER) && (tokens.at(2).is(T_STRING_LITERAL) ||
|
if (tokens.at(0).is(T_POUND) && tokens.at(1).is(T_IDENTIFIER) && (tokens.at(2).is(T_STRING_LITERAL) ||
|
||||||
@@ -877,6 +881,14 @@ int CppCompletionAssistProcessor::startOfOperator(int pos,
|
|||||||
if (!include) {
|
if (!include) {
|
||||||
*kind = T_EOF_SYMBOL;
|
*kind = T_EOF_SYMBOL;
|
||||||
start = pos;
|
start = pos;
|
||||||
|
} else {
|
||||||
|
if (*kind == T_DOT) {
|
||||||
|
start = findStartOfName(start);
|
||||||
|
const QChar ch4 = start > -1 ? m_interface->characterAt(start - 1) : QChar();
|
||||||
|
const QChar ch5 = start > 0 ? m_interface->characterAt(start - 2) : QChar();
|
||||||
|
const QChar ch6 = start > 1 ? m_interface->characterAt(start - 3) : QChar();
|
||||||
|
start = start - CppCompletionAssistProvider::activationSequenceChar(ch4, ch5, ch6, kind, wantFunctionCall);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -943,7 +955,7 @@ int CppCompletionAssistProcessor::startCompletionHelper()
|
|||||||
QTextCursor c(m_interface->textDocument());
|
QTextCursor c(m_interface->textDocument());
|
||||||
c.setPosition(endOfExpression);
|
c.setPosition(endOfExpression);
|
||||||
if (completeInclude(c))
|
if (completeInclude(c))
|
||||||
m_startPosition = startOfName;
|
m_startPosition = endOfExpression + 1;
|
||||||
return m_startPosition;
|
return m_startPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,8 @@ private slots:
|
|||||||
void test_completion_forward_declarations_present();
|
void test_completion_forward_declarations_present();
|
||||||
void test_completion_basic_1();
|
void test_completion_basic_1();
|
||||||
void test_completion_template_1();
|
void test_completion_template_1();
|
||||||
|
void test_completion_template_2();
|
||||||
|
void test_completion_template_3();
|
||||||
void test_completion_template_as_base();
|
void test_completion_template_as_base();
|
||||||
void test_completion_template_as_base_data();
|
void test_completion_template_as_base_data();
|
||||||
void test_completion_use_global_identifier_as_base_class();
|
void test_completion_use_global_identifier_as_base_class();
|
||||||
|
|||||||
@@ -191,9 +191,8 @@ void SelectRemoteFileDialog::handleRemoteError(const QString &errorMessage)
|
|||||||
|
|
||||||
void SelectRemoteFileDialog::selectFile()
|
void SelectRemoteFileDialog::selectFile()
|
||||||
{
|
{
|
||||||
const QModelIndexList indexes =
|
QModelIndex idx = m_model.mapToSource(m_fileSystemView->currentIndex());
|
||||||
m_fileSystemView->selectionModel()->selectedIndexes();
|
if (!idx.isValid())
|
||||||
if (indexes.empty())
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
|
m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
|
||||||
@@ -208,7 +207,6 @@ void SelectRemoteFileDialog::selectFile()
|
|||||||
m_localFile = localFile.fileName();
|
m_localFile = localFile.fileName();
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex idx = indexes.at(0);
|
|
||||||
idx = idx.sibling(idx.row(), 1);
|
idx = idx.sibling(idx.row(), 1);
|
||||||
m_remoteFile = m_fileSystemModel.data(idx, SftpFileSystemModel::PathRole).toString();
|
m_remoteFile = m_fileSystemModel.data(idx, SftpFileSystemModel::PathRole).toString();
|
||||||
m_sftpJobId = m_fileSystemModel.downloadFile(idx, m_localFile);
|
m_sftpJobId = m_fileSystemModel.downloadFile(idx, m_localFile);
|
||||||
@@ -297,9 +295,11 @@ AttachCoreDialog::AttachCoreDialog(QWidget *parent)
|
|||||||
|
|
||||||
connect(d->selectRemoteCoreButton, SIGNAL(clicked()), SLOT(selectRemoteCoreFile()));
|
connect(d->selectRemoteCoreButton, SIGNAL(clicked()), SLOT(selectRemoteCoreFile()));
|
||||||
connect(d->remoteCoreFileName, SIGNAL(textChanged(QString)), SLOT(changed()));
|
connect(d->remoteCoreFileName, SIGNAL(textChanged(QString)), SLOT(changed()));
|
||||||
|
connect(d->localCoreFileName, SIGNAL(changed(QString)), SLOT(changed()));
|
||||||
connect(d->kitChooser, SIGNAL(activated(int)), SLOT(changed()));
|
connect(d->kitChooser, SIGNAL(activated(int)), SLOT(changed()));
|
||||||
connect(d->buttonBox, SIGNAL(rejected()), SLOT(reject()));
|
connect(d->buttonBox, SIGNAL(rejected()), SLOT(reject()));
|
||||||
connect(d->buttonBox, SIGNAL(accepted()), SLOT(accept()));
|
connect(d->buttonBox, SIGNAL(accepted()), SLOT(accept()));
|
||||||
|
changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
AttachCoreDialog::~AttachCoreDialog()
|
AttachCoreDialog::~AttachCoreDialog()
|
||||||
@@ -321,19 +321,22 @@ bool AttachCoreDialog::isLocal() const
|
|||||||
|
|
||||||
void AttachCoreDialog::changed()
|
void AttachCoreDialog::changed()
|
||||||
{
|
{
|
||||||
bool isValid = d->kitChooser->currentIndex() >= 0
|
bool isValid = d->kitChooser->currentIndex() >= 0 && d->localExecFileName->isValid();
|
||||||
&& !localCoreFile().isEmpty();
|
|
||||||
d->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(isValid);
|
|
||||||
|
|
||||||
if (isLocal()) {
|
if (isLocal()) {
|
||||||
d->localCoreFileName->setVisible(true);
|
d->localCoreFileName->setVisible(true);
|
||||||
d->remoteCoreFileName->setVisible(false);
|
d->remoteCoreFileName->setVisible(false);
|
||||||
d->selectRemoteCoreButton->setVisible(false);
|
d->selectRemoteCoreButton->setVisible(false);
|
||||||
|
if (isValid)
|
||||||
|
isValid = d->localCoreFileName->isValid();
|
||||||
} else {
|
} else {
|
||||||
d->remoteCoreFileName->setVisible(true);
|
d->remoteCoreFileName->setVisible(true);
|
||||||
d->selectRemoteCoreButton->setVisible(true);
|
d->selectRemoteCoreButton->setVisible(true);
|
||||||
d->localCoreFileName->setVisible(false);
|
d->localCoreFileName->setVisible(false);
|
||||||
|
if (isValid)
|
||||||
|
isValid = !remoteCoreFile().isEmpty();
|
||||||
}
|
}
|
||||||
|
d->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(isValid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AttachCoreDialog::selectRemoteCoreFile()
|
void AttachCoreDialog::selectRemoteCoreFile()
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ namespace Internal {
|
|||||||
LocalsAndExpressionsWindow::LocalsAndExpressionsWindow(
|
LocalsAndExpressionsWindow::LocalsAndExpressionsWindow(
|
||||||
QWidget *locals, QWidget *inspector, QWidget *returnWidget,
|
QWidget *locals, QWidget *inspector, QWidget *returnWidget,
|
||||||
QWidget *watchers, QWidget *parent)
|
QWidget *watchers, QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent),
|
||||||
|
m_showLocals(false)
|
||||||
{
|
{
|
||||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||||
layout->setMargin(0);
|
layout->setMargin(0);
|
||||||
@@ -62,11 +63,23 @@ LocalsAndExpressionsWindow::LocalsAndExpressionsWindow(
|
|||||||
m_splitter->setStretchFactor(0, 3);
|
m_splitter->setStretchFactor(0, 3);
|
||||||
m_splitter->setStretchFactor(2, 1);
|
m_splitter->setStretchFactor(2, 1);
|
||||||
m_splitter->setStretchFactor(3, 1);
|
m_splitter->setStretchFactor(3, 1);
|
||||||
|
|
||||||
|
// Timer is to prevent flicker when switching between Inpector and Locals
|
||||||
|
// when debugger engine changes states.
|
||||||
|
m_timer.setSingleShot(true);
|
||||||
|
m_timer.setInterval(500); // TODO: remove the magic number!
|
||||||
|
connect(&m_timer, SIGNAL(timeout()), SLOT(showLocals()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalsAndExpressionsWindow::setShowLocals(bool showLocals)
|
void LocalsAndExpressionsWindow::setShowLocals(bool showLocals)
|
||||||
{
|
{
|
||||||
m_localsAndInspector->setCurrentIndex(showLocals ? 0 : 1);
|
m_showLocals = showLocals;
|
||||||
|
m_timer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocalsAndExpressionsWindow::showLocals()
|
||||||
|
{
|
||||||
|
m_localsAndInspector->setCurrentIndex(m_showLocals ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#define LOCALSANDEXPRESSIONSWINDOW_H
|
#define LOCALSANDEXPRESSIONSWINDOW_H
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QSplitter;
|
class QSplitter;
|
||||||
@@ -50,9 +51,14 @@ public:
|
|||||||
|
|
||||||
void setShowLocals(bool showLocals);
|
void setShowLocals(bool showLocals);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void showLocals();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSplitter *m_splitter;
|
QSplitter *m_splitter;
|
||||||
QStackedWidget *m_localsAndInspector;
|
QStackedWidget *m_localsAndInspector;
|
||||||
|
QTimer m_timer;
|
||||||
|
bool m_showLocals;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ public:
|
|||||||
|
|
||||||
signals:
|
signals:
|
||||||
void newStatus(QmlDebug::ClientStatus status);
|
void newStatus(QmlDebug::ClientStatus status);
|
||||||
|
void stackFrameCompleted();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void statusChanged(QmlDebug::ClientStatus status);
|
virtual void statusChanged(QmlDebug::ClientStatus status);
|
||||||
|
|||||||
@@ -1014,9 +1014,8 @@ void QmlEngine::updateWatchData(const WatchData &data,
|
|||||||
synchronizeWatchers();
|
synchronizeWatchers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!data.isSomethingNeeded())
|
if (!data.isSomethingNeeded())
|
||||||
watchHandler()->insertIncompleteData(data);
|
watchHandler()->insertData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlEngine::synchronizeWatchers()
|
void QmlEngine::synchronizeWatchers()
|
||||||
|
|||||||
@@ -115,15 +115,6 @@ void QmlInspectorAgent::updateWatchData(const WatchData &data)
|
|||||||
|
|
||||||
if (data.id && !m_fetchDataIds.contains(data.id)) {
|
if (data.id && !m_fetchDataIds.contains(data.id)) {
|
||||||
// objects
|
// objects
|
||||||
using namespace QmlDebug::Constants;
|
|
||||||
if (m_engineClient->objectName() == QLatin1String(QDECLARATIVE_ENGINE)) {
|
|
||||||
int parentId = parentIdForIname(data.iname);
|
|
||||||
if (parentId != -1) {
|
|
||||||
QList<int> childIds = m_debugIdChildIds.value(parentId);
|
|
||||||
childIds << data.id;
|
|
||||||
m_debugIdChildIds.insert(parentId, childIds);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_fetchDataIds << data.id;
|
m_fetchDataIds << data.id;
|
||||||
fetchObject(data.id);
|
fetchObject(data.id);
|
||||||
}
|
}
|
||||||
@@ -461,7 +452,6 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_objectTreeQueryIds.contains(queryId)) {
|
if (m_objectTreeQueryIds.contains(queryId)) {
|
||||||
m_objectTreeQueryIds.removeOne(queryId);
|
|
||||||
if (value.type() == QVariant::List) {
|
if (value.type() == QVariant::List) {
|
||||||
QVariantList objList = value.toList();
|
QVariantList objList = value.toList();
|
||||||
foreach (QVariant var, objList) {
|
foreach (QVariant var, objList) {
|
||||||
@@ -472,6 +462,7 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value,
|
|||||||
} else {
|
} else {
|
||||||
insertObjectInTree(qvariant_cast<ObjectReference>(value));
|
insertObjectInTree(qvariant_cast<ObjectReference>(value));
|
||||||
}
|
}
|
||||||
|
m_objectTreeQueryIds.removeOne(queryId);
|
||||||
} else if (queryId == m_engineQueryId) {
|
} else if (queryId == m_engineQueryId) {
|
||||||
m_engineQueryId = 0;
|
m_engineQueryId = 0;
|
||||||
QList<EngineReference> engines = qvariant_cast<QList<EngineReference> >(value);
|
QList<EngineReference> engines = qvariant_cast<QList<EngineReference> >(value);
|
||||||
@@ -492,7 +483,7 @@ void QmlInspectorAgent::onResult(quint32 queryId, const QVariant &value,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlInspectorAgent::newObject(int engineId, int objectId, int /*parentId*/)
|
void QmlInspectorAgent::newObject(int engineId, int /*objectId*/, int /*parentId*/)
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
qDebug() << __FUNCTION__ << "()";
|
qDebug() << __FUNCTION__ << "()";
|
||||||
@@ -502,10 +493,7 @@ void QmlInspectorAgent::newObject(int engineId, int objectId, int /*parentId*/)
|
|||||||
if (m_engine.debugId() != engineId)
|
if (m_engine.debugId() != engineId)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_newObjectsCreated = true;
|
// TODO: FIX THIS for qt 5.x (Needs update in the qt side)
|
||||||
if (m_engineClient->objectName() != QLatin1String(QDECLARATIVE_ENGINE))
|
|
||||||
fetchObject(objectId);
|
|
||||||
else
|
|
||||||
m_delayQueryTimer.start();
|
m_delayQueryTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -634,75 +622,29 @@ void QmlInspectorAgent::insertObjectInTree(const ObjectReference &object)
|
|||||||
if (!object.isValid())
|
if (!object.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_objectStack.push(object);
|
|
||||||
|
|
||||||
if (m_objectTreeQueryIds.count()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QElapsedTimer timeElapsed;
|
QElapsedTimer timeElapsed;
|
||||||
// sync tree with watchhandler
|
// sync tree with watchhandler
|
||||||
QList<WatchData> watchData;
|
QList<WatchData> watchData;
|
||||||
ObjectReference last;
|
int objectDebugId = object.debugId();
|
||||||
QStack<QmlDebug::ObjectReference> stack;
|
|
||||||
|
|
||||||
// qt <= 4.8.3
|
// When root items are inserted in the object tree, m_objectTreeQueryIds = 0
|
||||||
if (m_newObjectsCreated && m_engineClient->objectName() == QLatin1String(QDECLARATIVE_ENGINE)) {
|
if (!m_debugIdToIname.contains(objectDebugId) && m_objectTreeQueryIds.count())
|
||||||
// We need to reverse the stack as the root objects
|
|
||||||
// are pushed to the bottom since they are fetched first.
|
|
||||||
// The child objects need to placed in the correct position and therefore
|
|
||||||
// the m_debugIdChildIds needs to be populated first.
|
|
||||||
while (!m_objectStack.isEmpty())
|
|
||||||
stack.push(m_objectStack.pop());
|
|
||||||
} else {
|
|
||||||
stack = m_objectStack;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!stack.isEmpty()) {
|
|
||||||
last = stack.pop();
|
|
||||||
int parentId = last.parentId();
|
|
||||||
QByteArray parentIname;
|
|
||||||
|
|
||||||
// qt <= 4.8.3
|
|
||||||
if (m_engineClient->objectName() == QLatin1String(QDECLARATIVE_ENGINE)) {
|
|
||||||
QHashIterator<int, QList<int> > i(m_debugIdChildIds);
|
|
||||||
while (i.hasNext()) {
|
|
||||||
i.next();
|
|
||||||
if (i.value().contains(last.debugId())) {
|
|
||||||
parentId = i.key();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (m_debugIdToIname.contains(parentId))
|
|
||||||
parentIname = m_debugIdToIname.value(parentId);
|
|
||||||
if (!m_newObjectsCreated && parentId != -1 && parentIname.isEmpty()) {
|
|
||||||
fetchObject(parentId);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
// qt > 4.8.3
|
int parentId = parentIdForIname(m_debugIdToIname.value(objectDebugId));
|
||||||
if (m_engineClient->objectName() != QLatin1String(QDECLARATIVE_ENGINE)
|
|
||||||
&& m_newObjectsCreated && parentIname.isEmpty()) {
|
|
||||||
if (watchData.count())
|
|
||||||
break;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
timeElapsed.start();
|
timeElapsed.start();
|
||||||
watchData.append(buildWatchData(last, parentIname, true));
|
watchData.append(buildWatchData(object, m_debugIdToIname.value(parentId), true));
|
||||||
if (debug)
|
if (debug)
|
||||||
qDebug() << __FUNCTION__ << "Time: Build Watch Data took "
|
qDebug() << __FUNCTION__ << "Time: Build Watch Data took "
|
||||||
<< timeElapsed.elapsed() << " ms";
|
<< timeElapsed.elapsed() << " ms";
|
||||||
if (debug)
|
if (debug)
|
||||||
timeElapsed.start();
|
timeElapsed.start();
|
||||||
buildDebugIdHashRecursive(last);
|
buildDebugIdHashRecursive(object);
|
||||||
if (debug)
|
if (debug)
|
||||||
qDebug() << __FUNCTION__ << "Time: Build Debug Id Hash took "
|
qDebug() << __FUNCTION__ << "Time: Build Debug Id Hash took "
|
||||||
<< timeElapsed.elapsed() << " ms";
|
<< timeElapsed.elapsed() << " ms";
|
||||||
}
|
|
||||||
m_newObjectsCreated = false;
|
|
||||||
m_objectStack.clear();
|
|
||||||
|
|
||||||
WatchHandler *watchHandler = m_debuggerEngine->watchHandler();
|
WatchHandler *watchHandler = m_debuggerEngine->watchHandler();
|
||||||
if (debug)
|
if (debug)
|
||||||
@@ -712,9 +654,9 @@ void QmlInspectorAgent::insertObjectInTree(const ObjectReference &object)
|
|||||||
qDebug() << __FUNCTION__ << "Time: Insertion took " << timeElapsed.elapsed() << " ms";
|
qDebug() << __FUNCTION__ << "Time: Insertion took " << timeElapsed.elapsed() << " ms";
|
||||||
|
|
||||||
emit objectTreeUpdated();
|
emit objectTreeUpdated();
|
||||||
emit objectFetched(last);
|
emit objectFetched(object);
|
||||||
|
|
||||||
if (m_objectToSelect == last.debugId() || m_debugIdToIname.keys().contains(m_objectToSelect)) {
|
if (m_debugIdToIname.contains(m_objectToSelect)) {
|
||||||
// select item in view
|
// select item in view
|
||||||
QByteArray iname = m_debugIdToIname.value(m_objectToSelect);
|
QByteArray iname = m_debugIdToIname.value(m_objectToSelect);
|
||||||
if (debug)
|
if (debug)
|
||||||
@@ -753,18 +695,6 @@ void QmlInspectorAgent::buildDebugIdHashRecursive(const ObjectReference &ref)
|
|||||||
m_debugIdHash[file][location].append(ref.debugId());
|
m_debugIdHash[file][location].append(ref.debugId());
|
||||||
m_debugIdLocations.insert(ref.debugId(), FileReference(filePath, lineNum, colNum));
|
m_debugIdLocations.insert(ref.debugId(), FileReference(filePath, lineNum, colNum));
|
||||||
|
|
||||||
// qt <= 4.8.3
|
|
||||||
if (m_newObjectsCreated
|
|
||||||
&& m_engineClient->objectName() == QLatin1String(QDECLARATIVE_ENGINE)) {
|
|
||||||
QList<int> childIds = m_debugIdChildIds.value(ref.debugId());
|
|
||||||
foreach (const ObjectReference &c, ref.children()) {
|
|
||||||
childIds << c.debugId();
|
|
||||||
}
|
|
||||||
// For qt <= 4.8.3, we do not get the parentId. Hence, store the child ids
|
|
||||||
// to look up correct insertion places later
|
|
||||||
m_debugIdChildIds.insert(ref.debugId(), childIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (const ObjectReference &it, ref.children())
|
foreach (const ObjectReference &it, ref.children())
|
||||||
buildDebugIdHashRecursive(it);
|
buildDebugIdHashRecursive(it);
|
||||||
}
|
}
|
||||||
@@ -814,6 +744,13 @@ QList<WatchData> QmlInspectorAgent::buildWatchData(const ObjectReference &obj,
|
|||||||
|
|
||||||
list.append(objWatch);
|
list.append(objWatch);
|
||||||
addObjectWatch(objWatch.id);
|
addObjectWatch(objWatch.id);
|
||||||
|
if (m_debugIdToIname.contains(objDebugId)) {
|
||||||
|
// The data needs to be removed since we now know the parent and
|
||||||
|
// hence we can insert the data in the correct position
|
||||||
|
const QByteArray oldIname = m_debugIdToIname.value(objDebugId);
|
||||||
|
if (oldIname != objIname)
|
||||||
|
m_debuggerEngine->watchHandler()->removeData(oldIname);
|
||||||
|
}
|
||||||
m_debugIdToIname.insert(objDebugId, objIname);
|
m_debugIdToIname.insert(objDebugId, objIname);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -885,16 +822,13 @@ bool QmlInspectorAgent::isConnected() const
|
|||||||
|
|
||||||
void QmlInspectorAgent::clearObjectTree()
|
void QmlInspectorAgent::clearObjectTree()
|
||||||
{
|
{
|
||||||
// clear view
|
m_debuggerEngine->watchHandler()->removeAllData(true);
|
||||||
m_debuggerEngine->watchHandler()->cleanup();
|
|
||||||
|
|
||||||
m_objectTreeQueryIds.clear();
|
m_objectTreeQueryIds.clear();
|
||||||
m_fetchDataIds.clear();
|
m_fetchDataIds.clear();
|
||||||
int old_count = m_debugIdHash.count();
|
int old_count = m_debugIdHash.count();
|
||||||
m_debugIdHash.clear();
|
m_debugIdHash.clear();
|
||||||
m_debugIdHash.reserve(old_count + 1);
|
m_debugIdHash.reserve(old_count + 1);
|
||||||
m_debugIdToIname.clear();
|
m_debugIdToIname.clear();
|
||||||
m_debugIdChildIds.clear();
|
|
||||||
m_objectStack.clear();
|
m_objectStack.clear();
|
||||||
// reset only for qt > 4.8.3.
|
// reset only for qt > 4.8.3.
|
||||||
if (m_engineClient->objectName() != QLatin1String(QDECLARATIVE_ENGINE))
|
if (m_engineClient->objectName() != QLatin1String(QDECLARATIVE_ENGINE))
|
||||||
|
|||||||
@@ -137,7 +137,6 @@ private:
|
|||||||
QStack<QmlDebug::ObjectReference> m_objectStack;
|
QStack<QmlDebug::ObjectReference> m_objectStack;
|
||||||
QmlDebug::EngineReference m_engine;
|
QmlDebug::EngineReference m_engine;
|
||||||
QHash<int, QByteArray> m_debugIdToIname;
|
QHash<int, QByteArray> m_debugIdToIname;
|
||||||
QHash<int, QList<int> > m_debugIdChildIds; // This is for 4.x
|
|
||||||
QHash<int, QmlDebug::FileReference> m_debugIdLocations;
|
QHash<int, QmlDebug::FileReference> m_debugIdLocations;
|
||||||
DebugIdHash m_debugIdHash;
|
DebugIdHash m_debugIdHash;
|
||||||
|
|
||||||
|
|||||||
@@ -1152,6 +1152,7 @@ void QmlV8DebuggerClient::expandObject(const QByteArray &iname, quint64 objectId
|
|||||||
void QmlV8DebuggerClient::setEngine(QmlEngine *engine)
|
void QmlV8DebuggerClient::setEngine(QmlEngine *engine)
|
||||||
{
|
{
|
||||||
d->engine = engine;
|
d->engine = engine;
|
||||||
|
connect(this, SIGNAL(stackFrameCompleted()), engine, SIGNAL(stackFrameCompleted()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlV8DebuggerClient::getSourceFiles()
|
void QmlV8DebuggerClient::getSourceFiles()
|
||||||
@@ -1648,8 +1649,17 @@ void QmlV8DebuggerClient::setCurrentFrameDetails(const QVariant &bodyVal, const
|
|||||||
QVariantMap currentFrame = bodyVal.toMap();
|
QVariantMap currentFrame = bodyVal.toMap();
|
||||||
|
|
||||||
StackHandler *stackHandler = d->engine->stackHandler();
|
StackHandler *stackHandler = d->engine->stackHandler();
|
||||||
|
WatchHandler * watchHandler = d->engine->watchHandler();
|
||||||
d->clearCache();
|
d->clearCache();
|
||||||
|
|
||||||
|
const int frameIndex = stackHandler->currentIndex();
|
||||||
|
watchHandler->removeAllData();
|
||||||
|
if (frameIndex < 0)
|
||||||
|
return;
|
||||||
|
const StackFrame frame = stackHandler->currentFrame();
|
||||||
|
if (!frame.isUsable())
|
||||||
|
return;
|
||||||
|
|
||||||
//Set "this" variable
|
//Set "this" variable
|
||||||
{
|
{
|
||||||
WatchData data;
|
WatchData data;
|
||||||
@@ -1667,7 +1677,7 @@ void QmlV8DebuggerClient::setCurrentFrameDetails(const QVariant &bodyVal, const
|
|||||||
data.setHasChildren(true);
|
data.setHasChildren(true);
|
||||||
data.id = 0;
|
data.id = 0;
|
||||||
}
|
}
|
||||||
d->engine->watchHandler()->insertData(data);
|
watchHandler->insertData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QVariantList currentFrameScopes = currentFrame.value(_("scopes")).toList();
|
const QVariantList currentFrameScopes = currentFrame.value(_("scopes")).toList();
|
||||||
@@ -1681,6 +1691,7 @@ void QmlV8DebuggerClient::setCurrentFrameDetails(const QVariant &bodyVal, const
|
|||||||
d->scope(scopeIndex);
|
d->scope(scopeIndex);
|
||||||
}
|
}
|
||||||
d->engine->gotoLocation(stackHandler->currentFrame());
|
d->engine->gotoLocation(stackHandler->currentFrame());
|
||||||
|
emit stackFrameCompleted();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlV8DebuggerClient::updateScope(const QVariant &bodyVal, const QVariant &refsVal)
|
void QmlV8DebuggerClient::updateScope(const QVariant &bodyVal, const QVariant &refsVal)
|
||||||
|
|||||||
@@ -401,6 +401,7 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
|||||||
stream >> command;
|
stream >> command;
|
||||||
|
|
||||||
WatchHandler *watchHandler = d->engine->watchHandler();
|
WatchHandler *watchHandler = d->engine->watchHandler();
|
||||||
|
StackHandler *stackHandler = d->engine->stackHandler();
|
||||||
|
|
||||||
if (command == "STOPPED") {
|
if (command == "STOPPED") {
|
||||||
d->engine->inferiorSpontaneousStop();
|
d->engine->inferiorSpontaneousStop();
|
||||||
@@ -426,35 +427,7 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
|||||||
ideStackFrames << frame;
|
ideStackFrames << frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ideStackFrames.size() && ideStackFrames.back().function == QLatin1String("<global>"))
|
stackHandler->setFrames(ideStackFrames);
|
||||||
ideStackFrames.takeLast();
|
|
||||||
|
|
||||||
d->engine->stackHandler()->setFrames(ideStackFrames);
|
|
||||||
|
|
||||||
bool needPing = false;
|
|
||||||
|
|
||||||
foreach (WatchData data, watches) {
|
|
||||||
data.iname = watchHandler->watcherName(data.exp);
|
|
||||||
watchHandler->insertIncompleteData(data);
|
|
||||||
|
|
||||||
if (watchHandler->isExpandedIName(data.iname) && qint64(data.id) != -1) {
|
|
||||||
needPing = true;
|
|
||||||
expandObject(data.iname,data.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (WatchData data, locals) {
|
|
||||||
data.iname = "local." + data.exp;
|
|
||||||
watchHandler->insertIncompleteData(data);
|
|
||||||
|
|
||||||
if (watchHandler->isExpandedIName(data.iname) && qint64(data.id) != -1) {
|
|
||||||
needPing = true;
|
|
||||||
expandObject(data.iname,data.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needPing)
|
|
||||||
sendPing();
|
|
||||||
|
|
||||||
bool becauseOfException;
|
bool becauseOfException;
|
||||||
stream >> becauseOfException;
|
stream >> becauseOfException;
|
||||||
@@ -502,6 +475,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
|||||||
if (!ideStackFrames.isEmpty())
|
if (!ideStackFrames.isEmpty())
|
||||||
d->engine->gotoLocation(ideStackFrames.value(0));
|
d->engine->gotoLocation(ideStackFrames.value(0));
|
||||||
|
|
||||||
|
insertLocalsAndWatches(locals, watches, stackHandler->currentIndex());
|
||||||
|
|
||||||
} else if (command == "RESULT") {
|
} else if (command == "RESULT") {
|
||||||
WatchData data;
|
WatchData data;
|
||||||
QByteArray iname;
|
QByteArray iname;
|
||||||
@@ -511,12 +486,12 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
|||||||
+ QLatin1String(iname) + QLatin1Char(' ') + data.value);
|
+ QLatin1String(iname) + QLatin1Char(' ') + data.value);
|
||||||
data.iname = iname;
|
data.iname = iname;
|
||||||
if (iname.startsWith("watch.")) {
|
if (iname.startsWith("watch.")) {
|
||||||
watchHandler->insertIncompleteData(data);
|
watchHandler->insertData(data);
|
||||||
} else if (iname == "console") {
|
} else if (iname == "console") {
|
||||||
d->engine->showMessage(data.value, ConsoleOutput);
|
d->engine->showMessage(data.value, ConsoleOutput);
|
||||||
} else if (iname.startsWith("local.")) {
|
} else if (iname.startsWith("local.")) {
|
||||||
data.name = data.name.left(data.name.indexOf(QLatin1Char(' ')));
|
data.name = data.name.left(data.name.indexOf(QLatin1Char(' ')));
|
||||||
watchHandler->insertIncompleteData(data);
|
watchHandler->insertData(data);
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "QmlEngine: Unexcpected result: " << iname << data.value;
|
qWarning() << "QmlEngine: Unexcpected result: " << iname << data.value;
|
||||||
}
|
}
|
||||||
@@ -531,7 +506,7 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
|||||||
|
|
||||||
foreach (WatchData data, result) {
|
foreach (WatchData data, result) {
|
||||||
data.iname = iname + '.' + data.exp;
|
data.iname = iname + '.' + data.exp;
|
||||||
watchHandler->insertIncompleteData(data);
|
watchHandler->insertData(data);
|
||||||
|
|
||||||
if (watchHandler->isExpandedIName(data.iname) && qint64(data.id) != -1) {
|
if (watchHandler->isExpandedIName(data.iname) && qint64(data.id) != -1) {
|
||||||
needPing = true;
|
needPing = true;
|
||||||
@@ -552,27 +527,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
|||||||
d->logReceiveMessage(QString::fromLatin1("%1 %2 (%3 x locals) (%4 x watchdata)").arg(
|
d->logReceiveMessage(QString::fromLatin1("%1 %2 (%3 x locals) (%4 x watchdata)").arg(
|
||||||
QLatin1String(command), QString::number(frameId),
|
QLatin1String(command), QString::number(frameId),
|
||||||
QString::number(locals.size()), QString::number(watches.size())));
|
QString::number(locals.size()), QString::number(watches.size())));
|
||||||
bool needPing = false;
|
|
||||||
foreach (WatchData data, watches) {
|
|
||||||
data.iname = watchHandler->watcherName(data.exp);
|
|
||||||
watchHandler->insertIncompleteData(data);
|
|
||||||
|
|
||||||
if (watchHandler->isExpandedIName(data.iname) && qint64(data.id) != -1) {
|
insertLocalsAndWatches(locals, watches, frameId);
|
||||||
needPing = true;
|
|
||||||
expandObject(data.iname, data.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (WatchData data, locals) {
|
|
||||||
data.iname = "local." + data.exp;
|
|
||||||
watchHandler->insertIncompleteData(data);
|
|
||||||
if (watchHandler->isExpandedIName(data.iname) && qint64(data.id) != -1) {
|
|
||||||
needPing = true;
|
|
||||||
expandObject(data.iname, data.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (needPing)
|
|
||||||
sendPing();
|
|
||||||
|
|
||||||
} else if (command == "PONG") {
|
} else if (command == "PONG") {
|
||||||
int ping;
|
int ping;
|
||||||
@@ -585,9 +541,50 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QScriptDebuggerClient::insertLocalsAndWatches(QList<WatchData> &locals,
|
||||||
|
QList<WatchData> &watches,
|
||||||
|
int stackFrameIndex)
|
||||||
|
{
|
||||||
|
WatchHandler *watchHandler = d->engine->watchHandler();
|
||||||
|
watchHandler->removeAllData();
|
||||||
|
if (stackFrameIndex < 0)
|
||||||
|
return;
|
||||||
|
const StackFrame frame = d->engine->stackHandler()->frameAt(stackFrameIndex);
|
||||||
|
if (!frame.isUsable())
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool needPing = false;
|
||||||
|
foreach (WatchData data, watches) {
|
||||||
|
data.iname = watchHandler->watcherName(data.exp);
|
||||||
|
watchHandler->insertData(data);
|
||||||
|
|
||||||
|
if (watchHandler->isExpandedIName(data.iname) && qint64(data.id) != -1) {
|
||||||
|
needPing = true;
|
||||||
|
expandObject(data.iname, data.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (WatchData data, locals) {
|
||||||
|
if (data.name == QLatin1String("<no initialized data>"))
|
||||||
|
data.name = tr("No Local Variables");
|
||||||
|
data.iname = "local." + data.exp;
|
||||||
|
watchHandler->insertData(data);
|
||||||
|
|
||||||
|
if (watchHandler->isExpandedIName(data.iname) && qint64(data.id) != -1) {
|
||||||
|
needPing = true;
|
||||||
|
expandObject(data.iname, data.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needPing)
|
||||||
|
sendPing();
|
||||||
|
emit stackFrameCompleted();
|
||||||
|
}
|
||||||
|
|
||||||
void QScriptDebuggerClient::setEngine(QmlEngine *engine)
|
void QScriptDebuggerClient::setEngine(QmlEngine *engine)
|
||||||
{
|
{
|
||||||
d->engine = engine;
|
d->engine = engine;
|
||||||
|
connect(this, SIGNAL(stackFrameCompleted()), engine, SIGNAL(stackFrameCompleted()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QScriptDebuggerClientPrivate::logSendMessage(const QString &msg) const
|
void QScriptDebuggerClientPrivate::logSendMessage(const QString &msg) const
|
||||||
|
|||||||
@@ -86,6 +86,8 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void sendPing();
|
void sendPing();
|
||||||
|
void insertLocalsAndWatches(QList<WatchData> &locals, QList<WatchData> &watches,
|
||||||
|
int stackFrameIndex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QScriptDebuggerClientPrivate *d;
|
QScriptDebuggerClientPrivate *d;
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ private:
|
|||||||
bool ancestorChanged(const QSet<QByteArray> &parentINames, WatchItem *item) const;
|
bool ancestorChanged(const QSet<QByteArray> &parentINames, WatchItem *item) const;
|
||||||
void insertBulkData(const QList<WatchData> &data);
|
void insertBulkData(const QList<WatchData> &data);
|
||||||
QString displayForAutoTest(const QByteArray &iname) const;
|
QString displayForAutoTest(const QByteArray &iname) const;
|
||||||
void reinitialize();
|
void reinitialize(bool includeInspectData = false);
|
||||||
void destroyItem(WatchItem *item); // With model notification.
|
void destroyItem(WatchItem *item); // With model notification.
|
||||||
void destroyChildren(WatchItem *item); // With model notification.
|
void destroyChildren(WatchItem *item); // With model notification.
|
||||||
void destroyHelper(const WatchItems &items); // Without model notification.
|
void destroyHelper(const WatchItems &items); // Without model notification.
|
||||||
@@ -315,7 +315,7 @@ WatchItem *WatchModel::createItem(const QByteArray &iname, const QString &name,
|
|||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WatchModel::reinitialize()
|
void WatchModel::reinitialize(bool includeInspectData)
|
||||||
{
|
{
|
||||||
CHECK(checkTree());
|
CHECK(checkTree());
|
||||||
//MODEL_DEBUG("REMOVING " << n << " CHILDREN OF " << m_root->iname);
|
//MODEL_DEBUG("REMOVING " << n << " CHILDREN OF " << m_root->iname);
|
||||||
@@ -324,8 +324,10 @@ void WatchModel::reinitialize()
|
|||||||
destroyChildren(m_watchRoot);
|
destroyChildren(m_watchRoot);
|
||||||
destroyChildren(m_returnRoot);
|
destroyChildren(m_returnRoot);
|
||||||
destroyChildren(m_tooltipRoot);
|
destroyChildren(m_tooltipRoot);
|
||||||
|
if (includeInspectData) {
|
||||||
destroyChildren(m_inspectorRoot);
|
destroyChildren(m_inspectorRoot);
|
||||||
QTC_CHECK(m_cache.size() == 6);
|
QTC_CHECK(m_cache.size() == 6);
|
||||||
|
}
|
||||||
CHECK(checkTree());
|
CHECK(checkTree());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,7 +436,7 @@ void WatchModel::reinsertAllData()
|
|||||||
{
|
{
|
||||||
QList<WatchData> list;
|
QList<WatchData> list;
|
||||||
reinsertAllDataHelper(m_root, &list);
|
reinsertAllDataHelper(m_root, &list);
|
||||||
reinitialize();
|
reinitialize(true);
|
||||||
insertBulkData(list);
|
insertBulkData(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1516,9 +1518,9 @@ void WatchHandler::insertData(const QList<WatchData> &list)
|
|||||||
updateWatchersWindow();
|
updateWatchersWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WatchHandler::removeAllData()
|
void WatchHandler::removeAllData(bool includeInspectData)
|
||||||
{
|
{
|
||||||
m_model->reinitialize();
|
m_model->reinitialize(includeInspectData);
|
||||||
updateWatchersWindow();
|
updateWatchersWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ public:
|
|||||||
void insertIncompleteData(const WatchData &data);
|
void insertIncompleteData(const WatchData &data);
|
||||||
void removeData(const QByteArray &iname);
|
void removeData(const QByteArray &iname);
|
||||||
void removeChildren(const QByteArray &iname);
|
void removeChildren(const QByteArray &iname);
|
||||||
void removeAllData();
|
void removeAllData(bool includeInspectData = false);
|
||||||
void resetValueCache();
|
void resetValueCache();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
#include <utils/runextensions.h>
|
#include <utils/runextensions.h>
|
||||||
|
|
||||||
#include <QtConcurrentRun>
|
#include <QtConcurrentRun>
|
||||||
|
#include <QColor>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
@@ -194,7 +195,7 @@ QVariant LocatorModel::data(const QModelIndex &index, int role) const
|
|||||||
}
|
}
|
||||||
return entry.displayIcon;
|
return entry.displayIcon;
|
||||||
} else if (role == Qt::ForegroundRole && index.column() == 1) {
|
} else if (role == Qt::ForegroundRole && index.column() == 1) {
|
||||||
return Qt::darkGray;
|
return QColor(Qt::darkGray);
|
||||||
} else if (role == Qt::UserRole) {
|
} else if (role == Qt::UserRole) {
|
||||||
return qVariantFromValue(mEntries.at(index.row()));
|
return qVariantFromValue(mEntries.at(index.row()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,10 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "customwizardpreprocessor.h"
|
#include "customwizardpreprocessor.h"
|
||||||
|
#ifdef WITH_TESTS
|
||||||
|
# include "projectexplorer.h"
|
||||||
|
# include <QTest>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
@@ -192,7 +196,7 @@ bool PreprocessContext::process(const QString &in, QString *out, QString *errorM
|
|||||||
switch (preprocessorLine(lines.at(l), &expression)) {
|
switch (preprocessorLine(lines.at(l), &expression)) {
|
||||||
case IfSection:
|
case IfSection:
|
||||||
// '@If': Push new section
|
// '@If': Push new section
|
||||||
if (top.parentEnabled) {
|
if (top.condition) {
|
||||||
if (!evaluateBooleanJavaScriptExpression(m_scriptEngine, expression, &expressionValue, errorMessage)) {
|
if (!evaluateBooleanJavaScriptExpression(m_scriptEngine, expression, &expressionValue, errorMessage)) {
|
||||||
*errorMessage = QString::fromLatin1("Error in @if at %1: %2").
|
*errorMessage = QString::fromLatin1("Error in @if at %1: %2").
|
||||||
arg(l + 1).arg(*errorMessage);
|
arg(l + 1).arg(*errorMessage);
|
||||||
@@ -282,4 +286,70 @@ bool customWizardPreprocess(const QString &in, QString *out, QString *errorMessa
|
|||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|
||||||
|
#ifdef WITH_TESTS // Run qtcreator -test ProjectExplorer
|
||||||
|
|
||||||
|
void ProjectExplorerPlugin::testCustomWizardPreprocessor_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<QString>("input");
|
||||||
|
QTest::addColumn<QString>("expectedOutput");
|
||||||
|
QTest::addColumn<bool>("expectedSuccess");
|
||||||
|
QTest::addColumn<QString>("expectedErrorMessage");
|
||||||
|
QTest::newRow("if")
|
||||||
|
<< QString::fromLatin1("@if 1\nline 1\n@elsif 0\nline 2\n@else\nline 3\n@endif\n")
|
||||||
|
<< QString::fromLatin1("line 1")
|
||||||
|
<< true << QString();
|
||||||
|
QTest::newRow("elsif")
|
||||||
|
<< QString::fromLatin1("@if 0\nline 1\n@elsif 1\nline 2\n@else\nline 3\n@endif\n")
|
||||||
|
<< QString::fromLatin1("line 2")
|
||||||
|
<< true << QString();
|
||||||
|
QTest::newRow("else")
|
||||||
|
<< QString::fromLatin1("@if 0\nline 1\n@elsif 0\nline 2\n@else\nline 3\n@endif\n")
|
||||||
|
<< QString::fromLatin1("line 3")
|
||||||
|
<< true << QString();
|
||||||
|
QTest::newRow("nested-if")
|
||||||
|
<< QString::fromLatin1("@if 1\n"
|
||||||
|
" @if 1\nline 1\n@elsif 0\nline 2\n@else\nline 3\n@endif\n"
|
||||||
|
"@else\n"
|
||||||
|
" @if 1\nline 4\n@elsif 0\nline 5\n@else\nline 6\n@endif\n"
|
||||||
|
"@endif\n")
|
||||||
|
<< QString::fromLatin1("line 1")
|
||||||
|
<< true << QString();
|
||||||
|
QTest::newRow("nested-else")
|
||||||
|
<< QString::fromLatin1("@if 0\n"
|
||||||
|
" @if 1\nline 1\n@elsif 0\nline 2\n@else\nline 3\n@endif\n"
|
||||||
|
"@else\n"
|
||||||
|
" @if 1\nline 4\n@elsif 0\nline 5\n@else\nline 6\n@endif\n"
|
||||||
|
"@endif\n")
|
||||||
|
<< QString::fromLatin1("line 4")
|
||||||
|
<< true << QString();
|
||||||
|
QTest::newRow("twice-nested-if")
|
||||||
|
<< QString::fromLatin1("@if 0\n"
|
||||||
|
" @if 1\n"
|
||||||
|
" @if 1\nline 1\n@else\nline 2\n@endif\n"
|
||||||
|
" @endif\n"
|
||||||
|
"@else\n"
|
||||||
|
" @if 1\n"
|
||||||
|
" @if 1\nline 3\n@else\nline 4\n@endif\n"
|
||||||
|
" @endif\n"
|
||||||
|
"@endif\n")
|
||||||
|
<< QString::fromLatin1("line 3")
|
||||||
|
<< true << QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectExplorerPlugin::testCustomWizardPreprocessor()
|
||||||
|
{
|
||||||
|
QFETCH(QString, input);
|
||||||
|
QFETCH(QString, expectedOutput);
|
||||||
|
QFETCH(bool, expectedSuccess);
|
||||||
|
QFETCH(QString, expectedErrorMessage);
|
||||||
|
|
||||||
|
QString errorMessage;
|
||||||
|
QString output;
|
||||||
|
const bool success = Internal::customWizardPreprocess(input, &output, &errorMessage);
|
||||||
|
QCOMPARE(success, expectedSuccess);
|
||||||
|
QCOMPARE(output.trimmed(), expectedOutput.trimmed());
|
||||||
|
QCOMPARE(errorMessage, expectedErrorMessage);
|
||||||
|
}
|
||||||
|
#endif // WITH_TESTS
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
|||||||
@@ -150,22 +150,24 @@ void KitManager::restoreKits()
|
|||||||
{
|
{
|
||||||
QTC_ASSERT(!d->m_writer, return);
|
QTC_ASSERT(!d->m_writer, return);
|
||||||
QList<Kit *> kitsToRegister;
|
QList<Kit *> kitsToRegister;
|
||||||
|
QList<Kit *> kitsToValidate;
|
||||||
QList<Kit *> kitsToCheck;
|
QList<Kit *> kitsToCheck;
|
||||||
|
|
||||||
// read all kits from SDK
|
// read all kits from SDK
|
||||||
QFileInfo systemSettingsFile(Core::ICore::settings(QSettings::SystemScope)->fileName());
|
QFileInfo systemSettingsFile(Core::ICore::settings(QSettings::SystemScope)->fileName());
|
||||||
QFileInfo kitFile(systemSettingsFile.absolutePath(), QLatin1String(KIT_FILENAME));
|
QFileInfo kitFile(systemSettingsFile.absolutePath() + QLatin1String(KIT_FILENAME));
|
||||||
if (kitFile.exists()) {
|
if (kitFile.exists()) {
|
||||||
KitList system = restoreKits(Utils::FileName(kitFile));
|
KitList system = restoreKits(Utils::FileName(kitFile));
|
||||||
// make sure we mark these as autodetected!
|
// make sure we mark these as autodetected!
|
||||||
foreach (Kit *k, system.kits)
|
foreach (Kit *k, system.kits)
|
||||||
k->setAutoDetected(true);
|
k->setAutoDetected(true);
|
||||||
|
|
||||||
// SDK kits are always considered to be up-to-date, so no need to recheck them.
|
// SDK kits are always considered to be up for validation since they might have been
|
||||||
kitsToRegister = system.kits;
|
// extended with additional information by creator in the meantime:
|
||||||
|
kitsToValidate = system.kits;
|
||||||
}
|
}
|
||||||
|
|
||||||
// read all kit chains from user file
|
// read all kits from user file
|
||||||
KitList userKits = restoreKits(settingsFileName());
|
KitList userKits = restoreKits(settingsFileName());
|
||||||
foreach (Kit *k, userKits.kits) {
|
foreach (Kit *k, userKits.kits) {
|
||||||
if (k->isAutoDetected())
|
if (k->isAutoDetected())
|
||||||
@@ -174,20 +176,16 @@ void KitManager::restoreKits()
|
|||||||
kitsToRegister.append(k);
|
kitsToRegister.append(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Then auto create kits:
|
|
||||||
QList<Kit *> detectedKits;
|
|
||||||
|
|
||||||
// Find/update autodetected kits:
|
|
||||||
Kit *toStore = 0;
|
Kit *toStore = 0;
|
||||||
foreach (Kit *currentDetected, detectedKits) {
|
foreach (Kit *current, kitsToValidate) {
|
||||||
toStore = currentDetected;
|
toStore = current;
|
||||||
|
|
||||||
// Check whether we had this kit stored and prefer the old one with the old id:
|
// Check whether we had this kit stored and prefer the stored one:
|
||||||
for (int i = 0; i < kitsToCheck.count(); ++i) {
|
for (int i = 0; i < kitsToCheck.count(); ++i) {
|
||||||
if (*(kitsToCheck.at(i)) == *currentDetected) {
|
if (kitsToCheck.at(i)->id() == current->id()) {
|
||||||
toStore = kitsToCheck.at(i);
|
toStore = kitsToCheck.at(i);
|
||||||
kitsToCheck.removeAt(i);
|
kitsToCheck.removeAt(i);
|
||||||
delete currentDetected;
|
delete current;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -262,6 +262,9 @@ private slots:
|
|||||||
void testFlavorForOs();
|
void testFlavorForOs();
|
||||||
|
|
||||||
void testDeviceManager();
|
void testDeviceManager();
|
||||||
|
|
||||||
|
void testCustomWizardPreprocessor_data();
|
||||||
|
void testCustomWizardPreprocessor();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -174,7 +174,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="jomLabel">
|
<widget class="QLabel" name="jomLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><i>jom</i> is a drop-in replacement for <i>nmake</i> which distributes the compilation process to multiple CPU cores. The latest binary is available at <a href="ftp://ftp.qt.nokia.com/jom/">ftp://ftp.qt.nokia.com/jom/</a>. Disable it if you experience problems with your builds.</string>
|
<string><i>jom</i> is a drop-in replacement for <i>nmake</i> which distributes the compilation process to multiple CPU cores. The latest binary is available at <a href="http://releases.qt-project.org/jom/">http://releases.qt-project.org/jom/</a>. Disable it if you experience problems with your builds.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
|||||||
@@ -345,8 +345,8 @@ TaskFilterModel::TaskFilterModel(TaskModel *sourceModel, QObject *parent) : QAbs
|
|||||||
Q_ASSERT(m_sourceModel);
|
Q_ASSERT(m_sourceModel);
|
||||||
connect(m_sourceModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
|
connect(m_sourceModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
|
||||||
this, SLOT(handleNewRows(QModelIndex,int,int)));
|
this, SLOT(handleNewRows(QModelIndex,int,int)));
|
||||||
connect(m_sourceModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
|
connect(m_sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
|
||||||
this, SLOT(handleRemovedRows(QModelIndex,int,int)));
|
this, SLOT(handleRowsAboutToBeRemoved(QModelIndex,int,int)));
|
||||||
connect(m_sourceModel, SIGNAL(modelReset()),
|
connect(m_sourceModel, SIGNAL(modelReset()),
|
||||||
this, SLOT(handleReset()));
|
this, SLOT(handleReset()));
|
||||||
connect(m_sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
|
connect(m_sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
|
||||||
@@ -434,7 +434,7 @@ void TaskFilterModel::handleNewRows(const QModelIndex &index, int first, int las
|
|||||||
endInsertRows();
|
endInsertRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskFilterModel::handleRemovedRows(const QModelIndex &index, int first, int last)
|
void TaskFilterModel::handleRowsAboutToBeRemoved(const QModelIndex &index, int first, int last)
|
||||||
{
|
{
|
||||||
if (index.isValid())
|
if (index.isValid())
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ public:
|
|||||||
QModelIndex mapFromSource(const QModelIndex &idx) const;
|
QModelIndex mapFromSource(const QModelIndex &idx) const;
|
||||||
private slots:
|
private slots:
|
||||||
void handleNewRows(const QModelIndex &index, int first, int last);
|
void handleNewRows(const QModelIndex &index, int first, int last);
|
||||||
void handleRemovedRows(const QModelIndex &index, int first, int last);
|
void handleRowsAboutToBeRemoved(const QModelIndex &index, int first, int last);
|
||||||
void handleDataChanged(QModelIndex,QModelIndex bottom);
|
void handleDataChanged(QModelIndex,QModelIndex bottom);
|
||||||
void handleReset();
|
void handleReset();
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,20 @@ using namespace QmlJS::AST;
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
static inline QStringList supportedVersionsList()
|
||||||
|
{
|
||||||
|
QStringList list;
|
||||||
|
list << QLatin1String("1.0") << QLatin1String("1.1");
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool supportedQtQuickVersion(const QString &version)
|
||||||
|
{
|
||||||
|
static QStringList supportedVersions = supportedVersionsList();
|
||||||
|
|
||||||
|
return supportedVersions.contains(version);
|
||||||
|
}
|
||||||
|
|
||||||
static inline QString stripQuotes(const QString &str)
|
static inline QString stripQuotes(const QString &str)
|
||||||
{
|
{
|
||||||
if ((str.startsWith(QLatin1Char('"')) && str.endsWith(QLatin1Char('"')))
|
if ((str.startsWith(QLatin1Char('"')) && str.endsWith(QLatin1Char('"')))
|
||||||
@@ -738,6 +752,14 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH
|
|||||||
errors.append(RewriterView::Error(diagnosticMessage, QUrl::fromLocalFile(doc->fileName())));
|
errors.append(RewriterView::Error(diagnosticMessage, QUrl::fromLocalFile(doc->fileName())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (const QmlDesigner::Import &import, m_rewriterView->model()->imports()) {
|
||||||
|
if (import.isLibraryImport() && import.url() == QLatin1String("QtQuick") && !supportedQtQuickVersion(import.version())) {
|
||||||
|
const QmlJS::DiagnosticMessage diagnosticMessage(QmlJS::DiagnosticMessage::Error, AST::SourceLocation(0, 0, 0, 0),
|
||||||
|
QCoreApplication::translate("QmlDesigner::TextToModelMerger error message", "Unsupported QtQuick version"));
|
||||||
|
errors.append(RewriterView::Error(diagnosticMessage, QUrl::fromLocalFile(doc->fileName())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (view()->checkSemanticErrors()) {
|
if (view()->checkSemanticErrors()) {
|
||||||
Check check(doc, m_scopeChain->context());
|
Check check(doc, m_scopeChain->context());
|
||||||
check.disableMessage(StaticAnalysis::ErrUnknownComponent);
|
check.disableMessage(StaticAnalysis::ErrUnknownComponent);
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ using namespace Qnx::Internal;
|
|||||||
BlackBerryApplicationRunner::BlackBerryApplicationRunner(bool debugMode, BlackBerryRunConfiguration *runConfiguration, QObject *parent)
|
BlackBerryApplicationRunner::BlackBerryApplicationRunner(bool debugMode, BlackBerryRunConfiguration *runConfiguration, QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_debugMode(debugMode)
|
, m_debugMode(debugMode)
|
||||||
|
, m_slog2infoFound(true)
|
||||||
, m_pid(-1)
|
, m_pid(-1)
|
||||||
, m_appId(QString())
|
, m_appId(QString())
|
||||||
, m_running(false)
|
, m_running(false)
|
||||||
@@ -91,6 +92,7 @@ BlackBerryApplicationRunner::BlackBerryApplicationRunner(bool debugMode, BlackBe
|
|||||||
, m_launchProcess(0)
|
, m_launchProcess(0)
|
||||||
, m_stopProcess(0)
|
, m_stopProcess(0)
|
||||||
, m_tailProcess(0)
|
, m_tailProcess(0)
|
||||||
|
, m_testSlog2Process(0)
|
||||||
, m_runningStateTimer(new QTimer(this))
|
, m_runningStateTimer(new QTimer(this))
|
||||||
, m_runningStateProcess(0)
|
, m_runningStateProcess(0)
|
||||||
{
|
{
|
||||||
@@ -141,6 +143,17 @@ void BlackBerryApplicationRunner::start()
|
|||||||
m_running = true;
|
m_running = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlackBerryApplicationRunner::checkSlog2Info()
|
||||||
|
{
|
||||||
|
// Not necessary to retest if slog2info exists.
|
||||||
|
if (!m_testSlog2Process) {
|
||||||
|
m_testSlog2Process = new QSsh::SshRemoteProcessRunner(this);
|
||||||
|
connect(m_testSlog2Process, SIGNAL(processClosed(int)),
|
||||||
|
this, SLOT(handleSlog2InfoFound()));
|
||||||
|
m_testSlog2Process->run("slog2info", m_sshParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void BlackBerryApplicationRunner::startFinished(int exitCode, QProcess::ExitStatus exitStatus)
|
void BlackBerryApplicationRunner::startFinished(int exitCode, QProcess::ExitStatus exitStatus)
|
||||||
{
|
{
|
||||||
if (exitCode == 0 && exitStatus == QProcess::NormalExit && m_pid > -1) {
|
if (exitCode == 0 && exitStatus == QProcess::NormalExit && m_pid > -1) {
|
||||||
@@ -164,6 +177,12 @@ ProjectExplorer::RunControl::StopResult BlackBerryApplicationRunner::stop()
|
|||||||
|
|
||||||
m_stopping = true;
|
m_stopping = true;
|
||||||
|
|
||||||
|
if (m_testSlog2Process && m_testSlog2Process->isProcessRunning()) {
|
||||||
|
m_testSlog2Process->cancel();
|
||||||
|
delete m_testSlog2Process;
|
||||||
|
m_testSlog2Process = 0;
|
||||||
|
}
|
||||||
|
|
||||||
QStringList args;
|
QStringList args;
|
||||||
args << QLatin1String("-terminateApp");
|
args << QLatin1String("-terminateApp");
|
||||||
args << QLatin1String("-device") << m_deviceHost;
|
args << QLatin1String("-device") << m_deviceHost;
|
||||||
@@ -234,7 +253,11 @@ void BlackBerryApplicationRunner::killTailProcess()
|
|||||||
QSsh::SshRemoteProcessRunner *slayProcess = new QSsh::SshRemoteProcessRunner(this);
|
QSsh::SshRemoteProcessRunner *slayProcess = new QSsh::SshRemoteProcessRunner(this);
|
||||||
connect(slayProcess, SIGNAL(processClosed(int)), this, SIGNAL(finished()));
|
connect(slayProcess, SIGNAL(processClosed(int)), this, SIGNAL(finished()));
|
||||||
|
|
||||||
|
if (m_slog2infoFound) {
|
||||||
|
slayProcess->run("slay slog2info", m_sshParams);
|
||||||
|
} else {
|
||||||
slayProcess->run("slay tail", m_sshParams);
|
slayProcess->run("slay tail", m_sshParams);
|
||||||
|
}
|
||||||
|
|
||||||
// Not supported by OpenSSH server
|
// Not supported by OpenSSH server
|
||||||
//m_tailProcess->sendSignalToProcess(Utils::SshRemoteProcess::KillSignal);
|
//m_tailProcess->sendSignalToProcess(Utils::SshRemoteProcess::KillSignal);
|
||||||
@@ -264,21 +287,62 @@ void BlackBerryApplicationRunner::tailApplicationLog()
|
|||||||
this, SLOT(handleTailConnectionError()));
|
this, SLOT(handleTailConnectionError()));
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString command = QLatin1String("tail -c +1 -f /accounts/1000/appdata/") + m_appId
|
QString command;
|
||||||
|
if (m_slog2infoFound) {
|
||||||
|
command = QString::fromLatin1("slog2info -w");
|
||||||
|
} else {
|
||||||
|
command = QLatin1String("tail -c +1 -f /accounts/1000/appdata/") + m_appId
|
||||||
+ QLatin1String("/logs/log");
|
+ QLatin1String("/logs/log");
|
||||||
|
}
|
||||||
m_tailProcess->run(command.toLatin1(), m_sshParams);
|
m_tailProcess->run(command.toLatin1(), m_sshParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlackBerryApplicationRunner::handleSlog2InfoFound()
|
||||||
|
{
|
||||||
|
QSsh::SshRemoteProcessRunner *process = qobject_cast<QSsh::SshRemoteProcessRunner *>(sender());
|
||||||
|
QTC_ASSERT(process, return);
|
||||||
|
|
||||||
|
m_slog2infoFound = (process->processExitCode() == 0);
|
||||||
|
|
||||||
|
tailApplicationLog();
|
||||||
|
}
|
||||||
|
|
||||||
void BlackBerryApplicationRunner::handleTailOutput()
|
void BlackBerryApplicationRunner::handleTailOutput()
|
||||||
{
|
{
|
||||||
QSsh::SshRemoteProcessRunner *process = qobject_cast<QSsh::SshRemoteProcessRunner *>(sender());
|
QSsh::SshRemoteProcessRunner *process = qobject_cast<QSsh::SshRemoteProcessRunner *>(sender());
|
||||||
QTC_ASSERT(process, return);
|
QTC_ASSERT(process, return);
|
||||||
|
|
||||||
const QString message = QString::fromLatin1(process->readAllStandardOutput());
|
const QString message = QString::fromLatin1(process->readAllStandardOutput());
|
||||||
|
if (m_slog2infoFound) {
|
||||||
|
const QStringList multiLine = message.split(QLatin1Char('\n'));
|
||||||
|
Q_FOREACH (const QString &line, multiLine) {
|
||||||
|
if ( line.contains(m_appId) ) {
|
||||||
|
QStringList validLineBeginnings;
|
||||||
|
validLineBeginnings << QLatin1String("qt-msg 0 ")
|
||||||
|
<< QLatin1String("qt-msg* 0 ")
|
||||||
|
<< QLatin1String(" 0 ");
|
||||||
|
Q_FOREACH (const QString &beginning, validLineBeginnings) {
|
||||||
|
if (showQtMessage(beginning, line))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
emit output(message, Utils::StdOutFormat);
|
emit output(message, Utils::StdOutFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BlackBerryApplicationRunner::showQtMessage(const QString& pattern, const QString& line)
|
||||||
|
{
|
||||||
|
const int index = line.indexOf(pattern);
|
||||||
|
if (index != -1) {
|
||||||
|
const QString str = line.right(line.length()-index-pattern.length()) + QLatin1Char('\n');
|
||||||
|
emit output(str, Utils::StdOutFormat);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void BlackBerryApplicationRunner::handleTailError()
|
void BlackBerryApplicationRunner::handleTailError()
|
||||||
{
|
{
|
||||||
QSsh::SshRemoteProcessRunner *process = qobject_cast<QSsh::SshRemoteProcessRunner *>(sender());
|
QSsh::SshRemoteProcessRunner *process = qobject_cast<QSsh::SshRemoteProcessRunner *>(sender());
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public:
|
|||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void start();
|
void start();
|
||||||
void tailApplicationLog();
|
void checkSlog2Info();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void output(const QString &msg, Utils::OutputFormat format);
|
void output(const QString &msg, Utils::OutputFormat format);
|
||||||
@@ -72,6 +72,8 @@ signals:
|
|||||||
void startFailed(const QString &msg);
|
void startFailed(const QString &msg);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
bool showQtMessage(const QString& pattern, const QString& line);
|
||||||
|
void tailApplicationLog();
|
||||||
void startFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
void startFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
||||||
void stopFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
void stopFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
||||||
|
|
||||||
@@ -86,11 +88,14 @@ private slots:
|
|||||||
void determineRunningState();
|
void determineRunningState();
|
||||||
void readRunningStateStandardOutput();
|
void readRunningStateStandardOutput();
|
||||||
|
|
||||||
|
void handleSlog2InfoFound();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void reset();
|
void reset();
|
||||||
void killTailProcess();
|
void killTailProcess();
|
||||||
|
|
||||||
bool m_debugMode;
|
bool m_debugMode;
|
||||||
|
bool m_slog2infoFound;
|
||||||
|
|
||||||
qint64 m_pid;
|
qint64 m_pid;
|
||||||
QString m_appId;
|
QString m_appId;
|
||||||
@@ -108,7 +113,7 @@ private:
|
|||||||
QProcess *m_launchProcess;
|
QProcess *m_launchProcess;
|
||||||
QProcess *m_stopProcess;
|
QProcess *m_stopProcess;
|
||||||
QSsh::SshRemoteProcessRunner *m_tailProcess;
|
QSsh::SshRemoteProcessRunner *m_tailProcess;
|
||||||
|
QSsh::SshRemoteProcessRunner *m_testSlog2Process;
|
||||||
QTimer *m_runningStateTimer;
|
QTimer *m_runningStateTimer;
|
||||||
QProcess *m_runningStateProcess;
|
QProcess *m_runningStateProcess;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ BlackBerryDebugSupport::BlackBerryDebugSupport(BlackBerryRunConfiguration *runCo
|
|||||||
runControl, SLOT(appendMessage(QString,Utils::OutputFormat)));
|
runControl, SLOT(appendMessage(QString,Utils::OutputFormat)));
|
||||||
|
|
||||||
connect(m_runner, SIGNAL(started()), this, SLOT(handleStarted()));
|
connect(m_runner, SIGNAL(started()), this, SLOT(handleStarted()));
|
||||||
connect(m_runner, SIGNAL(started()), m_runner, SLOT(tailApplicationLog()));
|
connect(m_runner, SIGNAL(started()), m_runner, SLOT(checkSlog2Info()));
|
||||||
connect(m_runner, SIGNAL(startFailed(QString)), this, SLOT(handleStartFailed(QString)));
|
connect(m_runner, SIGNAL(startFailed(QString)), this, SLOT(handleStartFailed(QString)));
|
||||||
connect(m_runner, SIGNAL(output(QString,Utils::OutputFormat)),
|
connect(m_runner, SIGNAL(output(QString,Utils::OutputFormat)),
|
||||||
this, SLOT(handleApplicationOutput(QString,Utils::OutputFormat)));
|
this, SLOT(handleApplicationOutput(QString,Utils::OutputFormat)));
|
||||||
|
|||||||
@@ -93,5 +93,5 @@ void BlackBerryRunControl::launchTailProcess()
|
|||||||
{
|
{
|
||||||
// Delay the launch of "tail" to ensure the blackberry-connect
|
// Delay the launch of "tail" to ensure the blackberry-connect
|
||||||
// connection has been properly established
|
// connection has been properly established
|
||||||
QTimer::singleShot(500, m_runner, SLOT(tailApplicationLog()));
|
QTimer::singleShot(500, m_runner, SLOT(checkSlog2Info()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ QnxAbstractQtVersion::QnxAbstractQtVersion(QnxArchitecture arch, const Utils::Fi
|
|||||||
: QtSupport::BaseQtVersion(path, isAutoDetected, autoDetectionSource)
|
: QtSupport::BaseQtVersion(path, isAutoDetected, autoDetectionSource)
|
||||||
, m_arch(arch)
|
, m_arch(arch)
|
||||||
{
|
{
|
||||||
|
setDefaultSdkPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
QnxArchitecture QnxAbstractQtVersion::architecture() const
|
QnxArchitecture QnxAbstractQtVersion::architecture() const
|
||||||
@@ -168,3 +169,24 @@ QString QnxAbstractQtVersion::invalidReason() const
|
|||||||
return tr("No SDK path set");
|
return tr("No SDK path set");
|
||||||
return QtSupport::BaseQtVersion::invalidReason();
|
return QtSupport::BaseQtVersion::invalidReason();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QnxAbstractQtVersion::setDefaultSdkPath()
|
||||||
|
{
|
||||||
|
QHash<QString, QString> info = versionInfo();
|
||||||
|
QString qtHostPrefix;
|
||||||
|
if (info.contains(QLatin1String("QT_HOST_PREFIX")))
|
||||||
|
qtHostPrefix = info.value(QLatin1String("QT_HOST_PREFIX"));
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
QString envFile;
|
||||||
|
#if defined Q_OS_WIN
|
||||||
|
envFile = qtHostPrefix + QLatin1String("/bbndk-env.bat");
|
||||||
|
#elif defined Q_OS_UNIX
|
||||||
|
envFile = qtHostPrefix + QLatin1String("/bbndk-env.sh");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (QFileInfo(envFile).exists())
|
||||||
|
setSdkPath(qtHostPrefix);
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ public:
|
|||||||
QString invalidReason() const;
|
QString invalidReason() const;
|
||||||
|
|
||||||
virtual QString sdkDescription() const = 0;
|
virtual QString sdkDescription() const = 0;
|
||||||
|
void setDefaultSdkPath();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString sdkPath() const;
|
QString sdkPath() const;
|
||||||
|
|||||||
@@ -114,6 +114,13 @@ void Qt4ProjectConfigWidget::updateDetails()
|
|||||||
.arg(QDir::toNativeSeparators(m_buildConfiguration->buildDirectory())));
|
.arg(QDir::toNativeSeparators(m_buildConfiguration->buildDirectory())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Qt4ProjectConfigWidget::setProblemLabel(const QString &text)
|
||||||
|
{
|
||||||
|
m_ui->warningLabel->setVisible(!text.isEmpty());
|
||||||
|
m_ui->problemLabel->setVisible(!text.isEmpty());
|
||||||
|
m_ui->problemLabel->setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
void Qt4ProjectConfigWidget::environmentChanged()
|
void Qt4ProjectConfigWidget::environmentChanged()
|
||||||
{
|
{
|
||||||
m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment());
|
m_ui->shadowBuildDirEdit->setEnvironment(m_buildConfiguration->environment());
|
||||||
@@ -202,22 +209,20 @@ void Qt4ProjectConfigWidget::shadowBuildEdited()
|
|||||||
|
|
||||||
void Qt4ProjectConfigWidget::updateProblemLabel()
|
void Qt4ProjectConfigWidget::updateProblemLabel()
|
||||||
{
|
{
|
||||||
bool targetMismatch = false;
|
|
||||||
bool incompatibleBuild = false;
|
|
||||||
bool allGood = false;
|
|
||||||
|
|
||||||
ProjectExplorer::Kit *k = m_buildConfiguration->target()->kit();
|
ProjectExplorer::Kit *k = m_buildConfiguration->target()->kit();
|
||||||
const QString proFileName = m_buildConfiguration->target()->project()->document()->fileName();
|
const QString proFileName = m_buildConfiguration->target()->project()->document()->fileName();
|
||||||
|
|
||||||
|
// Check for Qt version:
|
||||||
QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k);
|
QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k);
|
||||||
if (!version) {
|
if (!version) {
|
||||||
m_ui->problemLabel->setVisible(true);
|
setProblemLabel(tr("This target cannot build this project since it does not define a Qt version."));
|
||||||
m_ui->warningLabel->setVisible(true);
|
|
||||||
m_ui->problemLabel->setText(tr("This target cannot build this project since it does not define a "
|
|
||||||
"Qt version."));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool targetMismatch = false;
|
||||||
|
bool incompatibleBuild = false;
|
||||||
|
bool allGood = false;
|
||||||
// we only show if we actually have a qmake and makestep
|
// we only show if we actually have a qmake and makestep
|
||||||
if (m_buildConfiguration->qmakeStep() && m_buildConfiguration->makeStep()) {
|
if (m_buildConfiguration->qmakeStep() && m_buildConfiguration->makeStep()) {
|
||||||
QString makefile = m_buildConfiguration->buildDirectory() + QLatin1Char('/');
|
QString makefile = m_buildConfiguration->buildDirectory() + QLatin1Char('/');
|
||||||
@@ -257,12 +262,7 @@ void Qt4ProjectConfigWidget::updateProblemLabel()
|
|||||||
issues = version->reportIssues(proFileName, buildDirectory);
|
issues = version->reportIssues(proFileName, buildDirectory);
|
||||||
qSort(issues);
|
qSort(issues);
|
||||||
|
|
||||||
if (issues.isEmpty() && shadowBuildWarning.isEmpty()) {
|
if (!issues.isEmpty() || !shadowBuildWarning.isEmpty()) {
|
||||||
m_ui->problemLabel->setVisible(false);
|
|
||||||
m_ui->warningLabel->setVisible(false);
|
|
||||||
} else {
|
|
||||||
m_ui->problemLabel->setVisible(true);
|
|
||||||
m_ui->warningLabel->setVisible(true);
|
|
||||||
QString text = QLatin1String("<nobr>") + shadowBuildWarning;
|
QString text = QLatin1String("<nobr>") + shadowBuildWarning;
|
||||||
foreach (const ProjectExplorer::Task &task, issues) {
|
foreach (const ProjectExplorer::Task &task, issues) {
|
||||||
QString type;
|
QString type;
|
||||||
@@ -283,23 +283,23 @@ void Qt4ProjectConfigWidget::updateProblemLabel()
|
|||||||
text.append(QLatin1String("<br>"));
|
text.append(QLatin1String("<br>"));
|
||||||
text.append(type + task.description);
|
text.append(type + task.description);
|
||||||
}
|
}
|
||||||
m_ui->problemLabel->setText(text);
|
setProblemLabel(text);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} else if (targetMismatch) {
|
} else if (targetMismatch) {
|
||||||
m_ui->problemLabel->setVisible(true);
|
setProblemLabel(shadowBuildWarning + tr("A build for a different project exists in %1, which will be overwritten.",
|
||||||
m_ui->warningLabel->setVisible(true);
|
|
||||||
m_ui->problemLabel->setText(shadowBuildWarning + tr("A build for a different project exists in %1, which will be overwritten.",
|
|
||||||
"%1 build directory")
|
"%1 build directory")
|
||||||
.arg(m_ui->shadowBuildDirEdit->path()));
|
.arg(m_ui->shadowBuildDirEdit->path()));
|
||||||
|
return;
|
||||||
} else if (incompatibleBuild) {
|
} else if (incompatibleBuild) {
|
||||||
m_ui->warningLabel->setVisible(true);
|
setProblemLabel(shadowBuildWarning +tr("An incompatible build exists in %1, which will be overwritten.",
|
||||||
m_ui->problemLabel->setVisible(true);
|
|
||||||
m_ui->problemLabel->setText(shadowBuildWarning +tr("An incompatible build exists in %1, which will be overwritten.",
|
|
||||||
"%1 build directory")
|
"%1 build directory")
|
||||||
.arg(m_ui->shadowBuildDirEdit->path()));
|
.arg(m_ui->shadowBuildDirEdit->path()));
|
||||||
|
return;
|
||||||
} else if (!shadowBuildWarning.isEmpty()) {
|
} else if (!shadowBuildWarning.isEmpty()) {
|
||||||
m_ui->warningLabel->setVisible(true);
|
setProblemLabel(shadowBuildWarning);
|
||||||
m_ui->problemLabel->setVisible(true);
|
return;
|
||||||
m_ui->problemLabel->setText(shadowBuildWarning);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setProblemLabel(QString());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ private slots:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void updateDetails();
|
void updateDetails();
|
||||||
|
void setProblemLabel(const QString &text);
|
||||||
|
|
||||||
Ui::Qt4ProjectConfigWidget *m_ui;
|
Ui::Qt4ProjectConfigWidget *m_ui;
|
||||||
QAbstractButton *m_browseButton;
|
QAbstractButton *m_browseButton;
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ bool AddKeysOperation::test() const
|
|||||||
data.append(KeyValuePair(QLatin1String("newsub/1/2.1/3/qbytearray"), QString::fromLatin1("QByteArray:test array.")));
|
data.append(KeyValuePair(QLatin1String("newsub/1/2.1/3/qbytearray"), QString::fromLatin1("QByteArray:test array.")));
|
||||||
|
|
||||||
QVariantMap result = addKeys(testMap, data);
|
QVariantMap result = addKeys(testMap, data);
|
||||||
if (result.count() != 8)
|
if (result.count() != 9)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// subkeys:
|
// subkeys:
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ int AddKitOperation::execute() const
|
|||||||
map = initializeKits();
|
map = initializeKits();
|
||||||
|
|
||||||
map = addKit(map, m_id, m_displayName, m_icon, m_debuggerEngine, m_debugger,
|
map = addKit(map, m_id, m_displayName, m_icon, m_debuggerEngine, m_debugger,
|
||||||
m_deviceType, m_sysRoot, m_tc, m_qt, m_mkspec, m_extra);
|
m_deviceType.toUtf8(), m_sysRoot, m_tc, m_qt, m_mkspec, m_extra);
|
||||||
|
|
||||||
if (map.isEmpty())
|
if (map.isEmpty())
|
||||||
return -2;
|
return -2;
|
||||||
@@ -230,9 +230,9 @@ bool AddKitOperation::test() const
|
|||||||
|| map.value(QLatin1String(DEFAULT)).toInt() != -1)
|
|| map.value(QLatin1String(DEFAULT)).toInt() != -1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
map = addKit(map, QLatin1String("testId"), QLatin1String("Test Qt Version"), QLatin1String("/tmp/icon.png"),
|
map = addKit(map, QLatin1String("testId"), QLatin1String("Test Kit"), QLatin1String("/tmp/icon.png"),
|
||||||
1, QLatin1String("/usr/bin/gdb-test"),
|
1, QLatin1String("/usr/bin/gdb-test"),
|
||||||
QLatin1String("Desktop"), QString(),
|
QByteArray("Desktop"), QString(),
|
||||||
QLatin1String("{some-tc-id}"), QLatin1String("{some-qt-id}"), QLatin1String("unsupported/mkspec"),
|
QLatin1String("{some-tc-id}"), QLatin1String("{some-qt-id}"), QLatin1String("unsupported/mkspec"),
|
||||||
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue"))));
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue"))));
|
||||||
|
|
||||||
@@ -247,11 +247,11 @@ bool AddKitOperation::test() const
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
QVariantMap profile0 = map.value(QLatin1String("Profile.0")).toMap();
|
QVariantMap profile0 = map.value(QLatin1String("Profile.0")).toMap();
|
||||||
if (profile0.count() != 6
|
if (profile0.count() != 5
|
||||||
|| !profile0.contains(QLatin1String(ID))
|
|| !profile0.contains(QLatin1String(ID))
|
||||||
|| profile0.value(QLatin1String(ID)).toString() != QLatin1String("testId")
|
|| profile0.value(QLatin1String(ID)).toString() != QLatin1String("testId")
|
||||||
|| !profile0.contains(QLatin1String(DISPLAYNAME))
|
|| !profile0.contains(QLatin1String(DISPLAYNAME))
|
||||||
|| profile0.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("Test Qt Version")
|
|| profile0.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("Test Kit")
|
||||||
|| !profile0.contains(QLatin1String(AUTODETECTED))
|
|| !profile0.contains(QLatin1String(AUTODETECTED))
|
||||||
|| profile0.value(QLatin1String(AUTODETECTED)).toBool() != true)
|
|| profile0.value(QLatin1String(AUTODETECTED)).toBool() != true)
|
||||||
return false;
|
return false;
|
||||||
@@ -259,16 +259,16 @@ bool AddKitOperation::test() const
|
|||||||
// Ignore existing ids:
|
// Ignore existing ids:
|
||||||
QVariantMap result = addKit(map, QLatin1String("testId"), QLatin1String("Test Qt Version X"), QLatin1String("/tmp/icon3.png"),
|
QVariantMap result = addKit(map, QLatin1String("testId"), QLatin1String("Test Qt Version X"), QLatin1String("/tmp/icon3.png"),
|
||||||
1, QLatin1String("/usr/bin/gdb-test3"),
|
1, QLatin1String("/usr/bin/gdb-test3"),
|
||||||
QLatin1String("Desktop"), QString(),
|
QByteArray("Desktop"), QString(),
|
||||||
QLatin1String("{some-tc-id3}"), QLatin1String("{some-qt-id3}"), QLatin1String("unsupported/mkspec3"),
|
QLatin1String("{some-tc-id3}"), QLatin1String("{some-qt-id3}"), QLatin1String("unsupported/mkspec3"),
|
||||||
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue3"))));
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue3"))));
|
||||||
if (!result.isEmpty())
|
if (!result.isEmpty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Make sure name is unique:
|
// Make sure name is unique:
|
||||||
map = addKit(map, QLatin1String("testId2"), QLatin1String("Test Qt Version"), QLatin1String("/tmp/icon2.png"),
|
map = addKit(map, QLatin1String("testId2"), QLatin1String("Test Kit2"), QLatin1String("/tmp/icon2.png"),
|
||||||
1, QLatin1String("/usr/bin/gdb-test2"),
|
1, QLatin1String("/usr/bin/gdb-test2"),
|
||||||
QLatin1String("Desktop"), QString(),
|
QByteArray("Desktop"), QString(),
|
||||||
QLatin1String("{some-tc-id2}"), QLatin1String("{some-qt-id2}"), QLatin1String("unsupported/mkspec2"),
|
QLatin1String("{some-tc-id2}"), QLatin1String("{some-qt-id2}"), QLatin1String("unsupported/mkspec2"),
|
||||||
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue2"))));
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue2"))));
|
||||||
if (map.count() != 5
|
if (map.count() != 5
|
||||||
@@ -285,11 +285,11 @@ bool AddKitOperation::test() const
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
QVariantMap profile1 = map.value(QLatin1String("Profile.1")).toMap();
|
QVariantMap profile1 = map.value(QLatin1String("Profile.1")).toMap();
|
||||||
if (profile1.count() != 6
|
if (profile1.count() != 5
|
||||||
|| !profile1.contains(QLatin1String(ID))
|
|| !profile1.contains(QLatin1String(ID))
|
||||||
|| profile1.value(QLatin1String(ID)).toString() != QLatin1String("testId2")
|
|| profile1.value(QLatin1String(ID)).toString() != QLatin1String("testId2")
|
||||||
|| !profile1.contains(QLatin1String(DISPLAYNAME))
|
|| !profile1.contains(QLatin1String(DISPLAYNAME))
|
||||||
|| profile1.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("Test Qt Version2")
|
|| profile1.value(QLatin1String(DISPLAYNAME)).toString() != QLatin1String("Test Kit2")
|
||||||
|| !profile1.contains(QLatin1String(AUTODETECTED))
|
|| !profile1.contains(QLatin1String(AUTODETECTED))
|
||||||
|| profile1.value(QLatin1String(AUTODETECTED)).toBool() != true)
|
|| profile1.value(QLatin1String(AUTODETECTED)).toBool() != true)
|
||||||
return false;
|
return false;
|
||||||
@@ -301,7 +301,7 @@ bool AddKitOperation::test() const
|
|||||||
QVariantMap AddKitOperation::addKit(const QVariantMap &map,
|
QVariantMap AddKitOperation::addKit(const QVariantMap &map,
|
||||||
const QString &id, const QString &displayName, const QString &icon,
|
const QString &id, const QString &displayName, const QString &icon,
|
||||||
const quint32 &debuggerType, const QString &debugger,
|
const quint32 &debuggerType, const QString &debugger,
|
||||||
const QString &deviceType, const QString &sysRoot,
|
const QByteArray &deviceType, const QString &sysRoot,
|
||||||
const QString &tc, const QString &qt, const QString &mkspec,
|
const QString &tc, const QString &qt, const QString &mkspec,
|
||||||
const KeyValuePairList &extra)
|
const KeyValuePairList &extra)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public:
|
|||||||
static QVariantMap addKit(const QVariantMap &map,
|
static QVariantMap addKit(const QVariantMap &map,
|
||||||
const QString &id, const QString &displayName, const QString &icon,
|
const QString &id, const QString &displayName, const QString &icon,
|
||||||
const quint32 &debuggerType, const QString &debugger,
|
const quint32 &debuggerType, const QString &debugger,
|
||||||
const QString &deviceType, const QString &sysRoot,
|
const QByteArray &deviceType, const QString &sysRoot,
|
||||||
const QString &tc, const QString &qt, const QString &mkspec,
|
const QString &tc, const QString &qt, const QString &mkspec,
|
||||||
const KeyValuePairList &extra);
|
const KeyValuePairList &extra);
|
||||||
|
|
||||||
|
|||||||
@@ -77,46 +77,74 @@ bool AddQtOperation::setArguments(const QStringList &args)
|
|||||||
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
|
const QString next = ((i + 1) < args.count()) ? args.at(i + 1) : QString();
|
||||||
|
|
||||||
if (current == QLatin1String("--id")) {
|
if (current == QLatin1String("--id")) {
|
||||||
if (next.isNull())
|
if (next.isNull()) {
|
||||||
|
std::cerr << "Error parsing after --id." << std::endl << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
++i; // skip next;
|
++i; // skip next;
|
||||||
m_id = next;
|
m_id = next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current == QLatin1String("--name")) {
|
if (current == QLatin1String("--name")) {
|
||||||
if (next.isNull())
|
if (next.isNull()) {
|
||||||
|
std::cerr << "Error parsing after --name." << std::endl << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
++i; // skip next;
|
++i; // skip next;
|
||||||
m_displayName = next;
|
m_displayName = next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current == QLatin1String("--qmake")) {
|
if (current == QLatin1String("--qmake")) {
|
||||||
if (next.isNull())
|
if (next.isNull()) {
|
||||||
|
std::cerr << "Error parsing after --qmake." << std::endl << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
++i; // skip next;
|
++i; // skip next;
|
||||||
m_qmake = next;
|
m_qmake = next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current == QLatin1String("--type")) {
|
if (current == QLatin1String("--type")) {
|
||||||
if (next.isNull())
|
if (next.isNull()) {
|
||||||
|
std::cerr << "Error parsing after --type." << std::endl << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
++i; // skip next;
|
++i; // skip next;
|
||||||
m_type = next;
|
m_type = next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (next.isNull())
|
if (next.isNull()) {
|
||||||
|
std::cerr << "Unknown parameter: " << qPrintable(current) << std::endl << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
++i; // skip next;
|
++i; // skip next;
|
||||||
KeyValuePair pair(current, next);
|
KeyValuePair pair(current, next);
|
||||||
if (!pair.value.isValid())
|
if (!pair.value.isValid()) {
|
||||||
|
std::cerr << "Error parsing: " << qPrintable(current) << " " << qPrintable(next) << std::endl << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
m_extra << pair;
|
m_extra << pair;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_id.isEmpty()) {
|
||||||
|
std::cerr << "Error no id was passed." << std::endl << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_displayName.isEmpty()) {
|
||||||
|
std::cerr << "Error no display name was passed." << std::endl << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_qmake.isEmpty()) {
|
||||||
|
std::cerr << "Error no qmake was passed." << std::endl << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_type.isEmpty()) {
|
||||||
|
std::cerr << "Error no type was passed." << std::endl << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
return !m_id.isEmpty() && !m_displayName.isEmpty() && !m_qmake.isEmpty() && !m_type.isEmpty();
|
return !m_id.isEmpty() && !m_displayName.isEmpty() && !m_qmake.isEmpty() && !m_type.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +183,7 @@ bool AddQtOperation::test() const
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
QVariantMap version0 = map.value(QLatin1String("QtVersion.0")).toMap();
|
QVariantMap version0 = map.value(QLatin1String("QtVersion.0")).toMap();
|
||||||
if (version0.count() != 6
|
if (version0.count() != 7
|
||||||
|| !version0.contains(QLatin1String(ID))
|
|| !version0.contains(QLatin1String(ID))
|
||||||
|| version0.value(QLatin1String(ID)).toInt() != -1
|
|| version0.value(QLatin1String(ID)).toInt() != -1
|
||||||
|| !version0.contains(QLatin1String(DISPLAYNAME))
|
|| !version0.contains(QLatin1String(DISPLAYNAME))
|
||||||
@@ -194,7 +222,7 @@ bool AddQtOperation::test() const
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
QVariantMap version1 = map.value(QLatin1String("QtVersion.1")).toMap();
|
QVariantMap version1 = map.value(QLatin1String("QtVersion.1")).toMap();
|
||||||
if (version1.count() != 6
|
if (version1.count() != 7
|
||||||
|| !version1.contains(QLatin1String(ID))
|
|| !version1.contains(QLatin1String(ID))
|
||||||
|| version1.value(QLatin1String(ID)).toInt() != -1
|
|| version1.value(QLatin1String(ID)).toInt() != -1
|
||||||
|| !version1.contains(QLatin1String(DISPLAYNAME))
|
|| !version1.contains(QLatin1String(DISPLAYNAME))
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ int parseArguments(const QStringList &args, Settings *s, const QList<Operation *
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!s->operation->setArguments(opArgs)) {
|
if (!s->operation->setArguments(opArgs)) {
|
||||||
|
std::cerr << "Argument parsing failed." << std::endl << std::endl;
|
||||||
printHelp(s->operation);
|
printHelp(s->operation);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,8 +105,6 @@ QVariantMap Operation::load(const QString &file) const
|
|||||||
if (!reader.load(path))
|
if (!reader.load(path))
|
||||||
return QVariantMap();
|
return QVariantMap();
|
||||||
map = reader.restoreValues();
|
map = reader.restoreValues();
|
||||||
} else {
|
|
||||||
std::cout << "No such file: " << qPrintable(path.toUserOutput()) << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ bool RmKitOperation::test() const
|
|||||||
QLatin1String("testId"), QLatin1String("Test Qt Version"),
|
QLatin1String("testId"), QLatin1String("Test Qt Version"),
|
||||||
QLatin1String("/tmp/icon.png"),
|
QLatin1String("/tmp/icon.png"),
|
||||||
1, QLatin1String("/usr/bin/gdb-test"),
|
1, QLatin1String("/usr/bin/gdb-test"),
|
||||||
QLatin1String("Desktop"), QString(),
|
QByteArray("Desktop"), QString(),
|
||||||
QLatin1String("{some-tc-id}"), QLatin1String("{some-qt-id}"),
|
QLatin1String("{some-tc-id}"), QLatin1String("{some-qt-id}"),
|
||||||
QLatin1String("unsupported/mkspec"),
|
QLatin1String("unsupported/mkspec"),
|
||||||
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue"))));
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue"))));
|
||||||
@@ -108,7 +108,7 @@ bool RmKitOperation::test() const
|
|||||||
AddKitOperation::addKit(map, QLatin1String("testId2"), QLatin1String("Test Qt Version"),
|
AddKitOperation::addKit(map, QLatin1String("testId2"), QLatin1String("Test Qt Version"),
|
||||||
QLatin1String("/tmp/icon2.png"),
|
QLatin1String("/tmp/icon2.png"),
|
||||||
1, QLatin1String("/usr/bin/gdb-test2"),
|
1, QLatin1String("/usr/bin/gdb-test2"),
|
||||||
QLatin1String("Desktop"), QString(),
|
QByteArray("Desktop"), QString(),
|
||||||
QLatin1String("{some-tc-id2}"), QLatin1String("{some-qt-id2}"),
|
QLatin1String("{some-tc-id2}"), QLatin1String("{some-qt-id2}"),
|
||||||
QLatin1String("unsupported/mkspec2"),
|
QLatin1String("unsupported/mkspec2"),
|
||||||
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue2"))));
|
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue2"))));
|
||||||
|
|||||||
@@ -42,3 +42,5 @@ DESTDIR=$$IDE_LIBEXEC_PATH
|
|||||||
macx:DEFINES += "DATA_PATH=\"\\\".\\\"\""
|
macx:DEFINES += "DATA_PATH=\"\\\".\\\"\""
|
||||||
else:DEFINES += "DATA_PATH=\"\\\"../share/qtcreator\\\"\""
|
else:DEFINES += "DATA_PATH=\"\\\"../share/qtcreator\\\"\""
|
||||||
|
|
||||||
|
target.path = $$QTC_PREFIX/bin # FIXME: libexec, more or less
|
||||||
|
INSTALLS += target
|
||||||
|
|||||||
@@ -956,19 +956,19 @@ namespace qhash {
|
|||||||
|
|
||||||
Hash::iterator it1 = hash.begin();
|
Hash::iterator it1 = hash.begin();
|
||||||
Hash::iterator it2 = it1; ++it2;
|
Hash::iterator it2 = it1; ++it2;
|
||||||
Hash::iterator it3 = it2; ++it2;
|
Hash::iterator it3 = it2; ++it3;
|
||||||
Hash::iterator it4 = it3; ++it3;
|
Hash::iterator it4 = it3; ++it4;
|
||||||
Hash::iterator it5 = it4; ++it4;
|
Hash::iterator it5 = it4; ++it5;
|
||||||
Hash::iterator it6 = it5; ++it5;
|
Hash::iterator it6 = it5; ++it6;
|
||||||
|
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Expand hash.
|
// Expand hash.
|
||||||
// Check hash <6 items> Hash.
|
// Check hash <6 items> qhash::Hash.
|
||||||
// Check hash.11 11 float.
|
// Check hash.11 11 float.
|
||||||
// Check it1.first 11 int.
|
// Check it1.key 55 int.
|
||||||
// Check it1.second 11 float.
|
// Check it1.value 55 float.
|
||||||
// Check it1.first 55 int.
|
// Check it6.key 33 int.
|
||||||
// Check it1.second 55 float.
|
// Check it6.value 33 float.
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(&hash, &it1, &it2, &it3, &it4, &it5, &it6);
|
dummyStatement(&hash, &it1, &it2, &it3, &it4, &it5, &it6);
|
||||||
}
|
}
|
||||||
@@ -1746,7 +1746,7 @@ namespace qobject {
|
|||||||
s += test.myProp2();
|
s += test.myProp2();
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Check s "HELLOWORLD" QString.
|
// Check s "HELLOWORLD" QString.
|
||||||
// Check test "" qobject::Names::Bar::TestObject.
|
// Check test qobject::Names::Bar::TestObject.
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(&s);
|
dummyStatement(&s);
|
||||||
#endif
|
#endif
|
||||||
@@ -2141,7 +2141,7 @@ namespace plugin {
|
|||||||
#endif
|
#endif
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// CheckType dir QString.
|
// CheckType dir QString.
|
||||||
// Check lib "" QLibrary.
|
// CheckType lib QLibrary.
|
||||||
// CheckType name QString.
|
// CheckType name QString.
|
||||||
// CheckType res int.
|
// CheckType res int.
|
||||||
// Continue.
|
// Continue.
|
||||||
@@ -2175,7 +2175,7 @@ namespace final {
|
|||||||
QVariant value = settings.value("item1","").toString();
|
QVariant value = settings.value("item1","").toString();
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Expand settings.
|
// Expand settings.
|
||||||
// Check settings "" QSettings.
|
// Check settings QSettings.
|
||||||
// Check settings.@1 "" QObject.
|
// Check settings.@1 "" QObject.
|
||||||
// Check value "" QVariant (QString).
|
// Check value "" QVariant (QString).
|
||||||
// Continue.
|
// Continue.
|
||||||
@@ -2852,19 +2852,19 @@ namespace stdmap {
|
|||||||
|
|
||||||
Map::iterator it1 = map.begin();
|
Map::iterator it1 = map.begin();
|
||||||
Map::iterator it2 = it1; ++it2;
|
Map::iterator it2 = it1; ++it2;
|
||||||
Map::iterator it3 = it2; ++it2;
|
Map::iterator it3 = it2; ++it3;
|
||||||
Map::iterator it4 = it3; ++it3;
|
Map::iterator it4 = it3; ++it4;
|
||||||
Map::iterator it5 = it4; ++it4;
|
Map::iterator it5 = it4; ++it5;
|
||||||
Map::iterator it6 = it5; ++it5;
|
Map::iterator it6 = it5; ++it6;
|
||||||
|
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Expand map.
|
// Expand map.
|
||||||
// Check map <6 items> std::map<int, float>.
|
// Check map <6 items> stdmap::Map.
|
||||||
// Check map.11 11 float.
|
// Check map.11 11 float.
|
||||||
// Check it1.first 11 int.
|
// Check it1.first 11 int.
|
||||||
// Check it1.second 11 float.
|
// Check it1.second 11 float.
|
||||||
// Check it1.first 55 int.
|
// Check it6.first 66 int.
|
||||||
// Check it1.second 55 float.
|
// Check it6.second 66 float.
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(&map, &it1, &it2, &it3, &it4, &it5, &it6);
|
dummyStatement(&map, &it1, &it2, &it3, &it4, &it5, &it6);
|
||||||
}
|
}
|
||||||
@@ -3026,17 +3026,15 @@ namespace stdset {
|
|||||||
|
|
||||||
Set::iterator it1 = set.begin();
|
Set::iterator it1 = set.begin();
|
||||||
Set::iterator it2 = it1; ++it2;
|
Set::iterator it2 = it1; ++it2;
|
||||||
Set::iterator it3 = it2; ++it2;
|
Set::iterator it3 = it2; ++it3;
|
||||||
Set::iterator it4 = it3; ++it3;
|
Set::iterator it4 = it3; ++it4;
|
||||||
Set::iterator it5 = it4; ++it4;
|
Set::iterator it5 = it4; ++it5;
|
||||||
Set::iterator it6 = it5; ++it5;
|
Set::iterator it6 = it5; ++it6;
|
||||||
|
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Check set <6 items> std::set<int>.
|
// Check set <6 items> stdset::Set.
|
||||||
// Check it1.key 11 unsigned int.
|
|
||||||
// Check it1.value 11 int.
|
// Check it1.value 11 int.
|
||||||
// Check it1.key 55 unsigned int.
|
// Check it6.value 66 int.
|
||||||
// Check it1.value 55 int.
|
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(&set, &it1, &it2, &it3, &it4, &it5, &it6);
|
dummyStatement(&set, &it1, &it2, &it3, &it4, &it5, &it6);
|
||||||
}
|
}
|
||||||
@@ -3486,7 +3484,7 @@ namespace itemmodel {
|
|||||||
// CheckType i1 QStandardItem.
|
// CheckType i1 QStandardItem.
|
||||||
// CheckType i11 QStandardItem.
|
// CheckType i11 QStandardItem.
|
||||||
// CheckType i2 QStandardItem.
|
// CheckType i2 QStandardItem.
|
||||||
// Check m "" QStandardItemModel.
|
// Check m QStandardItemModel.
|
||||||
// Check mi "1" QModelIndex.
|
// Check mi "1" QModelIndex.
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(&i1, &mi, &m, &i2, &i11);
|
dummyStatement(&i1, &mi, &m, &i2, &i11);
|
||||||
@@ -3846,9 +3844,11 @@ namespace qthread {
|
|||||||
if (m_id == 3) {
|
if (m_id == 3) {
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Expand this.
|
// Expand this.
|
||||||
|
// Expand this.@1.
|
||||||
// Check j 3 int.
|
// Check j 3 int.
|
||||||
// CheckType this qthread::Thread.
|
// CheckType this qthread::Thread.
|
||||||
// Check this.@1 "This is thread #3" QThread.
|
// Check this.@1 QThread.
|
||||||
|
// Check this.@1.@1 "This is thread #3" QObject.
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(this);
|
dummyStatement(this);
|
||||||
}
|
}
|
||||||
@@ -3871,9 +3871,15 @@ namespace qthread {
|
|||||||
}
|
}
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Expand thread.
|
// Expand thread.
|
||||||
|
// Expand thread.0.
|
||||||
|
// Expand thread.0.@1.
|
||||||
|
// Expand thread.13.
|
||||||
|
// Expand thread.13.@1.
|
||||||
// CheckType thread qthread::Thread [14].
|
// CheckType thread qthread::Thread [14].
|
||||||
// Check thread.0 "This is thread #0" qthread::Thread.
|
// Check thread.0 qthread::Thread.
|
||||||
// Check thread.13 "This is thread #13" qthread::Thread.
|
// Check thread.0.@1.@1 "This is thread #0" qthread::Thread.
|
||||||
|
// Check thread.13 qthread::Thread.
|
||||||
|
// Check thread.13.@1.@1 "This is thread #13" qthread::Thread.
|
||||||
// Continue.
|
// Continue.
|
||||||
for (int i = 0; i != N; ++i) {
|
for (int i = 0; i != N; ++i) {
|
||||||
thread[i].wait();
|
thread[i].wait();
|
||||||
@@ -5065,7 +5071,7 @@ namespace basic {
|
|||||||
ba.append('x');
|
ba.append('x');
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Check ba "x" QByteArray.
|
// Check ba "x" QByteArray.
|
||||||
// Check proc "" QProcess.
|
// Check proc QProcess.
|
||||||
// Continue.
|
// Continue.
|
||||||
|
|
||||||
// Check there is some contents in ba. Error message is expected.
|
// Check there is some contents in ba. Error message is expected.
|
||||||
@@ -5410,7 +5416,7 @@ namespace qscript {
|
|||||||
QScriptValue s;
|
QScriptValue s;
|
||||||
|
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Check engine "" QScriptEngine.
|
// Check engine QScriptEngine.
|
||||||
// Check s (invalid) QScriptValue.
|
// Check s (invalid) QScriptValue.
|
||||||
// Check x1 <not accessible> QString.
|
// Check x1 <not accessible> QString.
|
||||||
// Continue.
|
// Continue.
|
||||||
@@ -5505,10 +5511,12 @@ namespace boost {
|
|||||||
boost::shared_ptr<int> j = i;
|
boost::shared_ptr<int> j = i;
|
||||||
boost::shared_ptr<QStringList> sl(new QStringList(QStringList() << "HUH!"));
|
boost::shared_ptr<QStringList> sl(new QStringList(QStringList() << "HUH!"));
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Check s boost::shared_ptr<int>.
|
// Expand sl.
|
||||||
|
// Check s (null) boost::shared_ptr<int>.
|
||||||
// Check i 43 boost::shared_ptr<int>.
|
// Check i 43 boost::shared_ptr<int>.
|
||||||
// Check j 43 boost::shared_ptr<int>.
|
// Check j 43 boost::shared_ptr<int>.
|
||||||
// Check sl <1 item> boost::shared_ptr<QStringList>.
|
// Check sl boost::shared_ptr<QStringList>.
|
||||||
|
// Check sl.data <1 items> QStringList
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(&s, &j, &sl);
|
dummyStatement(&s, &j, &sl);
|
||||||
}
|
}
|
||||||
@@ -5547,7 +5555,7 @@ namespace boost {
|
|||||||
// Not where we started (expected in boost)
|
// Not where we started (expected in boost)
|
||||||
d -= months(4);
|
d -= months(4);
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Check d Tue Nov 30 2005 boost::gregorian::date.
|
// Check d Wed Nov 30 2005 boost::gregorian::date.
|
||||||
// Continue.
|
// Continue.
|
||||||
|
|
||||||
dummyStatement(&d);
|
dummyStatement(&d);
|
||||||
@@ -6199,8 +6207,11 @@ namespace bug6857 {
|
|||||||
file.setObjectName("A file");
|
file.setObjectName("A file");
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Expand file.
|
// Expand file.
|
||||||
// Check file "A file" bug6857::MyFile.
|
// Expand file.@1.
|
||||||
|
// Expand file.@1.@1.
|
||||||
|
// Check file bug6857::MyFile.
|
||||||
// Check file.@1 "/tmp/tt" QFile.
|
// Check file.@1 "/tmp/tt" QFile.
|
||||||
|
// Check file.@1.@1.@1 "A file" QObject.
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(&file);
|
dummyStatement(&file);
|
||||||
}
|
}
|
||||||
@@ -6222,8 +6233,12 @@ namespace bug6858 {
|
|||||||
file.setObjectName("Another file");
|
file.setObjectName("Another file");
|
||||||
QFile *pfile = &file;
|
QFile *pfile = &file;
|
||||||
BREAK_HERE;
|
BREAK_HERE;
|
||||||
// Check pfile "Another file" bug6858::MyFile.
|
// Expand pfile.
|
||||||
|
// Expand pfile.@1.
|
||||||
|
// Expand pfile.@1.@1.
|
||||||
|
// Check pfile bug6858::MyFile.
|
||||||
// Check pfile.@1 "/tmp/tt" QFile.
|
// Check pfile.@1 "/tmp/tt" QFile.
|
||||||
|
// Check pfile.@1.@1.@1 "Another file" QObject.
|
||||||
// Continue.
|
// Continue.
|
||||||
dummyStatement(&file, pfile);
|
dummyStatement(&file, pfile);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,13 +83,16 @@ def shadowBuildDir(path, project, qtVersion, debugVersion):
|
|||||||
# because the Simulator target is added for some cases even when Simulator has not
|
# because the Simulator target is added for some cases even when Simulator has not
|
||||||
# been set up inside Qt versions/Toolchains
|
# been set up inside Qt versions/Toolchains
|
||||||
# this list can be used in __chooseTargets__()
|
# this list can be used in __chooseTargets__()
|
||||||
def __createProjectSelectType__(category, template, fromWelcome = False):
|
def __createProjectOrFileSelectType__(category, template, fromWelcome = False, isProject=True):
|
||||||
if fromWelcome:
|
if fromWelcome:
|
||||||
mouseClick(waitForObject(":CreateProject_QStyleItem"), 5, 5, 0, Qt.LeftButton)
|
mouseClick(waitForObject(":CreateProject_QStyleItem"), 5, 5, 0, Qt.LeftButton)
|
||||||
else:
|
else:
|
||||||
invokeMenuItem("File", "New File or Project...")
|
invokeMenuItem("File", "New File or Project...")
|
||||||
categoriesView = waitForObject("{type='QTreeView' name='templateCategoryView'}", 20000)
|
categoriesView = waitForObject("{type='QTreeView' name='templateCategoryView'}", 20000)
|
||||||
|
if isProject:
|
||||||
clickItem(categoriesView, "Projects." + category, 5, 5, 0, Qt.LeftButton)
|
clickItem(categoriesView, "Projects." + category, 5, 5, 0, Qt.LeftButton)
|
||||||
|
else:
|
||||||
|
clickItem(categoriesView, "Files and Classes." + category, 5, 5, 0, Qt.LeftButton)
|
||||||
templatesView = waitForObject("{name='templatesView' type='QListView'}", 20000)
|
templatesView = waitForObject("{name='templatesView' type='QListView'}", 20000)
|
||||||
clickItem(templatesView, template, 5, 5, 0, Qt.LeftButton)
|
clickItem(templatesView, template, 5, 5, 0, Qt.LeftButton)
|
||||||
text = waitForObject("{type='QTextBrowser' name='templateDescription' visible='1'}").plainText
|
text = waitForObject("{type='QTextBrowser' name='templateDescription' visible='1'}").plainText
|
||||||
@@ -150,7 +153,7 @@ def __verifyFileCreation__(path, expectedFiles):
|
|||||||
# param checks turns tests in the function on if set to True
|
# param checks turns tests in the function on if set to True
|
||||||
def createProject_Qt_GUI(path, projectName, checks = True):
|
def createProject_Qt_GUI(path, projectName, checks = True):
|
||||||
template = "Qt Gui Application"
|
template = "Qt Gui Application"
|
||||||
available = __createProjectSelectType__(" Applications", template)
|
available = __createProjectOrFileSelectType__(" Applications", template)
|
||||||
__createProjectSetNameAndPath__(path, projectName, checks)
|
__createProjectSetNameAndPath__(path, projectName, checks)
|
||||||
__selectQtVersionDesktop__(checks, available)
|
__selectQtVersionDesktop__(checks, available)
|
||||||
|
|
||||||
@@ -188,7 +191,7 @@ def createProject_Qt_GUI(path, projectName, checks = True):
|
|||||||
# param projectName is the name for the new project
|
# param projectName is the name for the new project
|
||||||
# param checks turns tests in the function on if set to True
|
# param checks turns tests in the function on if set to True
|
||||||
def createProject_Qt_Console(path, projectName, checks = True):
|
def createProject_Qt_Console(path, projectName, checks = True):
|
||||||
available = __createProjectSelectType__(" Applications", "Qt Console Application")
|
available = __createProjectOrFileSelectType__(" Applications", "Qt Console Application")
|
||||||
__createProjectSetNameAndPath__(path, projectName, checks)
|
__createProjectSetNameAndPath__(path, projectName, checks)
|
||||||
__selectQtVersionDesktop__(checks, available)
|
__selectQtVersionDesktop__(checks, available)
|
||||||
|
|
||||||
@@ -210,9 +213,9 @@ def createNewQtQuickApplication(workingDir, projectName = None, templateFile = N
|
|||||||
targets = QtQuickConstants.Targets.DESKTOP_474_GCC, qtQuickVersion=1,
|
targets = QtQuickConstants.Targets.DESKTOP_474_GCC, qtQuickVersion=1,
|
||||||
fromWelcome=False):
|
fromWelcome=False):
|
||||||
if templateFile:
|
if templateFile:
|
||||||
available = __createProjectSelectType__(" Applications", "Qt Quick Application (from Existing QML File)", fromWelcome)
|
available = __createProjectOrFileSelectType__(" Applications", "Qt Quick Application (from Existing QML File)", fromWelcome)
|
||||||
else:
|
else:
|
||||||
available = __createProjectSelectType__(" Applications", "Qt Quick %d Application (Built-in Elements)"
|
available = __createProjectOrFileSelectType__(" Applications", "Qt Quick %d Application (Built-in Elements)"
|
||||||
% qtQuickVersion, fromWelcome)
|
% qtQuickVersion, fromWelcome)
|
||||||
projectName = __createProjectSetNameAndPath__(workingDir, projectName)
|
projectName = __createProjectSetNameAndPath__(workingDir, projectName)
|
||||||
if templateFile:
|
if templateFile:
|
||||||
@@ -228,7 +231,7 @@ def createNewQtQuickApplication(workingDir, projectName = None, templateFile = N
|
|||||||
return projectName
|
return projectName
|
||||||
|
|
||||||
def createNewQtQuickUI(workingDir):
|
def createNewQtQuickUI(workingDir):
|
||||||
__createProjectSelectType__(" Applications", "Qt Quick UI")
|
__createProjectOrFileSelectType__(" Applications", "Qt Quick UI")
|
||||||
if workingDir == None:
|
if workingDir == None:
|
||||||
workingDir = tempDir()
|
workingDir = tempDir()
|
||||||
projectName = __createProjectSetNameAndPath__(workingDir)
|
projectName = __createProjectSetNameAndPath__(workingDir)
|
||||||
@@ -236,7 +239,7 @@ def createNewQtQuickUI(workingDir):
|
|||||||
return projectName
|
return projectName
|
||||||
|
|
||||||
def createNewQmlExtension(workingDir):
|
def createNewQmlExtension(workingDir):
|
||||||
available = __createProjectSelectType__(" Libraries", "Custom QML Extension Plugin")
|
available = __createProjectOrFileSelectType__(" Libraries", "Custom QML Extension Plugin")
|
||||||
if workingDir == None:
|
if workingDir == None:
|
||||||
workingDir = tempDir()
|
workingDir = tempDir()
|
||||||
__createProjectSetNameAndPath__(workingDir)
|
__createProjectSetNameAndPath__(workingDir)
|
||||||
@@ -248,7 +251,7 @@ def createNewQmlExtension(workingDir):
|
|||||||
replaceEditorContent(nameLineEd, "TestItem")
|
replaceEditorContent(nameLineEd, "TestItem")
|
||||||
uriLineEd = waitForObject("{buddy={type='QLabel' text='URI:' unnamed='1' visible='1'} "
|
uriLineEd = waitForObject("{buddy={type='QLabel' text='URI:' unnamed='1' visible='1'} "
|
||||||
"type='QLineEdit' unnamed='1' visible='1'}", 20000)
|
"type='QLineEdit' unnamed='1' visible='1'}", 20000)
|
||||||
replaceEditorContent(uriLineEd, "com.nokia.test.qmlcomponents")
|
replaceEditorContent(uriLineEd, "org.qt-project.test.qmlcomponents")
|
||||||
clickButton(nextButton)
|
clickButton(nextButton)
|
||||||
__createProjectHandleLastPage__()
|
__createProjectHandleLastPage__()
|
||||||
|
|
||||||
|
|||||||
114
tests/system/tools/findUnusedObjects.py
Executable file
@@ -0,0 +1,114 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import tokenize
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
objMap = None
|
||||||
|
|
||||||
|
def parseCommandLine():
|
||||||
|
global directory, onlyRemovable, fileType
|
||||||
|
scriptChoice = ('Python', 'JavaScript', 'Perl', 'Tcl', 'Ruby')
|
||||||
|
parser = OptionParser("\n%prog [OPTIONS] [DIRECTORY]")
|
||||||
|
parser.add_option("-o", "--only-removable", dest="onlyRemovable",
|
||||||
|
action="store_true", default=False,
|
||||||
|
help="list removable objects only")
|
||||||
|
parser.add_option("-t", "--type", dest='fileType', type="choice",
|
||||||
|
choices=scriptChoice,
|
||||||
|
default='Python', nargs=1, metavar='LANG',
|
||||||
|
help="script language of the Squish tests (" +
|
||||||
|
", ".join(scriptChoice) + "; default: %default)")
|
||||||
|
(options, args) = parser.parse_args()
|
||||||
|
if len(args) == 0:
|
||||||
|
directory = os.path.abspath(".")
|
||||||
|
elif len(args) == 1:
|
||||||
|
directory = os.path.abspath(args[0])
|
||||||
|
else:
|
||||||
|
print "\nERROR: Too many arguments\n"
|
||||||
|
parser.print_help()
|
||||||
|
sys.exit(1)
|
||||||
|
onlyRemovable = options.onlyRemovable
|
||||||
|
fileType = options.fileType
|
||||||
|
|
||||||
|
def checkDirectory():
|
||||||
|
global directory, objMap
|
||||||
|
if not os.path.exists(directory):
|
||||||
|
print "Given path '%s' does not exist" % directory
|
||||||
|
sys.exit(1)
|
||||||
|
objMap = os.path.join(directory, "objects.map")
|
||||||
|
if not os.path.exists(objMap):
|
||||||
|
print "Given path '%s' does not contain an objects.map file" % directory
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def getFileContent(filePath):
|
||||||
|
if os.path.isfile(filePath):
|
||||||
|
f = open(filePath, "r")
|
||||||
|
data = f.read()
|
||||||
|
f.close()
|
||||||
|
return data
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def collectObjects():
|
||||||
|
global objMap
|
||||||
|
data = getFileContent(objMap)
|
||||||
|
return map(lambda x: x.strip().split("\t", 1)[0], data.strip().splitlines())
|
||||||
|
|
||||||
|
def getFileSuffix():
|
||||||
|
global fileType
|
||||||
|
fileSuffixes = {'Python':'.py', 'JavaScript':'.js', 'Perl':'.pl',
|
||||||
|
'Tcl':'.tcl', 'Ruby':'.rb'}
|
||||||
|
return fileSuffixes.get(fileType, None)
|
||||||
|
|
||||||
|
def handle_token(tokenType, token, (startRow, startCol), (endRow, endCol), line):
|
||||||
|
global useCounts
|
||||||
|
if tokenize.tok_name[tokenType] == 'STRING':
|
||||||
|
for obj in useCounts:
|
||||||
|
useCounts[obj] += str(token).count("'%s'" % obj)
|
||||||
|
useCounts[obj] += str(token).count('"%s"' % obj)
|
||||||
|
|
||||||
|
def findUsages():
|
||||||
|
global directory, objMap
|
||||||
|
suffix = getFileSuffix()
|
||||||
|
for root, dirnames, filenames in os.walk(directory):
|
||||||
|
for filename in filter(lambda x: x.endswith(suffix), filenames):
|
||||||
|
currentFile = open(os.path.join(root, filename))
|
||||||
|
tokenize.tokenize(currentFile.readline, handle_token)
|
||||||
|
currentFile.close()
|
||||||
|
currentFile = open(objMap)
|
||||||
|
tokenize.tokenize(currentFile.readline, handle_token)
|
||||||
|
currentFile.close()
|
||||||
|
|
||||||
|
def printResult():
|
||||||
|
global useCounts, onlyRemovable
|
||||||
|
print
|
||||||
|
if onlyRemovable:
|
||||||
|
if min(useCounts.values()) > 0:
|
||||||
|
print "All objects are used once at least.\n"
|
||||||
|
return False
|
||||||
|
print "Unused objects:\n"
|
||||||
|
for obj in filter(lambda x: useCounts[x] == 0, useCounts):
|
||||||
|
print "%s" % obj
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
length = max(map(len, useCounts.keys()))
|
||||||
|
outFormat = "%%%ds %%3d" % length
|
||||||
|
for obj,useCount in useCounts.iteritems():
|
||||||
|
print outFormat % (obj, useCount)
|
||||||
|
print
|
||||||
|
return None
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global useCounts
|
||||||
|
checkDirectory()
|
||||||
|
useCounts = dict.fromkeys(collectObjects(), 0)
|
||||||
|
findUsages()
|
||||||
|
atLeastOneRemovable = printResult()
|
||||||
|
if atLeastOneRemovable:
|
||||||
|
print "\nAfter removing the listed objects you should re-run this tool"
|
||||||
|
print "to find objects that might have been used only by these objects.\n"
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parseCommandLine()
|
||||||
|
sys.exit(main())
|
||||||