aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormae <qt-info@nokia.com>2009-04-16 16:25:14 +0200
committermae <qt-info@nokia.com>2009-04-16 16:25:14 +0200
commit08759787fe97529d335b045f15647293a1131c40 (patch)
treefbac247fa5c9cc327f12c341a5be3851dc7de343
parent655d39a9d7968502620231170019a439451f8066 (diff)
parent923db1ce6d99c73fdce402f80840226dbf21b08b (diff)
Merge branch '1.1' of git@scm.dev.nokia.troll.no:creator/mainline into 1.1
-rw-r--r--src/app/app.pro8
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp7
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp1
-rw-r--r--src/plugins/debugger/debuggeractions.cpp2
-rw-r--r--src/plugins/debugger/gdbengine.cpp40
-rw-r--r--src/plugins/debugger/gdbengine.h1
-rw-r--r--src/plugins/debugger/watchhandler.cpp1
-rw-r--r--src/plugins/debugger/watchwindow.cpp4
-rw-r--r--src/plugins/fakevim/README14
-rw-r--r--src/plugins/fakevim/fakevimhandler.cpp135
-rw-r--r--src/shared/proparser/profileevaluator.cpp7
-rw-r--r--src/tools/qpatch/files-to-patch-linux38
-rw-r--r--tests/auto/debugger/main.cpp38
-rw-r--r--tests/auto/fakevim/main.cpp174
-rw-r--r--tests/manual/gdbdebugger/simple/app.cpp6
15 files changed, 335 insertions, 141 deletions
diff --git a/src/app/app.pro b/src/app/app.pro
index 69f677dacb..0894b2a726 100644
--- a/src/app/app.pro
+++ b/src/app/app.pro
@@ -43,10 +43,12 @@ unix:!macx {
QMAKE_POST_LINK += $${QMAKE_COPY_FILE} $${COPYSRC} $${COPYDEST} $$SEPARATOR
}
- target.files += $$OUT_PWD/$$DESTDIR/$$IDE_APP_WRAPPER
- target.files += $$OUT_PWD/$$DESTDIR/$$IDE_APP_TARGET
+ wrapper.files = $$OUT_PWD/$$DESTDIR/$$IDE_APP_WRAPPER
+ wrapper.path = /bin
+
target.path = /bin
- INSTALLS += target
+
+ INSTALLS += target wrapper
}
diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
index fcfef28f99..51d57b9e09 100644
--- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
@@ -75,6 +75,8 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const
setPage(CMakeRunPageId, new CMakeRunPage(this));
setStartId(startid);
+ setOption(QWizard::NoCancelButton);
+ setOption(QWizard::NoBackButtonOnStartPage);
}
CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const QString &sourceDirectory,
@@ -87,6 +89,8 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const
addPage(new CMakeRunPage(this, buildDirectory, false));
foreach(const QString &buildDirectory, needToUpdate)
addPage(new CMakeRunPage(this, buildDirectory, true));
+ setOption(QWizard::NoCancelButton);
+ setOption(QWizard::NoBackButtonOnStartPage);
}
CMakeManager *CMakeOpenProjectWizard::cmakeManager() const
@@ -255,6 +259,9 @@ void CMakeRunPage::initWidgets()
m_output = new QPlainTextEdit(this);
m_output->setReadOnly(true);
+ QSizePolicy pl = m_output->sizePolicy();
+ pl.setVerticalStretch(1);
+ m_output->setSizePolicy(pl);
fl->addRow(m_output);
}
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index d1fe107412..ffd333d23f 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -512,7 +512,6 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
cleanMakeStep->setValue("clean", true);
} else {
// We have a user file, but we could still be missing the cbp file
- // TODO check that we have a cbp file and if not, open up a dialog ?
// or simply run createXml with the saved settings
QFileInfo sourceFileInfo(m_fileName);
QStringList needToCreate;
diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index 43dc44ce7a..d0a620c16d 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 c2d2c4b4c3..391890c40e 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.")
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index aebb5da637..44afa4e73a 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 42e42f5f0b..eea64c4bca 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 f6e2fd01cb..71ac3bb1e6 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 0000000000..f901e5984a
--- /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 50385d9c6a..e18599d707 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/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp
index 1313f7c030..95bd578d9f 100644
--- a/src/shared/proparser/profileevaluator.cpp
+++ b/src/shared/proparser/profileevaluator.cpp
@@ -346,14 +346,15 @@ bool ProFileEvaluator::Private::parseLine(const QString &line0)
m_contNextLine = escaped;
if (escaped) {
m_proitem.chop(1);
+ updateItem();
return true;
} else {
if (!m_syntaxError) {
updateItem();
- if (!m_contNextLine)
- finalizeBlock();
+ finalizeBlock();
+ return true;
}
- return !m_syntaxError;
+ return false;
}
}
diff --git a/src/tools/qpatch/files-to-patch-linux b/src/tools/qpatch/files-to-patch-linux
index 8fa0394d0b..da16607584 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 13ece24e54..4e7eeeeb61 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 a1ac3be782..fd5b06f093 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 427cbf452f..76b35c9ce7 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;