diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp index e688fa3fa285b1e3eaee5dd7d08f43b3b29b7391..06c1e1ae1cf2f51a609b8f17a83c8732dec85bbe 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.cpp +++ b/share/qtcreator/gdbmacros/gdbmacros.cpp @@ -202,11 +202,12 @@ QT_END_NAMESPACE #endif // PRIVATE_OBJECT_ALLOWED -// this can be mangled typenames of nested templates, each char-by-char -// comma-separated integer list -static char qDumpInBuffer[10000]; -static char qDumpOutBuffer[100000]; -//static char qDumpSize[20]; +// This can be mangled typenames of nested templates, each char-by-char +// comma-separated integer list... +Q_DECL_EXPORT char qDumpInBuffer[10000]; + +// The output buffer. +Q_DECL_EXPORT char qDumpOutBuffer[100000]; namespace { @@ -2524,7 +2525,7 @@ static void handleProtocolVersion2and3(QDumper & d) extern "C" Q_DECL_EXPORT -void qDumpObjectData440( +void *qDumpObjectData440( int protocolVersion, int token, void *data, @@ -2629,4 +2630,5 @@ void qDumpObjectData440( else { qDebug() << "Unsupported protocol version" << protocolVersion; } + return qDumpOutBuffer; } diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp index b996ed50407337bd9bc830a4dbbf64f410875203..a13c72accc3147fcd12d987b484bc6a8dc1aea4d 100644 --- a/src/plugins/coreplugin/filemanager.cpp +++ b/src/plugins/coreplugin/filemanager.cpp @@ -453,7 +453,7 @@ void FileManager::changedFile(const QString &file) foreach (IFile *fileinterface, managedFiles(file)) m_changedFiles << fileinterface; if (wasempty && !m_changedFiles.isEmpty()) { - QTimer::singleShot (200, this, SLOT(checkForReload())); + QTimer::singleShot(200, this, SLOT(checkForReload())); } } diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 543111816b1588c25f40c785279d7bf66cba5c7e..446b7544bb3dc4381f316ccbed50459aceeff4fc 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -1070,11 +1070,14 @@ static const char *settingsGroup = "MainWindow"; static const char *geometryKey = "Geometry"; static const char *colorKey = "Color"; static const char *maxKey = "Maximized"; +static const char *fullScreenKey = "FullScreen"; void MainWindow::readSettings() { m_settings->beginGroup(QLatin1String(settingsGroup)); + StyleHelper::setBaseColor(m_settings->value(QLatin1String(colorKey)).value<QColor>()); + const QVariant geom = m_settings->value(QLatin1String(geometryKey)); if (geom.isValid()) { setGeometry(geom.toRect()); @@ -1083,8 +1086,10 @@ void MainWindow::readSettings() } if (m_settings->value(QLatin1String(maxKey), false).toBool()) setWindowState(Qt::WindowMaximized); + setFullScreen(m_settings->value(QLatin1String(fullScreenKey), false).toBool()); m_settings->endGroup(); + m_editorManager->readSettings(m_settings); m_navigationWidget->restoreSettings(m_settings); m_rightPaneWidget->readSettings(m_settings); @@ -1093,14 +1098,18 @@ void MainWindow::readSettings() void MainWindow::writeSettings() { m_settings->beginGroup(QLatin1String(settingsGroup)); - m_settings->setValue(colorKey, StyleHelper::baseColor()); - const QString maxSettingsKey = QLatin1String(maxKey); - if (windowState() & Qt::WindowMaximized) { - m_settings->setValue(maxSettingsKey, true); + + m_settings->setValue(QLatin1String(colorKey), StyleHelper::baseColor()); + + if (windowState() & (Qt::WindowMaximized | Qt::WindowFullScreen)) { + m_settings->setValue(QLatin1String(maxKey), (bool) (windowState() & Qt::WindowMaximized)); + m_settings->setValue(QLatin1String(fullScreenKey), (bool) (windowState() & Qt::WindowFullScreen)); } else { - m_settings->setValue(maxSettingsKey, false); + m_settings->setValue(QLatin1String(maxKey), false); + m_settings->setValue(QLatin1String(fullScreenKey), false); m_settings->setValue(QLatin1String(geometryKey), geometry()); } + m_settings->endGroup(); m_fileManager->saveRecentFiles(); @@ -1209,7 +1218,7 @@ QPrinter *MainWindow::printer() const { if (!m_printer) m_printer = new QPrinter(QPrinter::HighResolution); - return m_printer; + return m_printer; } void MainWindow::setFullScreen(bool on) diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index 43dc44ce7a1ee388f7b866c6fb7cb170dc511436..d0a620c16d24888a2fc979e6c135ea903f48f2fa 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -158,7 +158,7 @@ DebuggerSettings *DebuggerSettings::instance() instance->insertItem(UseDebuggingHelpers, item); item->setDefaultValue(true); item->setSettingsKey("DebugMode", "UseDebuggingHelper"); - item->setText(tr("Use Debugging Helper")); + item->setText(tr("Use debugging helper")); item->setCheckable(true); item->setDefaultValue(true); diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index 317189581026934db4489132bc7c0c2f532b42af..391890c40ebc7d6beb7502b3ef4d607487cfab57 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -103,6 +103,7 @@ enum GdbCommandType GdbQuerySources, GdbAsyncOutput2, GdbStart, + GdbExit, GdbAttached, GdbStubAttached, GdbExecRun, @@ -755,6 +756,9 @@ void GdbEngine::handleResult(const GdbResultRecord & record, int type, case GdbInfoThreads: handleInfoThreads(record); break; + case GdbExit: + handleExit(record); + break; case GdbShowVersion: handleShowVersion(record); @@ -1167,7 +1171,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data) + data.findChild("signal-name").toString(); } q->showStatusMessage(msg); - sendCommand("-gdb-exit"); + sendCommand("-gdb-exit", GdbExit); return; } @@ -1525,7 +1529,7 @@ void GdbEngine::exitDebugger() sendCommand("detach"); else sendCommand("kill"); - sendCommand("-gdb-exit"); + sendCommand("-gdb-exit", GdbExit); // 20s can easily happen when loading webkit debug information m_gdbProc.waitForFinished(20000); if (m_gdbProc.state() != QProcess::Running) { @@ -1797,6 +1801,12 @@ void GdbEngine::handleAttach() qq->reloadRegisters(); } +void GdbEngine::handleExit(const GdbResultRecord &response) +{ + Q_UNUSED(response); + q->showStatusMessage(tr("Debugger exited.")); +} + void GdbEngine::stepExec() { setTokenBarrier(); @@ -2210,6 +2220,11 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData * // within namespaces. // Sometimes the path is relative too. + // 2 breakpoint keep y <MULTIPLE> 0x0040168e + // 2.1 y 0x0040168e in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7 + // 2.2 y 0x00401792 in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7 + + // tested in ../../../tests/auto/debugger/ QRegExp re("MULTIPLE.*(0x[0-9a-f]+) in (.*)\\s+at (.*):([\\d]+)([^\\d]|$)"); re.setMinimal(true); @@ -2218,6 +2233,10 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData * data->bpFuncName = re.cap(2).trimmed(); data->bpLineNumber = re.cap(4); QString full = fullName(re.cap(3)); + if (full.isEmpty()) { + qDebug() << "NO FULL NAME KNOWN FOR" << re.cap(3); + full = re.cap(3); // FIXME: wrong, but prevents recursion + } data->markerLineNumber = data->bpLineNumber.toInt(); data->markerFileName = full; data->bpFileName = full; @@ -3400,14 +3419,15 @@ void GdbEngine::handleQueryDebuggingHelper(const GdbResultRecord &record) m_availableSimpleDebuggingHelpers.append(item.data()); if (m_availableSimpleDebuggingHelpers.isEmpty()) { m_debuggingHelperState = DebuggingHelperUnavailable; - QMessageBox::warning(q->mainWindow(), - tr("Cannot find special data dumpers"), - tr("The debugged binary does not contain information needed for " - "nice display of Qt data types.\n\n" - "You might want to try including the file\n\n" - ".../share/qtcreator/gdbmacros/gdbmacros.cpp\n\n" - "into your project directly.") - ); + q->showStatusMessage(tr("Debugging helpers not found.")); + //QMessageBox::warning(q->mainWindow(), + // tr("Cannot find special data dumpers"), + // tr("The debugged binary does not contain information needed for " + // "nice display of Qt data types.\n\n" + // "You might want to try including the file\n\n" + // ".../share/qtcreator/gdbmacros/gdbmacros.cpp\n\n" + // "into your project directly.") + // ); } else { m_debuggingHelperState = DebuggingHelperAvailable; q->showStatusMessage(tr("%1 custom dumpers found.") @@ -4151,10 +4171,10 @@ void GdbEngine::tryLoadDebuggingHelpers() QString flag = QString::number(RTLD_NOW); sendCommand("sharedlibrary libc"); // for malloc sendCommand("sharedlibrary libdl"); // for dlopen - sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")", + sendCommand("call (void*)dlopen(\"" + lib + "\", " + flag + ")", WatchDebuggingHelperSetup); // some older systems like CentOS 4.6 prefer this: - sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")", + sendCommand("call (void*)__dlopen(\"" + lib + "\", " + flag + ")", WatchDebuggingHelperSetup); sendCommand("sharedlibrary " + dotEscape(lib)); #endif diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h index aebb5da6373ad95f508c4a944fe4adf162330988..44afa4e73a1c1adfe8b7d46361cf688401bcb87d 100644 --- a/src/plugins/debugger/gdbengine.h +++ b/src/plugins/debugger/gdbengine.h @@ -199,6 +199,7 @@ private: void handleQueryPwd(const GdbResultRecord &response); void handleQuerySources(const GdbResultRecord &response); void handleTargetCore(const GdbResultRecord &response); + void handleExit(const GdbResultRecord &response); void debugMessage(const QString &msg); QString dumperLibraryName() const; diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 42e42f5f0b6dbfbdbf9058128287fce22a3d7ab0..eea64c4bca088be0696558955f8689780691e217 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -932,7 +932,6 @@ QString WatchHandler::watcherName(const QString &exp) void WatchHandler::watchExpression(const QString &exp) { // FIXME: 'exp' can contain illegal characters - //MODEL_DEBUG("WATCH: " << exp); m_watchers[exp] = watcherCounter++; WatchData data; data.exp = exp; diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp index f6e2fd01cb831ffe6efd1398af0ca399fddfc5ec..71ac3bb1e6ca47b297da0b22fe59c1ec1ec08d02 100644 --- a/src/plugins/debugger/watchwindow.cpp +++ b/src/plugins/debugger/watchwindow.cpp @@ -96,7 +96,7 @@ public: } else if (index.column() == 0) { // the watcher name column theDebuggerAction(RemoveWatchExpression)->trigger(exp); - theDebuggerAction(WatchExpression)->trigger(lineEdit->text()); + theDebuggerAction(WatchExpression)->trigger(value); } } @@ -175,8 +175,6 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev) QModelIndex idx = indexAt(ev->pos()); QModelIndex mi0 = idx.sibling(idx.row(), 0); QString exp = model()->data(mi0).toString(); - QModelIndex mi1 = idx.sibling(idx.row(), 0); - QString value = model()->data(mi1).toString(); menu.addSeparator(); int type = (m_type == LocalsType) ? WatchExpression : RemoveWatchExpression; diff --git a/src/plugins/fakevim/README b/src/plugins/fakevim/README new file mode 100644 index 0000000000000000000000000000000000000000..f901e5984a0c141854bf2b4735e076f66023fd8e --- /dev/null +++ b/src/plugins/fakevim/README @@ -0,0 +1,14 @@ + + +fakevim is based on eventFilters installed on a QTextEdit or a QPlainTextEdit. +It basically catches all keystrokes and modifies some internal state that +make the resulting text in the editor look like it was using vim. + +There are only a few files in here: + + fakevimplugin.{h,cpp} - interaction with the rest of Creator + fakevimactions.{h,cpp} - settings + fakevimhandler.{h,cpp} - the "real" event + +There are some more hints for developers in fakevimhandler.cpp + diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 50385d9c6ac572d57f6b9aa29278f936e723a922..e18599d70727ce18101da23738fb1d064b03a7ca 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -29,28 +29,33 @@ #include "fakevimhandler.h" -// Please do not add any direct dependencies to other Qt Creator code here. -// Instead emit signals and let the FakeVimPlugin channel the information to -// Qt Creator. The idea is to keep this file here in a "clean" state that -// allows easy reuse with any QTextEdit or QPlainTextEdit derived class. - - -// Some conventions: // -// Use 1 based line numbers and 0 based column numbers. Even though -// the 1 based line are not nice it matches vim's and QTextEdit's 'line' -// concepts. +// ATTENTION: +// +// 1 Please do not add any direct dependencies to other Qt Creator code here. +// Instead emit signals and let the FakeVimPlugin channel the information to +// Qt Creator. The idea is to keep this file here in a "clean" state that +// allows easy reuse with any QTextEdit or QPlainTextEdit derived class. +// +// 2 There are a few auto tests located in ../../../tests/auto/fakevim. +// Commands that are covered there are marked as "// tested" below. +// +// 3 Some conventions: // -// Do not pass QTextCursor etc around unless really needed. Convert -// early to line/column. +// Use 1 based line numbers and 0 based column numbers. Even though +// the 1 based line are not nice it matches vim's and QTextEdit's 'line' +// concepts. // -// There is always a "current" cursor (m_tc). A current "region of interest" -// spans between m_anchor (== anchor()) and m_tc.position() (== position()) -// The value of m_tc.anchor() is not used. +// Do not pass QTextCursor etc around unless really needed. Convert +// early to line/column. +// +// There is always a "current" cursor (m_tc). A current "region of interest" +// spans between m_anchor (== anchor()) and m_tc.position() (== position()) +// The value of m_tc.anchor() is not used. +// #include <utils/qtcassert.h> - #include <QtCore/QDebug> #include <QtCore/QFile> #include <QtCore/QObject> @@ -278,7 +283,7 @@ public: typedef QTextCursor::MoveOperation MoveOperation; typedef QTextCursor::MoveMode MoveMode; void moveToEndOfDocument() { m_tc.movePosition(EndOfDocument, MoveAnchor); } - void moveToStartOfLine() { m_tc.movePosition(StartOfLine, MoveAnchor); } + void moveToStartOfLine(); void moveToEndOfLine(); void moveUp(int n = 1) { moveDown(-n); } void moveDown(int n = 1); // { m_tc.movePosition(Down, MoveAnchor, n); } @@ -353,6 +358,8 @@ public: // extra data for '.' void replay(const QString &text, int count); + void setDotCommand(const QString &cmd) { m_dotCommand = cmd; } + void setDotCommand(const QString &cmd, int n) { m_dotCommand = cmd.arg(n); } QString m_dotCommand; bool m_inReplay; // true if we are executing a '.' @@ -613,8 +620,9 @@ void FakeVimHandler::Private::moveDown(int n) m_tc.movePosition(Down, MoveAnchor, n); #else const int col = m_tc.position() - m_tc.block().position(); - const int line = m_tc.block().blockNumber(); - const QTextBlock &block = m_tc.document()->findBlockByNumber(line + n); + const int lastLine = m_tc.document()->lastBlock().blockNumber(); + const int targetLine = qMax(0, qMin(lastLine, m_tc.block().blockNumber() + n)); + const QTextBlock &block = m_tc.document()->findBlockByNumber(targetLine); const int pos = block.position(); setPosition(pos + qMin(block.length() - 1, col)); moveToTargetColumn(); @@ -632,6 +640,17 @@ void FakeVimHandler::Private::moveToEndOfLine() #endif } +void FakeVimHandler::Private::moveToStartOfLine() +{ +#if 0 + // does not work for "hidden" documents like in the autotests + m_tc.movePosition(StartOfLine, MoveAnchor); +#else + const QTextBlock &block = m_tc.block(); + setPosition(block.position()); +#endif +} + void FakeVimHandler::Private::finishMovement(const QString &dotCommand) { //qDebug() << "ANCHOR: " << position() << anchor(); @@ -656,7 +675,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand) if (anchor() >= position()) m_anchor++; if (!dotCommand.isEmpty()) - m_dotCommand = "c" + dotCommand; + setDotCommand("c" + dotCommand); QString text = removeSelectedText(); //qDebug() << "CHANGING TO INSERT MODE" << text; m_registers[m_register] = text; @@ -668,7 +687,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand) if (anchor() >= position()) m_anchor++; if (!dotCommand.isEmpty()) - m_dotCommand = "d" + dotCommand; + setDotCommand("d" + dotCommand); m_registers[m_register] = removeSelectedText(); m_submode = NoSubMode; if (atEndOfLine()) @@ -694,8 +713,6 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand) updateMiniBuffer(); } - moveToTargetColumn(); - m_moveType = MoveInclusive; m_mvcount.clear(); m_opcount.clear(); @@ -847,13 +864,19 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, } else if (m_submode == RegisterSubMode) { m_register = key; m_submode = NoSubMode; - } else if (m_submode == ChangeSubMode && key == 'c') { - moveToStartOfLine(); + } else if (m_submode == ChangeSubMode && key == 'c') { // tested + moveDown(count() - 1); + moveToEndOfLine(); + moveLeft(); setAnchor(); - moveDown(count()); + moveToStartOfLine(); + setTargetColumn(); + moveUp(count() - 1); m_moveType = MoveLineWise; - finishMovement("c"); - } else if (m_submode == DeleteSubMode && key == 'd') { + m_lastInsertion.clear(); + setDotCommand("%1cc", count()); + finishMovement(); + } else if (m_submode == DeleteSubMode && key == 'd') { // tested moveToStartOfLine(); setAnchor(); moveDown(count()); @@ -869,19 +892,19 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, setAnchor(); moveDown(count() - 1); m_moveType = MoveLineWise; - m_dotCommand = QString("%1<<").arg(count()); + setDotCommand("%1<<", count()); finishMovement(); } else if (m_submode == ShiftRightSubMode && key == '>') { setAnchor(); moveDown(count() - 1); m_moveType = MoveLineWise; - m_dotCommand = QString("%1>>").arg(count()); + setDotCommand("%1>>", count()); finishMovement(); } else if (m_submode == IndentSubMode && key == '=') { setAnchor(); moveDown(count() - 1); m_moveType = MoveLineWise; - m_dotCommand = QString("%1>>").arg(count()); + setDotCommand("%1>>", count()); finishMovement(); } else if (m_submode == ZSubMode) { //qDebug() << "Z_MODE " << cursorLineInDocument() << linesOnScreen(); @@ -928,7 +951,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, m_tc.insertText(QString(count(), text.at(0))); m_moveType = MoveExclusive; m_submode = NoSubMode; - m_dotCommand = QString("%1r%2").arg(count()).arg(text); + setDotCommand("%1r" + text, count()); finishMovement(); } else { m_submode = NoSubMode; @@ -1125,7 +1148,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, handleStartOfLine(); scrollToLineInDocument(cursorLineInDocument() - sline); finishMovement(); - } else if (key == 'e') { + } else if (key == 'e') { // tested m_moveType = MoveInclusive; moveToWordBoundary(false, true); finishMovement(); @@ -1175,13 +1198,13 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, handleStartOfLine(); finishMovement(); } else if (key == 'i') { - m_dotCommand = "i"; //QString("%1i").arg(count()); + setDotCommand("i"); // setDotCommand("%1i", count()); enterInsertMode(); updateMiniBuffer(); if (atEndOfLine()) moveLeft(); } else if (key == 'I') { - m_dotCommand = "I"; //QString("%1I").arg(count()); + setDotCommand("I"); // setDotCommand("%1I", count()); enterInsertMode(); if (m_gflag) moveToStartOfLine(); @@ -1256,7 +1279,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, search(lastSearchString(), !m_lastSearchForward); recordJump(); } else if (key == 'o' || key == 'O') { - m_dotCommand = QString("%1o").arg(count()); + setDotCommand("%1o", count()); enterInsertMode(); moveToFirstNonBlankOnLine(); if (key == 'O') @@ -1293,18 +1316,18 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, moveLeft(); } } - m_dotCommand = QString("%1p").arg(count()); + setDotCommand("%1p", count()); finishMovement(); } else if (key == 'r') { m_submode = ReplaceSubMode; - m_dotCommand = "r"; + setDotCommand("r"); } else if (key == 'R') { // FIXME: right now we repeat the insertion count() times, // but not the deletion m_lastInsertion.clear(); m_mode = InsertMode; m_submode = ReplaceSubMode; - m_dotCommand = "R"; + setDotCommand("R"); } else if (key == control('r')) { redo(); } else if (key == 's') { @@ -1313,7 +1336,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, setAnchor(); moveRight(qMin(count(), rightDist())); m_registers[m_register] = removeSelectedText(); - m_dotCommand = "s"; //QString("%1s").arg(count()); + setDotCommand("s"); // setDotCommand("%1s", count()); m_opcount.clear(); m_mvcount.clear(); enterInsertMode(); @@ -1340,7 +1363,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, enterVisualMode(VisualLineMode); } else if (key == control('v')) { enterVisualMode(VisualBlockMode); - } else if (key == 'w') { + } else if (key == 'w') { // tested // Special case: "cw" and "cW" work the same as "ce" and "cE" if the // cursor is on a non-blank. if (m_submode == ChangeSubMode) { @@ -1369,7 +1392,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, setAnchor(); m_submode = DeleteSubMode; moveRight(qMin(count(), rightDist())); - m_dotCommand = QString("%1x").arg(count()); + setDotCommand("%1x", count()); finishMovement(); } else if (key == 'X') { if (leftDist() > 0) { @@ -1957,16 +1980,16 @@ void FakeVimHandler::Private::highlightMatches(const QString &needle0) void FakeVimHandler::Private::moveToFirstNonBlankOnLine() { - QTextBlock block = m_tc.block(); QTextDocument *doc = m_tc.document(); - m_tc.movePosition(StartOfLine, KeepAnchor); - int firstPos = m_tc.position(); + const QTextBlock &block = m_tc.block(); + int firstPos = block.position(); for (int i = firstPos, n = firstPos + block.length(); i < n; ++i) { if (!doc->characterAt(i).isSpace()) { - m_tc.setPosition(i, KeepAnchor); + setPosition(i); return; } } + setPosition(block.position()); } void FakeVimHandler::Private::indentRegion(QChar typedChar) @@ -1978,7 +2001,7 @@ void FakeVimHandler::Private::indentRegion(QChar typedChar) qSwap(beginLine, endLine); int amount = 0; emit q->indentRegion(&amount, beginLine, endLine, typedChar); - m_dotCommand = QString("%1==").arg(endLine - beginLine + 1); + setDotCommand("%1==", endLine - beginLine + 1); } void FakeVimHandler::Private::shiftRegionRight(int repeat) @@ -2000,7 +2023,7 @@ void FakeVimHandler::Private::shiftRegionRight(int repeat) setPosition(firstPos); moveToFirstNonBlankOnLine(); - m_dotCommand = QString("%1>>").arg(endLine - beginLine + 1); + setDotCommand("%1>>", endLine - beginLine + 1); } void FakeVimHandler::Private::shiftRegionLeft(int repeat) @@ -2037,17 +2060,20 @@ void FakeVimHandler::Private::shiftRegionLeft(int repeat) setPosition(firstPos); moveToFirstNonBlankOnLine(); - m_dotCommand = QString("%1<<").arg(endLine - beginLine + 1); + setDotCommand("%1<<", endLine - beginLine + 1); } void FakeVimHandler::Private::moveToTargetColumn() { - if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn) { - const QTextBlock &block = m_tc.block(); + const QTextBlock &block = m_tc.block(); + int col = m_tc.position() - m_tc.block().position(); + if (col == m_targetColumn) + return; + //qDebug() << "CORRECTING COLUMN FROM: " << col << "TO" << m_targetColumn; + if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn) m_tc.setPosition(block.position() + block.length() - 1, KeepAnchor); - } else { + else m_tc.setPosition(m_tc.block().position() + m_targetColumn, KeepAnchor); - } } /* if simple is given: @@ -2075,7 +2101,7 @@ void FakeVimHandler::Private::moveToWordBoundary(bool simple, bool forward) int lastClass = -1; while (true) { QChar c = doc->characterAt(m_tc.position() + (forward ? 1 : -1)); - qDebug() << "EXAMINING: " << c << " AT " << position(); + //qDebug() << "EXAMINING: " << c << " AT " << position(); int thisClass = charClass(c, simple); if (thisClass != lastClass && lastClass != 0) --repeat; @@ -2319,6 +2345,7 @@ QString FakeVimHandler::Private::removeSelectedText() m_tc.setPosition(pos, KeepAnchor); QString from = m_tc.selection().toPlainText(); m_tc.removeSelectedText(); + setAnchor(); return from; } diff --git a/src/plugins/qt4projectmanager/showbuildlog.ui b/src/plugins/qt4projectmanager/showbuildlog.ui index 98c61b360e7d1b59c27b4bdc748d742365c5bee0..5b31a76861cae86015ba20b776c6d28ebabebce4 100644 --- a/src/plugins/qt4projectmanager/showbuildlog.ui +++ b/src/plugins/qt4projectmanager/showbuildlog.ui @@ -11,7 +11,7 @@ </rect> </property> <property name="windowTitle"> - <string>Dialog</string> + <string>Debugging Helper Build Log</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp index 7106b03550eae43ee4b19fbcbe8e24641f9bdd5f..665dd5617aa72dcc61c2c067545eae7ce6f3947c 100755 --- a/src/plugins/texteditor/basetextdocument.cpp +++ b/src/plugins/texteditor/basetextdocument.cpp @@ -47,7 +47,11 @@ using namespace TextEditor; +#if defined (Q_OS_WIN) +QT_BEGIN_NAMESPACE extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; +QT_END_NAMESPACE +#endif #if defined (Q_OS_WIN) # define NATIVE_LINE_TERMINATOR CRLFLineTerminator @@ -145,14 +149,14 @@ bool BaseTextDocument::isReadOnly() const const QFileInfo fi(m_fileName); -#ifdef Q_OS_WIN32 +#ifdef Q_OS_WIN // Check for permissions on NTFS file systems qt_ntfs_permission_lookup++; #endif const bool ro = !fi.isWritable(); -#ifdef Q_OS_WIN32 +#ifdef Q_OS_WIN qt_ntfs_permission_lookup--; #endif return ro; @@ -171,10 +175,7 @@ bool BaseTextDocument::open(const QString &fileName) m_fileName = fi.absoluteFilePath(); QFile file(fileName); - if (!file.exists()) - return false; - - if (!file.open(QIODevice::ReadWrite) && !file.open(QIODevice::ReadOnly)) + if (!file.open(QIODevice::ReadOnly)) return false; title = fi.fileName(); diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index 19041d7bb77cb884663dfa89704630e98abb2d5e..1313f7c0306a6cf32f48d98fda9d309a5cc8c3d6 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -151,6 +151,8 @@ public: QString m_pendingComment; bool m_syntaxError; bool m_contNextLine; + bool m_inQuote; + int m_parens; /////////////// Evaluating pro file contents @@ -251,6 +253,8 @@ bool ProFileEvaluator::Private::read(ProFile *pro) // Parser state m_block = 0; m_commentItem = 0; + m_inQuote = false; + m_parens = 0; m_contNextLine = false; m_syntaxError = false; m_lineNo = 1; @@ -274,71 +278,83 @@ bool ProFileEvaluator::Private::parseLine(const QString &line0) if (m_blockstack.isEmpty()) return false; - ushort quote = 0; - int parens = 0; - bool contNextLine = false; + int parens = m_parens; + bool inQuote = m_inQuote; + bool escaped = false; QString line = line0.simplified(); for (int i = 0; !m_syntaxError && i < line.length(); ++i) { ushort c = line.at(i).unicode(); - if (quote && c == quote) - quote = 0; - else if (c == '(') - ++parens; - else if (c == ')') - --parens; - else if (c == '"' && (i == 0 || line.at(i - 1).unicode() != '\\')) - quote = c; - else if (!parens && !quote) { - if (c == '#') { - insertComment(line.mid(i + 1)); - contNextLine = m_contNextLine; - break; - } - if (c == '\\' && i >= line.count() - 1) { - updateItem(); - contNextLine = true; - continue; - } - if (m_block && (m_block->blockKind() & ProBlock::VariableKind)) { - if (c == ' ') - updateItem(); - else - m_proitem += c; - continue; - } - if (c == ':') { - enterScope(false); - continue; - } - if (c == '{') { - enterScope(true); - continue; - } - if (c == '}') { - leaveScope(); + if (c == '#') { // Yep - no escaping possible + insertComment(line.mid(i + 1)); + escaped = m_contNextLine; + break; + } + if (!escaped) { + if (c == '\\') { + escaped = true; + m_proitem += c; continue; - } - if (c == '=') { - insertVariable(line, &i); + } else if (c == '"') { + inQuote = !inQuote; + m_proitem += c; continue; } - if (c == '|' || c == '!') { - insertOperator(c); - continue; + } else { + escaped = false; + } + if (!inQuote) { + if (c == '(') { + ++parens; + } else if (c == ')') { + --parens; + } else if (!parens) { + if (m_block && (m_block->blockKind() & ProBlock::VariableKind)) { + if (c == ' ') + updateItem(); + else + m_proitem += c; + continue; + } + if (c == ':') { + enterScope(false); + continue; + } + if (c == '{') { + enterScope(true); + continue; + } + if (c == '}') { + leaveScope(); + continue; + } + if (c == '=') { + insertVariable(line, &i); + continue; + } + if (c == '|' || c == '!') { + insertOperator(c); + continue; + } } } m_proitem += c; } - m_contNextLine = contNextLine; - - if (!m_syntaxError) { - updateItem(); - if (!m_contNextLine) - finalizeBlock(); + m_inQuote = inQuote; + m_parens = parens; + m_contNextLine = escaped; + if (escaped) { + m_proitem.chop(1); + return true; + } else { + if (!m_syntaxError) { + updateItem(); + if (!m_contNextLine) + finalizeBlock(); + } + return !m_syntaxError; } - return !m_syntaxError; } void ProFileEvaluator::Private::finalizeBlock() @@ -357,6 +373,9 @@ void ProFileEvaluator::Private::insertVariable(const QString &line, int *i) { ProVariable::VariableOperator opkind; + if (m_proitem.isEmpty()) // Line starting with '=', like a conflict marker + return; + switch (m_proitem.at(m_proitem.length() - 1).unicode()) { case '+': m_proitem.chop(1); @@ -636,11 +655,11 @@ bool ProFileEvaluator::Private::visitBeginProFile(ProFile * pro) evaluateFile(mkspecDirectory + QLatin1String("/default/qmake.conf"), &ok); evaluateFile(mkspecDirectory + QLatin1String("/features/default_pre.prf"), &ok); - QStringList tmp = m_valuemap.value("CONFIG"); + QStringList tmp = m_valuemap.value(QLatin1String("CONFIG")); tmp.append(m_addUserConfigCmdArgs); foreach(const QString &remove, m_removeUserConfigCmdArgs) tmp.removeAll(remove); - m_valuemap.insert("CONFIG", tmp); + m_valuemap.insert(QLatin1String("CONFIG"), tmp); m_cumulative = cumulative; } @@ -2021,7 +2040,13 @@ ProFile *ProFileEvaluator::parsedProFile(const QString &fileName) { QFileInfo fi(fileName); if (fi.exists()) { - ProFile *pro = new ProFile(fi.absoluteFilePath()); + QString fn = QDir::cleanPath(fi.absoluteFilePath()); + foreach (const ProFile *pf, d->m_profileStack) + if (pf->fileName() == fn) { + errorMessage(d->format("circular inclusion of %1").arg(fn)); + return 0; + } + ProFile *pro = new ProFile(fn); if (d->read(pro)) return pro; delete pro; diff --git a/src/tools/qpatch/files-to-patch-linux b/src/tools/qpatch/files-to-patch-linux index 8fa0394d0b319e7ff0520f01ed2e2d682bf85fdd..da166075843ea60c10c916dd63d7c66aa41e3459 100644 --- a/src/tools/qpatch/files-to-patch-linux +++ b/src/tools/qpatch/files-to-patch-linux @@ -235,26 +235,26 @@ examples/xml/xmlstreamlint/xmlstreamlint examples/xmlpatterns/filetree/filetree examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel examples/xmlpatterns/recipes/recipes -lib/libQt3Support.so.4.5.0 -lib/libQtAssistantClient.so.4.5.0 -lib/libQtCLucene.so.4.5.0 -lib/libQtCore.so.4.5.0 -lib/libQtDBus.so.4.5.0 -lib/libQtDesigner.so.4.5.0 -lib/libQtDesignerComponents.so.4.5.0 -lib/libQtGui.so.4.5.0 -lib/libQtHelp.so.4.5.0 -lib/libQtNetwork.so.4.5.0 -lib/libQtOpenGL.so.4.5.0 -lib/libQtScript.so.4.5.0 -lib/libQtScriptTools.so.4.5.0 -lib/libQtSql.so.4.5.0 -lib/libQtSvg.so.4.5.0 -lib/libQtTest.so.4.5.0 +lib/libQt3Support.so.4.5.1 +lib/libQtAssistantClient.so.4.5.1 +lib/libQtCLucene.so.4.5.1 +lib/libQtCore.so.4.5.1 +lib/libQtDBus.so.4.5.1 +lib/libQtDesigner.so.4.5.1 +lib/libQtDesignerComponents.so.4.5.1 +lib/libQtGui.so.4.5.1 +lib/libQtHelp.so.4.5.1 +lib/libQtNetwork.so.4.5.1 +lib/libQtOpenGL.so.4.5.1 +lib/libQtScript.so.4.5.1 +lib/libQtScriptTools.so.4.5.1 +lib/libQtSql.so.4.5.1 +lib/libQtSvg.so.4.5.1 +lib/libQtTest.so.4.5.1 lib/libQtUiTools.a -lib/libQtWebKit.so.4.5.0 -lib/libQtXml.so.4.5.0 -lib/libQtXmlPatterns.so.4.5.0 +lib/libQtWebKit.so.4.5.1 +lib/libQtXml.so.4.5.1 +lib/libQtXmlPatterns.so.4.5.1 plugins/accessible/libqtaccessiblecompatwidgets.so plugins/accessible/libqtaccessiblewidgets.so plugins/codecs/libqcncodecs.so diff --git a/tests/auto/debugger/main.cpp b/tests/auto/debugger/main.cpp index 13ece24e546c4eb56a9530658c3736f5cd4d88c6..4e7eeeeb61fa34ae6daa528a1f968890c98a6869 100644 --- a/tests/auto/debugger/main.cpp +++ b/tests/auto/debugger/main.cpp @@ -79,6 +79,9 @@ private slots: void mi10() { testMi(test10); } void mi11() { testMi(test11); } void mi12() { testMi(test12); } + + void infoBreak(); + void runQtc(); public slots: @@ -100,6 +103,41 @@ static QByteArray stripped(QByteArray ba) return ba; } + +void tst_Debugger::infoBreak() +{ + // This tests the regular expression used in GdbEngine::extractDataFromInfoBreak + // to discover breakpoints in constructors. + + // Copied from gdbengine.cpp: + + QRegExp re("MULTIPLE.*(0x[0-9a-f]+) in (.*)\\s+at (.*):([\\d]+)([^\\d]|$)"); + re.setMinimal(true); + + QCOMPARE(re.indexIn( + "2 breakpoint keep y <MULTIPLE> 0x0040168e\n" + "2.1 y 0x0040168e " + "in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7\n" + "2.2 y 0x00401792 " + "in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7\n"), 33); + QCOMPARE(re.cap(1), QString("0x0040168e")); + QCOMPARE(re.cap(2).trimmed(), QString("MainWindow::MainWindow(QWidget*)")); + QCOMPARE(re.cap(3), QString("mainwindow.cpp")); + QCOMPARE(re.cap(4), QString("7")); + + + QCOMPARE(re.indexIn( + "Num Type Disp Enb Address What" + "4 breakpoint keep y <MULTIPLE> 0x00000000004066ad" + "4.1 y 0x00000000004066ad in CTorTester" + " at /main/tests/manual/gdbdebugger/simple/app.cpp:124"), 88); + + QCOMPARE(re.cap(1), QString("0x00000000004066ad")); + QCOMPARE(re.cap(2).trimmed(), QString("CTorTester")); + QCOMPARE(re.cap(3), QString("/main/tests/manual/gdbdebugger/simple/app.cpp")); + QCOMPARE(re.cap(4), QString("124")); +} + void tst_Debugger::readStandardOutput() { qDebug() << "qtcreator-out: " << stripped(m_proc.readAllStandardOutput()); diff --git a/tests/auto/fakevim/main.cpp b/tests/auto/fakevim/main.cpp index a1ac3be78265bab1bb126840b88fa96b29401907..fd5b06f0931b6c168e60a07cff90df3796e260f8 100644 --- a/tests/auto/fakevim/main.cpp +++ b/tests/auto/fakevim/main.cpp @@ -55,13 +55,17 @@ public slots: void changeExtraInformation(const QString &info) { m_infoMessage = info; } private slots: - void commandDollar(); - void commandDown(); - void commandLeft(); - void commandRight(); - void commandI(); - void commandUp(); - void commandW(); + // command mode + void command_cc(); + void command_dd(); + void command_dollar(); + void command_down(); + void command_e(); + void command_i(); + void command_left(); + void command_right(); + void command_up(); + void command_w(); private: void setup(); @@ -73,6 +77,9 @@ private: const char* file, int line); QString insertCursor(const QString &needle0); + QString lmid(int i, int n = -1) const + { return QStringList(l.mid(i, n)).join("\n"); } + QTextEdit *m_textedit; QPlainTextEdit *m_plaintextedit; FakeVimHandler *m_handler; @@ -82,6 +89,8 @@ private: QString m_statusData; QString m_infoMessage; + // the individual lines + static const QStringList l; // identifier intentionally kept short static const QString lines; static const QString escape; }; @@ -100,8 +109,11 @@ const QString tst_FakeVim::lines = " return app.exec();\n" "}\n"; +const QStringList tst_FakeVim::l = tst_FakeVim::lines.split('\n'); + const QString tst_FakeVim::escape = QChar(27); + tst_FakeVim::tst_FakeVim(bool usePlainTextEdit) { if (usePlainTextEdit) { @@ -170,16 +182,16 @@ bool tst_FakeVim::checkContentsHelper(QString want, const char* file, int line) QStringList wantlist = want.split('\n'); QStringList gotlist = got.split('\n'); if (!QTest::qCompare(gotlist.size(), wantlist.size(), "", "", file, line)) { - qDebug() << "WANT: " << want; - qDebug() << "GOT: " << got; + qDebug() << "0 WANT: " << want; + qDebug() << "0 GOT: " << got; return false; } for (int i = 0; i < wantlist.size() && i < gotlist.size(); ++i) { QString g = QString("line %1: %2").arg(i + 1).arg(gotlist.at(i)); QString w = QString("line %1: %2").arg(i + 1).arg(wantlist.at(i)); if (!QTest::qCompare(g, w, "", "", file, line)) { - qDebug() << "WANT: " << want; - qDebug() << "GOT: " << got; + qDebug() << "1 WANT: " << want; + qDebug() << "1 GOT: " << got; return false; } } @@ -222,11 +234,78 @@ QString tst_FakeVim::insertCursor(const QString &needle0) needle.remove('@'); QString lines0 = lines; int pos = lines0.indexOf(needle); + if (pos == -1) + qDebug() << "Cannot find: \n----\n" + needle + "\n----\n"; lines0.replace(pos, needle.size(), needle0); return lines0; } -void tst_FakeVim::commandI() + +////////////////////////////////////////////////////////////////////////// +// +// Command mode +// +////////////////////////////////////////////////////////////////////////// + +void tst_FakeVim::command_cc() +{ + setup(); + move("j", "@" + l[1]); + check("ccabc" + escape, l[0] + "\nab@c\n" + lmid(2)); + check("ccabc" + escape, l[0] + "\nab@c\n" + lmid(2)); + check(".", l[0] + "\nab@c\n" + lmid(2)); + check("j", l[0] + "\nabc\n#i@nclude <QtGui>\n" + lmid(3)); + check("3ccxyz" + escape, l[0] + "\nabc\nxy@z\n" + lmid(5)); +} + +void tst_FakeVim::command_dd() +{ + setup(); + move("j", "@" + l[1]); + check("dd", l[0] + "\n@" + lmid(2)); + check(".", l[0] + "\n@" + lmid(3)); + check("3dd", l[0] + "\n@" + lmid(6)); +} + +void tst_FakeVim::command_dollar() +{ + setup(); + move("j$", "<QtCore>@"); + move("j$", "<QtGui>@"); + move("2j", ")@"); +} + +void tst_FakeVim::command_down() +{ + setup(); + move("j", "@" + l[1]); + move("3j", "@int main"); + move("4j", "@ return app.exec()"); +} + +void tst_FakeVim::command_e() +{ + setup(); + move("e", "@#include <QtCore"); + move("e", "#includ@e <QtCore"); + move("e", "#include @<QtCore"); + move("3e", "@#include <QtGui"); + move("e", "#includ@e <QtGui"); + move("e", "#include @<QtGui"); + move("e", "#include <QtGu@i"); + move("4e", "int main@(int argc, char *argv[])"); + move("e", "int main(in@t argc, char *argv[])"); + move("e", "int main(int arg@c, char *argv[])"); + move("e", "int main(int argc@, char *argv[])"); + move("e", "int main(int argc, cha@r *argv[])"); + move("e", "int main(int argc, char @*argv[])"); + move("e", "int main(int argc, char *arg@v[])"); + move("e", "int main(int argc, char *argv[]@)"); + move("e", "@{"); + move("10k","@\n"); // home. +} + +void tst_FakeVim::command_i() { setup(); @@ -255,31 +334,18 @@ return; check("u", "@" + lines); } -void tst_FakeVim::commandDollar() +void tst_FakeVim::command_left() { setup(); - move("j$", "<QtCore>@"); - move("j$", "<QtGui>@"); - move("2j", ")@"); -} - -void tst_FakeVim::commandDown() -{ - setup(); - move("j", "@#include <QtCore"); - move("3j", "@int main"); - move("4j", "@ return app.exec()"); -} - -void tst_FakeVim::commandUp() -{ - setup(); - move("j", "@#include <QtCore"); - move("3j", "@int main"); - move("4j", "@ return app.exec()"); + move("4j", "@int main"); + move("h", "@int main"); // no move over left border + move("$", "argv[])@"); + move("h", "argv[]@)"); + move("3h", "arg@v[])"); + move("50h", "@int main"); } -void tst_FakeVim::commandRight() +void tst_FakeVim::command_right() { setup(); move("4j", "@int main"); @@ -288,27 +354,35 @@ void tst_FakeVim::commandRight() move("50l", "argv[])@"); } -void tst_FakeVim::commandLeft() +void tst_FakeVim::command_up() { setup(); - move("4j", "@int main"); - move("h", "@int main"); // no move over left border - move("$", "argv[])@"); - move("h", "argv[]@)"); - move("3h", "arg@v[])"); - move("50h", "@int main"); + move("j", "@#include <QtCore"); + move("3j", "@int main"); + move("4j", "@ return app.exec()"); } -void tst_FakeVim::commandW() +void tst_FakeVim::command_w() { setup(); - move("w", "@#include <QtCore"); - move("w", "#@include <QtCore"); - move("w", "#include @<QtCore"); - move("3w", "@#include <QtGui"); + move("w", "@#include <QtCore"); + move("w", "#@include <QtCore"); + move("w", "#include @<QtCore"); + move("3w", "@#include <QtGui"); + move("w", "#@include <QtGui"); + move("w", "#include @<QtGui"); + move("w", "#include <@QtGui"); + move("4w", "int main@(int argc, char *argv[])"); + move("w", "int main(@int argc, char *argv[])"); + move("w", "int main(int @argc, char *argv[])"); + move("w", "int main(int argc@, char *argv[])"); + move("w", "int main(int argc, @char *argv[])"); + move("w", "int main(int argc, char @*argv[])"); + move("w", "int main(int argc, char *@argv[])"); + move("w", "int main(int argc, char *argv@[])"); + move("w", "@{"); } - /* #include <QtCore> #include <QtGui> @@ -321,6 +395,14 @@ int main(int argc, char *argv[]) } */ + + +////////////////////////////////////////////////////////////////////////// +// +// Main +// +////////////////////////////////////////////////////////////////////////// + int main(int argc, char *argv[]) \ { int res = 0; diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp index 427cbf452fee6153b115b781928db7b21a6d356d..76b35c9ce770cee14546a10ef5a342ae6eaebc36 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -87,6 +87,12 @@ public: b = 2 + s + t; a += 1; } + + ~Foo() + { + a = 5; + } + void doit() { static QObject ob;