Commit 2786250c authored by Eike Ziller's avatar Eike Ziller
Browse files

Merge remote-tracking branch 'origin/3.1'

Conflicts:
	qtcreator.pri
	qtcreator.qbs
	src/shared/qbs

Change-Id: Iba59e41db72e2afdf594f1f7003215d7d8d1e6d3
parents e9d433a9 27cc89eb
Qt Creator version 3.1.2 is a bugfix release.
The most important changes are listed in this document. For a complete
list of changes, see the Git log for the Qt Creator sources that
you can check out from the public Git repository. For example:
git clone git://gitorious.org/qt-creator/qt-creator.git
git log --cherry-pick --pretty=oneline v3.1.1..v3.1.2
General
* Fixed restoring of output pane button visibility
Editing
* Fixed crash with highlight definitions and indentation based folding enabled
(QTCREATORBUG-12172)
* Fixed setting current file when clicking on split view (QTCREATORBUG-12264)
Help
* Fixed that pressing F1 twice would not go to Help mode
(QTCREATORBUG-9093)
* Fixed filtering in topic chooser
QMake Projects
* Fixed adding files through context menu in case of multiple
resource files (QTCREATORBUG-12297)
* Fixed that resource files were no longer appearing in
Locator and search
Debugging
* GDB
* Worked around GDB crash with large object names
(QTCREATORBUG-12330)
C++ Support
* Fixed crash with anonymous unions with __attribute__
(QTCREATORBUG-12345)
Code Paster
* Fixed crash in case of invalid protocol setting (QTCREATORBUG-12364)
Beautifier
* Fixed problem on Mac when starting Qt Creator from Finder
(QTCREATORBUG-12057)
Platform Specific
Windows
* Fixed matching of paths in Locator (QTCREATORBUG-12007)
QNX
* Fixed font path on devices
[Paths]
# prefix must be one up because Qt makes it relative to the app's Contents/ path,
# even if that doesn't exist!
Prefix = ..
Plugins = ../../PlugIns
......@@ -2263,6 +2263,9 @@
\endlist
If locator does not find some files, you can add them to the \c OTHER_FILES
variable in the .pro file to make them known to \QC.
\section1 Configuring Locator Filters
If the default filters do not match your use case, you can check whether you
......
......@@ -199,6 +199,11 @@
\endlist
You can make additional files known to \QC, so that they become visible in
the \gui Projects view and known to the locator and search, but do not
affect the build system. Add the paths to the files to the \c OTHER_FILES
variable in the .pro file.
\section2 Viewing the File System
If you cannot see a file in the \gui Projects view, switch to the
......
......@@ -2003,12 +2003,6 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
NameAST *name = 0;
parseName(name);
if (! name && LA() == T_LBRACE && (LA(0) == T_CLASS || LA(0) == T_STRUCT || LA(0) == T_UNION || LA(0) == T_ENUM)) {
AnonymousNameAST *ast = new (_pool) AnonymousNameAST;
ast->class_token = classkey_token;
name = ast;
}
bool parsed = false;
const bool previousInFunctionBody = _inFunctionBody;
......@@ -2025,6 +2019,12 @@ bool Parser::parseClassSpecifier(SpecifierListAST *&node)
}
if (LA() == T_COLON || LA() == T_LBRACE) {
if (!name) {
AnonymousNameAST *ast = new (_pool) AnonymousNameAST;
ast->class_token = classkey_token;
name = ast;
}
BaseSpecifierListAST *base_clause_list = 0;
if (LA() == T_COLON) {
......
......@@ -216,8 +216,6 @@ DocumentManager::DocumentManager(QObject *parent)
{
d = new DocumentManagerPrivate;
m_instance = this;
connect(ICore::instance(), SIGNAL(contextChanged(QList<Core::IContext*>,Core::Context)),
this, SLOT(syncWithEditor(QList<Core::IContext*>)));
qApp->installEventFilter(this);
readSettings();
......@@ -1129,22 +1127,6 @@ void DocumentManager::checkForReload()
// dump();
}
void DocumentManager::syncWithEditor(const QList<Core::IContext *> &context)
{
if (context.isEmpty())
return;
Core::IEditor *editor = Core::EditorManager::currentEditor();
if (!editor || editor->document()->isTemporary())
return;
foreach (IContext *c, context) {
if (editor->widget() == c->widget()) {
setCurrentFile(editor->document()->filePath());
break;
}
}
}
/*!
Adds the \a fileName to the list of recent files. Associates the file to
be reopened with the editor that has the specified \a editorId, if possible.
......
......@@ -163,7 +163,6 @@ private slots:
void checkForNewFileName();
void checkForReload();
void changedFile(const QString &file);
void syncWithEditor(const QList<Core::IContext *> &context);
private:
explicit DocumentManager(QObject *parent);
......
......@@ -526,6 +526,8 @@ void EditorManager::handleContextChange(const QList<Core::IContext *> &context)
d->m_scheduledCurrentEditor = editor;
QTimer::singleShot(0, m_instance, SLOT(setCurrentEditorFromContextChange()));
} else {
if (editor && !editor->document()->isTemporary())
DocumentManager::setCurrentFile(editor->document()->filePath());
updateActions();
}
}
......@@ -1027,6 +1029,9 @@ void EditorManager::setCurrentEditorFromContextChange()
IEditor *newCurrent = d->m_scheduledCurrentEditor;
d->m_scheduledCurrentEditor = 0;
setCurrentEditor(newCurrent);
if (!newCurrent->document()->isTemporary())
DocumentManager::setCurrentFile(newCurrent->document()->filePath());
}
void EditorManager::closeEditor(Core::IEditor *editor, bool askAboutModifiedEditors)
......
......@@ -49,14 +49,14 @@ QList<LocatorFilterEntry> BaseFileFilter::matchesFor(QFutureInterface<Core::Loca
updateFiles();
QList<LocatorFilterEntry> betterEntries;
QList<LocatorFilterEntry> goodEntries;
QString needle = trimWildcards(origEntry);
QString needle = trimWildcards(QDir::fromNativeSeparators(origEntry));
const QString lineNoSuffix = EditorManager::splitLineNumber(&needle);
QStringMatcher matcher(needle, Qt::CaseInsensitive);
const QChar asterisk = QLatin1Char('*');
QRegExp regexp(asterisk + needle+ asterisk, Qt::CaseInsensitive, QRegExp::Wildcard);
if (!regexp.isValid())
return betterEntries;
const QChar pathSeparator = QDir::separator();
const QChar pathSeparator(QLatin1Char('/'));
const bool hasPathSeparator = needle.contains(pathSeparator);
const bool hasWildcard = needle.contains(asterisk) || needle.contains(QLatin1Char('?'));
QStringList searchListPaths;
......
......@@ -105,9 +105,9 @@ void Core::Internal::CorePlugin::test_basefilefilter_data()
const QChar pathSeparator = QDir::separator();
const MyTestDataDir testDir(QLatin1String("testdata_basic"));
const QStringList testFiles = QStringList()
<< QDir::toNativeSeparators(testDir.file(QLatin1String("file.cpp")))
<< QDir::toNativeSeparators(testDir.file(QLatin1String("main.cpp")))
<< QDir::toNativeSeparators(testDir.file(QLatin1String("subdir/main.cpp")));
<< QDir::fromNativeSeparators(testDir.file(QLatin1String("file.cpp")))
<< QDir::fromNativeSeparators(testDir.file(QLatin1String("main.cpp")))
<< QDir::fromNativeSeparators(testDir.file(QLatin1String("subdir/main.cpp")));
QStringList testFilesShort;
foreach (const QString &file, testFiles)
testFilesShort << Utils::FileUtils::shortNativePath(Utils::FileName::fromString(file));
......
......@@ -31,6 +31,7 @@
#include "protocol.h"
#include <coreplugin/icore.h>
#include <utils/qtcassert.h>
#include <QPushButton>
#include <QSettings>
......@@ -112,6 +113,7 @@ void PasteView::contentChanged()
void PasteView::protocolChanged(int p)
{
QTC_ASSERT(p >= 0 && p < m_protocols.size(), return);
const unsigned caps = m_protocols.at(p)->capabilities();
m_ui.uiDescription->setEnabled(caps & Protocol::PostDescriptionCapability);
m_ui.uiUsername->setEnabled(caps & Protocol::PostUserNameCapability);
......@@ -215,6 +217,8 @@ void PasteView::accept()
void PasteView::setProtocol(const QString &protocol)
{
const int index = m_ui.protocolBox->findText(protocol);
if (index < 0)
return;
m_ui.protocolBox->setCurrentIndex(index);
if (index == m_ui.protocolBox->currentIndex())
protocolChanged(index); // Force enabling
......
......@@ -1857,6 +1857,20 @@ void CppToolsPlugin::test_completion_data()
<< QLatin1String("val2")
<< QLatin1String("val3"));
QTest::newRow("nested_anonymous_with___attribute__") << _(
"struct Enclosing\n"
"{\n"
" struct __attribute__((aligned(8)))\n"
" {\n"
" int i;\n"
" };\n"
"};\n"
"Enclosing e;\n"
"@\n"
) << _("e.") << (QStringList()
<< QLatin1String("Enclosing")
<< QLatin1String("i"));
QTest::newRow("enum_inside_namespace") << _(
"namespace Ns\n"
"{\n"
......
......@@ -852,7 +852,7 @@ void MiniProjectTargetSelector::doLayout(bool keepSize)
int oldSummaryLabelY = m_summaryLabel->y();
int kitAreaHeight = m_kitAreaWidget->isVisible() ? m_kitAreaWidget->sizeHint().height() : 0;
int kitAreaHeight = m_kitAreaWidget->isVisibleTo(this) ? m_kitAreaWidget->sizeHint().height() : 0;
// 1. Calculate the summary label height
int summaryLabelY = 1 + kitAreaHeight;
......@@ -959,11 +959,9 @@ void MiniProjectTargetSelector::doLayout(bool keepSize)
setFixedSize(m_summaryLabel->width() + 1, heightWithoutKitArea + kitAreaHeight); //1 extra pixel for the border
}
if (isVisibleTo(parentWidget())) {
QPoint moveTo = statusBar->mapToGlobal(QPoint(0,0));
moveTo -= QPoint(0, height());
move(moveTo);
}
QPoint moveTo = statusBar->mapToGlobal(QPoint(0,0));
moveTo -= QPoint(0, height());
move(moveTo);
}
void MiniProjectTargetSelector::setActiveTarget(ProjectExplorer::ProjectConfiguration *pc)
......@@ -1403,10 +1401,10 @@ void MiniProjectTargetSelector::activeRunConfigurationChanged(ProjectExplorer::R
void MiniProjectTargetSelector::setVisible(bool visible)
{
doLayout(false);
QWidget::setVisible(visible);
m_projectAction->setChecked(visible);
if (visible) {
doLayout(false);
if (!focusWidget() || !focusWidget()->isVisibleTo(this)) { // Does the second part actually work?
if (m_projectListWidget->isVisibleTo(this))
m_projectListWidget->setFocus();
......
......@@ -1070,7 +1070,7 @@ bool QmakePriFileNode::renameFile(const QString &filePath, const QString &newFil
ProjectExplorer::FolderNode::AddNewInformation QmakePriFileNode::addNewInformation(const QStringList &files, Node *context) const
{
Q_UNUSED(files)
return ProjectExplorer::FolderNode::AddNewInformation(QFileInfo(path()).fileName(), context == this ? 120 : 90);
return ProjectExplorer::FolderNode::AddNewInformation(QFileInfo(path()).fileName(), context && context->projectNode() == this ? 120 : 90);
}
bool QmakePriFileNode::priFileWritable(const QString &path)
......@@ -1577,7 +1577,7 @@ bool QmakeProFileNode::showInSimpleTree() const
ProjectExplorer::FolderNode::AddNewInformation QmakeProFileNode::addNewInformation(const QStringList &files, Node *context) const
{
Q_UNUSED(files)
return AddNewInformation(QFileInfo(path()).fileName(), context == this ? 120 : 100);
return AddNewInformation(QFileInfo(path()).fileName(), context && context->projectNode() == this ? 120 : 100);
}
bool QmakeProFileNode::showInSimpleTree(QmakeProjectType projectType) const
......
......@@ -58,6 +58,7 @@
#include <qtsupport/profilereader.h>
#include <qtsupport/qtkitinformation.h>
#include <qtsupport/uicodemodelsupport.h>
#include <resourceeditor/resourcenode.h>
#include <QDebug>
#include <QDir>
......@@ -255,6 +256,9 @@ void ProjectFilesVisitor::visitProjectNode(ProjectNode *projectNode)
void ProjectFilesVisitor::visitFolderNode(FolderNode *folderNode)
{
if (qobject_cast<ResourceEditor::ResourceTopLevelNode *>(folderNode))
m_files->files[ResourceType].push_back(folderNode->path());
foreach (FileNode *fileNode, folderNode->fileNodes()) {
const QString path = fileNode->path();
const int type = fileNode->fileType();
......
......@@ -266,7 +266,7 @@ ProjectExplorer::FolderNode::AddNewInformation ResourceTopLevelNode::addNewInfor
// two nodes would be responsible for '/'
// Thus also return a high priority for it
if (ResourceFolderNode *rfn = qobject_cast<ResourceFolderNode *>(context))
if (rfn->prefix() == QLatin1String("/"))
if (rfn->prefix() == QLatin1String("/") && rfn->parentFolderNode() == this)
p = 150;
}
......
......@@ -44,6 +44,7 @@ TopicChooser::TopicChooser(QWidget *parent, const QString &keyword,
ui.setupUi(this);
setFocusProxy(ui.lineEdit);
ui.lineEdit->setFiltering(true);
ui.lineEdit->installEventFilter(this);
ui.lineEdit->setPlaceholderText(tr("Filter"));
ui.label->setText(tr("Choose a topic for <b>%1</b>:").arg(keyword));
......
......@@ -914,8 +914,11 @@ void QMakeEvaluator::visitProVariable(
m_featureRoots = 0;
else if (varName == statics.strQMAKESPEC) {
if (!values(varName).isEmpty()) {
m_qmakespec = values(varName).first().toQString();
m_featureRoots = 0;
QString spec = values(varName).first().toQString();
if (IoUtils::isAbsolutePath(spec)) {
m_qmakespec = spec;
m_featureRoots = 0;
}
}
}
#ifdef PROEVALUATOR_FULL
......@@ -1129,8 +1132,11 @@ bool QMakeEvaluator::loadSpecInternal()
// the source of the qmake.conf at the end of the default/qmake.conf in
// the QMAKESPEC_ORIGINAL variable.
const ProString &orig_spec = first(ProKey("QMAKESPEC_ORIGINAL"));
if (!orig_spec.isEmpty())
m_qmakespec = orig_spec.toQString();
if (!orig_spec.isEmpty()) {
QString spec = orig_spec.toQString();
if (IoUtils::isAbsolutePath(spec))
m_qmakespec = spec;
}
# endif
#endif
valuesRef(ProKey("QMAKESPEC")) = ProString(m_qmakespec);
......
......@@ -183,6 +183,8 @@ private slots:
void q_enum_1();
void incomplete_ast();
void unnamed_class();
void unnamed_class_data();
};
void tst_AST::gcc_attributes_1()
......@@ -1743,6 +1745,43 @@ void tst_AST::incomplete_ast()
QVERIFY(ast);
}
static ClassSpecifierAST *classSpecifierInSimpleDeclaration(SimpleDeclarationAST *simpleDeclaration)
{
Q_ASSERT(simpleDeclaration);
SpecifierListAST *specifier = simpleDeclaration->decl_specifier_list;
Q_ASSERT(specifier);
Q_ASSERT(specifier->value);
return specifier->value->asClassSpecifier();
}
void tst_AST::unnamed_class()
{
QFETCH(QByteArray, source);
QVERIFY(!source.isEmpty());
QSharedPointer<TranslationUnit> unit(parseDeclaration(source));
QVERIFY(unit->ast());
SimpleDeclarationAST *simpleDeclaration = unit->ast()->asSimpleDeclaration();
QVERIFY(simpleDeclaration);
ClassSpecifierAST *clazz = classSpecifierInSimpleDeclaration(simpleDeclaration);
QVERIFY(clazz);
QVERIFY(clazz->name);
QVERIFY(clazz->name->asAnonymousName());
QCOMPARE(diag.errorCount, 0);
}
void tst_AST::unnamed_class_data()
{
QTest::addColumn<QByteArray>("source");
typedef QByteArray _;
QTest::newRow("unnamed-only") << _("class {};");
QTest::newRow("unnamed-derived") << _("class : B {};");
QTest::newRow("unnamed-__attribute__") << _("class __attribute__((aligned(8))){};");
}
void tst_AST::initTestCase()
{
control.setDiagnosticClient(&diag);
......
......@@ -131,7 +131,6 @@
:Qt Creator.Compile Output_Core::OutputWindow {type='Core::OutputWindow' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Compile Output'}
:Qt Creator.DebugModeWidget_QSplitter {name='DebugModeWidget' type='QSplitter' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.Go to Help Mode_QToolButton {text='Go to Help Mode' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.Help_Search for:_QLineEdit {leftWidget=':Qt Creator.Search for:_QLabel' type='QLineEdit' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.Issues_QListView {type='QListView' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow' windowTitle='Issues'}
:Qt Creator.Project.Menu.File_QMenu {name='Project.Menu.File' type='QMenu'}
:Qt Creator.Project.Menu.Folder_QMenu {name='Project.Menu.Folder' type='QMenu' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
......@@ -139,7 +138,6 @@
:Qt Creator.ReRun_QToolButton {toolTip='Re-run this run-configuration' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.Replace All_QToolButton {name='replaceAllButton' text='Replace All' type='QToolButton' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.Replace_QToolButton {name='replaceButton' text='Replace' type='QToolButton' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.Search for:_QLabel {text='Search for:' type='QLabel' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.Stop_QToolButton {text='Stop' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.replaceEdit_Utils::FilterLineEdit {name='replaceEdit' type='Utils::FancyLineEdit' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
:Qt Creator.scrollArea_QScrollArea {name='scrollArea' type='QScrollArea' visible='1' window=':Qt Creator_Core::Internal::MainWindow'}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment