Merge remote-tracking branch 'origin/3.3'

Conflicts:
	src/plugins/debugger/watchhandler.cpp
	src/plugins/projectexplorer/kitmodel.cpp
	src/plugins/qbsprojectmanager/qbsprojectmanager.cpp
	src/shared/qbs

Change-Id: I6a68090993a264e93ac7850858cc24ba6bdb5602
This commit is contained in:
Eike Ziller
2015-02-12 17:36:29 +01:00
44 changed files with 302 additions and 214 deletions

View File

@@ -631,10 +631,15 @@ QList<LookupItem> ClassOrNamespace::lookup_helper(const Name *name, bool searchI
// a qualified name. For instance, a nested class which is forward declared
// in the class but defined outside it - we should capture both.
Symbol *match = 0;
QSet<ClassOrNamespace *> processed;
for (ClassOrNamespace *parentBinding = binding->parent();
parentBinding && !match;
parentBinding = parentBinding->parent())
parentBinding = parentBinding->parent()) {
if (processed.contains(parentBinding))
break;
processed.insert(parentBinding);
match = parentBinding->lookupInScope(fullName);
}
if (match) {
LookupItem item;
@@ -648,8 +653,12 @@ QList<LookupItem> ClassOrNamespace::lookup_helper(const Name *name, bool searchI
}
QSet<ClassOrNamespace *> processed;
QSet<ClassOrNamespace *> processedOwnParents;
ClassOrNamespace *binding = this;
do {
if (processedOwnParents.contains(binding))
break;
processedOwnParents.insert(binding);
lookup_helper(name, binding, &result, &processed, /*templateId = */ 0);
binding = binding->_parent;
} while (searchInEnclosingScope && binding);

View File

@@ -140,6 +140,12 @@ static bool isQtReservedWord(const char *name, int size)
return false;
}
static void nestingTooDeep()
{
#ifndef NO_DEBUG
std::cerr << "*** WARNING #if / #ifdef nesting exceeded the max level " << MAX_LEVEL << std::endl;
#endif
}
} // anonymous namespace
@@ -1824,6 +1830,12 @@ void Preprocessor::handleIfDirective(PPToken *tk)
lex(tk); // consume "if" token
Value result;
const PPToken lastExpressionToken = evalExpression(tk, result);
if (m_state.m_ifLevel >= MAX_LEVEL - 1) {
nestingTooDeep();
return;
}
const bool value = !result.is_zero();
const bool wasSkipping = m_state.m_skipping[m_state.m_ifLevel];
@@ -1950,12 +1962,17 @@ void Preprocessor::handleIfDefDirective(bool checkUndefined, PPToken *tk)
value = !value;
const bool wasSkipping = m_state.m_skipping[m_state.m_ifLevel];
++m_state.m_ifLevel;
m_state.m_trueTest[m_state.m_ifLevel] = value;
m_state.m_skipping[m_state.m_ifLevel] = wasSkipping ? wasSkipping : !value;
if (m_client && !wasSkipping && !value)
startSkippingBlocks(*tk);
if (m_state.m_ifLevel < MAX_LEVEL - 1) {
++m_state.m_ifLevel;
m_state.m_trueTest[m_state.m_ifLevel] = value;
m_state.m_skipping[m_state.m_ifLevel] = wasSkipping ? wasSkipping : !value;
if (m_client && !wasSkipping && !value)
startSkippingBlocks(*tk);
} else {
nestingTooDeep();
}
lex(tk); // consume the identifier
#ifndef NO_DEBUG

View File

@@ -1006,7 +1006,8 @@ void ModelManagerInterface::importScan(QFutureInterface<void> &future,
int totalWork(progressRange), workDone(0);
future.setProgressRange(0, progressRange); // update max length while iterating?
const Snapshot snapshot = modelManager->snapshot();
while (!pathsToScan.isEmpty() && !future.isCanceled()) {
bool isCanceled = future.isCanceled();
while (!pathsToScan.isEmpty() && !isCanceled) {
ScanItem toScan = pathsToScan.last();
pathsToScan.pop_back();
int pathBudget = (1 << (maxScanDepth + 2 - toScan.depth));
@@ -1043,9 +1044,10 @@ void ModelManagerInterface::importScan(QFutureInterface<void> &future,
workDone += pathBudget * 3 / 4;
}
future.setProgressValue(progressRange * workDone / totalWork);
isCanceled = future.isCanceled();
}
future.setProgressValue(progressRange);
if (future.isCanceled()) {
if (isCanceled) {
// assume no work has been done
QMutexLocker l(&modelManager->m_mutex);
for (int i = 0; i < paths.size(); ++i)

View File

@@ -354,6 +354,7 @@ QPalette Theme::palette() const
pal.setBrush(QPalette::ButtonText, color(Theme::TextColorNormal));
pal.setBrush(QPalette::ToolTipBase, color(Theme::BackgroundColorSelected));
pal.setColor(QPalette::Highlight, color(Theme::BackgroundColorSelected));
pal.setColor(QPalette::Dark, color(Theme::BackgroundColorDark));
pal.setColor(QPalette::HighlightedText, Qt::white);
pal.setColor(QPalette::ToolTipText, color(Theme::TextColorNormal));
return pal;

View File

@@ -8,11 +8,6 @@ QT += script network
CONFIG += exceptions # used by portlist.cpp, textfileformat.cpp, and ssh/*
win32-msvc* {
# disable warnings caused by botan headers
QMAKE_CXXFLAGS += -wd4250 -wd4290
}
SOURCES += $$PWD/environment.cpp \
$$PWD/environmentmodel.cpp \
$$PWD/qtcprocess.cpp \

View File

@@ -390,14 +390,6 @@ void AndroidRunner::asyncStart()
args << _("-e") << _("qml_debug") << _("true");
args << _("-e") << _("qmljsdebugger") << QString::fromLatin1("port:%1,block").arg(m_qmlPort);
}
if (m_useLocalQtLibs) {
args << _("-e") << _("use_local_qt_libs") << _("true");
args << _("-e") << _("libs_prefix") << _("/data/local/tmp/qt/");
args << _("-e") << _("load_local_libs") << m_localLibs;
args << _("-e") << _("load_local_jars") << m_localJars;
if (!m_localJarsInitClasses.isEmpty())
args << _("-e") << _("static_init_classes") << m_localJarsInitClasses;
}
QProcess adb;
adb.start(m_adb, args);

View File

@@ -518,7 +518,7 @@ void QmlEngine::serviceConnectionError(const QString &serviceName)
bool QmlEngine::canDisplayTooltip() const
{
return state() == InferiorRunOk || state() == InferiorStopOk;
return false;
}
void QmlEngine::filterApplicationMessage(const QString &output, int /*channel*/)

View File

@@ -127,7 +127,6 @@ public:
QScriptValue parser;
QScriptValue stringifier;
QStringList scriptSourceRequests;
QHash<int, QString> evaluatingExpression;
QHash<int, QByteArray> localsAndWatchers;
@@ -952,6 +951,9 @@ void QmlV8DebuggerClient::executeDebuggerCommand(const QString &command)
void QmlV8DebuggerClient::synchronizeWatchers(const QStringList &watchers)
{
SDEBUG(watchers);
if (d->engine->state() != InferiorStopOk)
return;
foreach (const QString &exp, watchers) {
StackHandler *stackHandler = d->engine->stackHandler();
if (stackHandler->isContentsValid() && stackHandler->currentFrame().isUsable()) {

View File

@@ -1629,7 +1629,7 @@ int WatchHandler::format(const QByteArray &iname) const
{
int result = AutomaticFormat;
if (const WatchItem *item = m_model->findItem(iname)) {
int result = theIndividualFormats.value(item->d.iname, AutomaticFormat);
result = theIndividualFormats.value(item->d.iname, AutomaticFormat);
if (result == AutomaticFormat)
result = theTypeFormats.value(stripForFormat(item->d.type), AutomaticFormat);
}

View File

@@ -402,6 +402,7 @@ QtWebKitHelpViewer::QtWebKitHelpViewer(QWidget *parent)
QPalette p = palette();
p.setColor(QPalette::Base, Qt::white);
p.setColor(QPalette::Text, Qt::black);
setPalette(p);
connect(m_webView, SIGNAL(urlChanged(QUrl)), this, SIGNAL(sourceChanged(QUrl)));

View File

@@ -65,6 +65,7 @@ TextBrowserHelpViewer::TextBrowserHelpViewer(QWidget *parent)
p.setColor(QPalette::Inactive, QPalette::HighlightedText,
p.color(QPalette::Active, QPalette::HighlightedText));
p.setColor(QPalette::Base, Qt::white);
p.setColor(QPalette::Text, Qt::black);
setPalette(p);
connect(m_textBrowser, SIGNAL(sourceChanged(QUrl)), this, SIGNAL(titleChanged()));

View File

@@ -582,16 +582,19 @@ QString Kit::toHtml(const QList<Task> &additional) const
void Kit::setAutoDetected(bool detected)
{
d->m_autodetected = detected;
kitUpdated();
}
void Kit::setAutoDetectionSource(const QString &autoDetectionSource)
{
d->m_autoDetectionSource = autoDetectionSource;
kitUpdated();
}
void Kit::setSdkProvided(bool sdkProvided)
{
d->m_sdkProvided = sdkProvided;
kitUpdated();
}
void Kit::makeSticky()
@@ -608,11 +611,13 @@ void Kit::setSticky(Id id, bool b)
d->m_sticky.insert(id);
else
d->m_sticky.remove(id);
kitUpdated();
}
void Kit::makeUnSticky()
{
d->m_sticky.clear();
kitUpdated();
}
void Kit::setMutable(Id id, bool b)
@@ -621,6 +626,7 @@ void Kit::setMutable(Id id, bool b)
d->m_mutable.insert(id);
else
d->m_mutable.remove(id);
kitUpdated();
}
bool Kit::isMutable(Id id) const

View File

@@ -354,8 +354,12 @@ void KitManagerConfigWidget::workingCopyWasUpdated(Kit *k)
void KitManagerConfigWidget::kitWasUpdated(Kit *k)
{
if (m_kit == k)
if (m_kit == k) {
bool emitSignal = m_kit->isAutoDetected() != m_modifiedKit->isAutoDetected();
discard();
if (emitSignal)
emit isAutoDetectedChanged();
}
updateVisibility();
}

View File

@@ -77,6 +77,7 @@ public:
signals:
void dirty();
void isAutoDetectedChanged();
private slots:
void setIcon();

View File

@@ -170,6 +170,31 @@ KitManagerConfigWidget *KitModel::widget(const QModelIndex &index)
return n ? n->widget : 0;
}
void KitModel::isAutoDetectedChanged()
{
KitManagerConfigWidget *w = qobject_cast<KitManagerConfigWidget *>(sender());
int idx = -1;
idx = Utils::indexOf(m_manualRoot->childNodes, [w](KitNode *node) { return node->widget == w; });
KitNode *oldParent = 0;
KitNode *newParent = w->workingCopy()->isAutoDetected() ? m_autoRoot : m_manualRoot;
if (idx != -1) {
oldParent = m_manualRoot;
} else {
idx = Utils::indexOf(m_autoRoot->childNodes, [w](KitNode *node) { return node->widget == w; });
if (idx != -1) {
oldParent = m_autoRoot;
}
}
if (oldParent && oldParent != newParent) {
beginMoveRows(index(oldParent), idx, idx, index(newParent), newParent->childNodes.size());
KitNode *n = oldParent->childNodes.takeAt(idx);
n->parent = newParent;
newParent->childNodes.append(n);
endMoveRows();
}
}
void KitModel::validateKitNames()
{
QHash<QString, int> nameHash;
@@ -263,6 +288,9 @@ KitNode *KitModel::createNode(Kit *k)
|| m_manualRoot->children().contains(node))
node->update();
});
connect(node->widget, SIGNAL(isAutoDetectedChanged()),
this, SLOT(isAutoDetectedChanged()));
return node;
}

View File

@@ -84,6 +84,7 @@ private:
void removeKit(ProjectExplorer::Kit *k);
void changeDefaultKit();
void validateKitNames();
void isAutoDetectedChanged();
KitNode *findWorkingCopy(Kit *k) const;
KitNode *createNode(Kit *k);

View File

@@ -135,12 +135,12 @@ void TargetSelectorDelegate::paint(QPainter *painter,
selectionGradient.load(QLatin1String(":/projectexplorer/images/targetpanel_gradient.png"));
if (option.state & QStyle::State_Selected) {
const QColor color = (option.state & QStyle::State_HasFocus) ?
option.palette.highlight().color() :
option.palette.dark().color();
if (creatorTheme()->widgetStyle() == Theme::StyleFlat) {
painter->fillRect(option.rect, creatorTheme()->color(Theme::BackgroundColorSelected));
painter->fillRect(option.rect, color);
} else {
QColor color =(option.state & QStyle::State_HasFocus) ?
option.palette.highlight().color() :
option.palette.dark().color();
painter->fillRect(option.rect, color.darker(140));
StyleHelper::drawCornerImage(selectionGradient, painter, option.rect.adjusted(0, 0, 0, -1), 5, 5, 5, 5);
painter->setPen(QColor(255, 255, 255, 60));

View File

@@ -194,6 +194,7 @@ void QbsManager::addProfileFromKit(const ProjectExplorer::Kit *k)
{
const QString name = QString::fromLatin1("qtc_%1_%2").arg(k->fileSystemFriendlyName().left(8),
QString::number(k->id().uniqueIdentifier(), 16));
qbs::Profile(name, settings()).removeProfile();
setProfileForKit(name, k);
addQtProfileFromKit(name, k);

View File

@@ -32,6 +32,7 @@
#include "importswidget.h"
#include <rewritingexception.h>
#include <qmldesignerplugin.h>
namespace QmlDesigner {
@@ -264,6 +265,8 @@ void ImportManagerView::addImport(const Import &import)
catch (const RewritingException &e) {
e.showException();
}
QmlDesignerPlugin::instance()->currentDesignDocument()->updateSubcomponentManager();
}
} // namespace QmlDesigner

View File

@@ -64,33 +64,6 @@ static bool isImportAlreadyUsed(const Import &import, QList<ImportLabel*> import
return false;
}
void ImportsWidget::setPossibleImports(const QList<Import> &possibleImports)
{
m_addImportComboBox->clear();
foreach (const Import &possibleImport, possibleImports) {
if (!isImportAlreadyUsed(possibleImport, m_importLabels))
m_addImportComboBox->addItem(possibleImport.toString(true), QVariant::fromValue(possibleImport));
}
}
void ImportsWidget::removePossibleImports()
{
m_addImportComboBox->clear();
}
void ImportsWidget::setUsedImports(const QList<Import> &usedImports)
{
foreach (ImportLabel *importLabel, m_importLabels)
importLabel->setReadOnly(usedImports.contains(importLabel->import()));
}
void ImportsWidget::removeUsedImports()
{
foreach (ImportLabel *importLabel, m_importLabels)
importLabel->setEnabled(true);
}
static bool importLess(const Import &firstImport, const Import &secondImport)
{
if (firstImport.url() == secondImport.url())
@@ -117,6 +90,34 @@ static bool importLess(const Import &firstImport, const Import &secondImport)
return false;
}
void ImportsWidget::setPossibleImports(QList<Import> possibleImports)
{
Utils::sort(possibleImports, importLess);
m_addImportComboBox->clear();
foreach (const Import &possibleImport, possibleImports) {
if (!isImportAlreadyUsed(possibleImport, m_importLabels))
m_addImportComboBox->addItem(possibleImport.toString(true), QVariant::fromValue(possibleImport));
}
}
void ImportsWidget::removePossibleImports()
{
m_addImportComboBox->clear();
}
void ImportsWidget::setUsedImports(const QList<Import> &usedImports)
{
foreach (ImportLabel *importLabel, m_importLabels)
importLabel->setReadOnly(usedImports.contains(importLabel->import()));
}
void ImportsWidget::removeUsedImports()
{
foreach (ImportLabel *importLabel, m_importLabels)
importLabel->setEnabled(true);
}
void ImportsWidget::setImports(const QList<Import> &imports)
{
qDeleteAll(m_importLabels);

View File

@@ -52,7 +52,7 @@ public:
void setImports(const QList<Import> &imports);
void removeImports();
void setPossibleImports(const QList<Import> &possibleImports);
void setPossibleImports(QList<Import> possibleImports);
void removePossibleImports();
void setUsedImports(const QList<Import> &possibleImports);

View File

@@ -123,32 +123,29 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV
m_runModus(runModus),
m_synchronizeId(-1)
{
PuppetCreator puppetCreator(kit, QString());
QString socketToken(QUuid::createUuid().toString());
m_localServer->listen(socketToken);
m_localServer->setMaxPendingConnections(3);
PuppetCreator::QmlPuppetVersion puppetVersion = hasQtQuick1(nodeInstanceView) ? PuppetCreator::Qml1Puppet : PuppetCreator::Qml2Puppet;
PuppetCreator puppetCreator(kit, QString(), nodeInstanceView->model(), puppetVersion);
puppetCreator.createPuppetExecutableIfMissing(puppetVersion);
m_qmlPuppetEditorProcess = puppetCreator.createPuppetProcess(puppetVersion,
"editormode",
puppetCreator.createPuppetExecutableIfMissing();
m_qmlPuppetEditorProcess = puppetCreator.createPuppetProcess("editormode",
socketToken,
this,
SLOT(printEditorProcessOutput()),
SLOT(processFinished(int,QProcess::ExitStatus)));
if (runModus == NormalModus) {
m_qmlPuppetRenderProcess = puppetCreator.createPuppetProcess(puppetVersion,
"rendermode",
m_qmlPuppetRenderProcess = puppetCreator.createPuppetProcess("rendermode",
socketToken,
this,
SLOT(printRenderProcessOutput()),
SLOT(processFinished(int,QProcess::ExitStatus)));
m_qmlPuppetPreviewProcess = puppetCreator.createPuppetProcess(puppetVersion,
"previewmode",
m_qmlPuppetPreviewProcess = puppetCreator.createPuppetProcess("previewmode",
socketToken,
this,
SLOT(printPreviewProcessOutput()),

View File

@@ -115,10 +115,12 @@ bool PuppetCreator::useOnlyFallbackPuppet() const
|| !qgetenv("USE_ONLY_FALLBACK_PUPPET").isEmpty() || m_kit == 0 || !m_kit->isValid();
}
PuppetCreator::PuppetCreator(ProjectExplorer::Kit *kit, const QString &qtCreatorVersion)
PuppetCreator::PuppetCreator(ProjectExplorer::Kit *kit, const QString &qtCreatorVersion, const Model *model, QmlPuppetVersion puppetVersion)
: m_qtCreatorVersion(qtCreatorVersion),
m_kit(kit),
m_availablePuppetType(FallbackPuppet)
m_availablePuppetType(FallbackPuppet),
m_model(model),
m_puppetVersion(puppetVersion)
{
}
@@ -126,18 +128,18 @@ PuppetCreator::~PuppetCreator()
{
}
void PuppetCreator::createPuppetExecutableIfMissing(PuppetCreator::QmlPuppetVersion puppetVersion)
void PuppetCreator::createPuppetExecutableIfMissing()
{
if (puppetVersion == Qml1Puppet)
if (m_puppetVersion == Qml1Puppet)
createQml1PuppetExecutableIfMissing();
else
createQml2PuppetExecutableIfMissing();
}
QProcess *PuppetCreator::createPuppetProcess(PuppetCreator::QmlPuppetVersion puppetVersion, const QString &puppetMode, const QString &socketToken, QObject *handlerObject, const char *outputSlot, const char *finishSlot) const
QProcess *PuppetCreator::createPuppetProcess(const QString &puppetMode, const QString &socketToken, QObject *handlerObject, const char *outputSlot, const char *finishSlot) const
{
QString puppetPath;
if (puppetVersion == Qml1Puppet)
if (m_puppetVersion == Qml1Puppet)
puppetPath = qmlPuppetPath(m_availablePuppetType);
else
puppetPath = qml2PuppetPath(m_availablePuppetType);
@@ -333,13 +335,21 @@ QString PuppetCreator::qmlPuppetPath(PuppetType puppetType) const
QProcessEnvironment PuppetCreator::processEnvironment() const
{
#if defined(Q_OS_WIN)
static QLatin1String pathSep(";");
#else
static QLatin1String pathSep(":");
#endif
Utils::Environment environment = Utils::Environment::systemEnvironment();
if (!useOnlyFallbackPuppet())
m_kit->addToEnvironment(environment);
environment.set("QML_BAD_GUI_RENDER_LOOP", "true");
environment.set("QML_USE_MOCKUPS", "true");
environment.set("QML_PUPPET_MODE", "true");
if (m_puppetVersion == Qml1Puppet)
environment.appendOrSet("QML_IMPORT_PATH", m_model->importPaths().join(pathSep), pathSep);
else
environment.appendOrSet("QML2_IMPORT_PATH", m_model->importPaths().join(pathSep), pathSep);
return environment.toProcessEnvironment();
}

View File

@@ -41,6 +41,7 @@ class Kit;
namespace QmlDesigner {
class Model;
class PuppetBuildProgressDialog;
class PuppetCreator
@@ -56,13 +57,12 @@ public:
Qml2Puppet
};
PuppetCreator(ProjectExplorer::Kit *kit, const QString &qtCreatorVersion);
PuppetCreator(ProjectExplorer::Kit *kit, const QString &qtCreatorVersion, const Model *model, QmlPuppetVersion puppetVersion);
~PuppetCreator();
void createPuppetExecutableIfMissing(QmlPuppetVersion puppetVersion);
void createPuppetExecutableIfMissing();
QProcess *createPuppetProcess(QmlPuppetVersion puppetVersion,
const QString &puppetMode,
QProcess *createPuppetProcess(const QString &puppetMode,
const QString &socketToken,
QObject *handlerObject,
const char *outputSlot,
@@ -120,6 +120,8 @@ private:
PuppetType m_availablePuppetType;
static QHash<Core::Id, PuppetType> m_qml1PuppetForKitPuppetHash;
static QHash<Core::Id, PuppetType> m_qml2PuppetForKitPuppetHash;
const Model *m_model;
QmlPuppetVersion m_puppetVersion;
};
} // namespace QmlDesigner

View File

@@ -175,16 +175,17 @@ void Highlighter::highlightBlock(const QString &text)
handleContextChange(m_currentContext->lineBeginContext(),
m_currentContext->definition());
ProgressData progress;
ProgressData *progress = new ProgressData;
const int length = text.length();
while (progress.offset() < length)
iterateThroughRules(text, length, &progress, false, m_currentContext->rules());
while (progress->offset() < length)
iterateThroughRules(text, length, progress, false, m_currentContext->rules());
if (extractObservableState(currentBlockState()) != WillContinue) {
handleContextChange(m_currentContext->lineEndContext(),
m_currentContext->definition(),
false);
}
delete progress;
m_contexts.clear();
if (m_indentationBasedFolding) {

View File

@@ -57,6 +57,11 @@ WinRtDebugSupport::WinRtDebugSupport(RunControl *runControl, WinRtRunnerHelper *
connect(m_debugRunControl, SIGNAL(finished()), this, SLOT(finish()));
}
WinRtDebugSupport::~WinRtDebugSupport()
{
delete m_runner;
}
void WinRtDebugSupport::finish()
{
m_runner->stop();

View File

@@ -49,6 +49,7 @@ public:
static ProjectExplorer::RunControl *createDebugRunControl(WinRtRunConfiguration *runConfig,
ProjectExplorer::RunMode mode,
QString *errorMessage);
~WinRtDebugSupport();
private:
WinRtDebugSupport(ProjectExplorer::RunControl *runControl, WinRtRunnerHelper *runner);

View File

@@ -52,7 +52,7 @@ using namespace WinRt;
using namespace WinRt::Internal;
WinRtRunnerHelper::WinRtRunnerHelper(WinRtRunConfiguration *runConfiguration, QString *errormessage)
: QObject(runConfiguration)
: QObject()
, m_messenger(0)
, m_runConfiguration(runConfiguration)
, m_process(0)