From e67e58378dcc942c752d54aba40a7bf691ec418e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Thu, 30 Aug 2012 18:03:34 +0200 Subject: [PATCH] Debugger: Use gdb's tooltip expression fixup for CDB and editor. Factor out to watchutils. Change-Id: I8cf316be819d765dcea964ac6405bfa9b075de59 Reviewed-by: hjk <qthjk@ovi.com> --- src/plugins/debugger/cdb/cdbengine.cpp | 2 +- src/plugins/debugger/debuggerplugin.cpp | 1 + src/plugins/debugger/gdb/gdbengine.cpp | 38 +--------------------- src/plugins/debugger/watchutils.cpp | 43 +++++++++++++++++++++++++ src/plugins/debugger/watchutils.h | 1 + 5 files changed, 47 insertions(+), 38 deletions(-) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 12de1c163e2..323ae8ca2eb 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -466,7 +466,7 @@ bool CdbEngine::setToolTipExpression(const QPoint &mousePos, int line; int column; DebuggerToolTipContext context = contextIn; - QString exp = cppExpressionAt(editor, context.position, &line, &column, &context.function); + QString exp = fixCppExpression(cppExpressionAt(editor, context.position, &line, &column, &context.function)); // Are we in the current stack frame if (context.function.isEmpty() || exp.isEmpty() || context.function != stackHandler()->currentFrame().function) return false; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index e2b61b11537..bfabcfcd59b 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1140,6 +1140,7 @@ public slots: int line, column; exp = cppExpressionAt(textEditor, tc.position(), &line, &column); } + exp = fixCppExpression(exp); if (exp.isEmpty()) return; currentEngine()->watchHandler()->watchExpression(exp); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 7c439020ccb..9a4ddc4a901 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3890,48 +3890,12 @@ bool GdbEngine::setToolTipExpression(const QPoint &mousePos, DebuggerToolTipContext context = contextIn; int line, column; - QString exp = cppExpressionAt(editor, context.position, &line, &column, &context.function); + const QString exp = fixCppExpression(cppExpressionAt(editor, context.position, &line, &column, &context.function)); if (DebuggerToolTipManager::debug()) qDebug() << "GdbEngine::setToolTipExpression1 " << exp << context; if (exp.isEmpty()) return false; - // Extract the first identifier, everything else is considered - // too dangerous. - int pos1 = 0, pos2 = exp.size(); - bool inId = false; - for (int i = 0; i != exp.size(); ++i) { - const QChar c = exp.at(i); - const bool isIdChar = c.isLetterOrNumber() || c.unicode() == '_'; - if (inId && !isIdChar) { - pos2 = i; - break; - } - if (!inId && isIdChar) { - inId = true; - pos1 = i; - } - } - exp = exp.mid(pos1, pos2 - pos1); - - if (exp.isEmpty() || exp.startsWith(QLatin1Char('#')) || !hasLetterOrNumber(exp) || isKeyWord(exp)) - return false; - - if (exp.startsWith(QLatin1Char('"')) && exp.endsWith(QLatin1Char('"'))) - return false; - - if (exp.startsWith(QLatin1String("++")) || exp.startsWith(QLatin1String("--"))) - exp = exp.mid(2); - - if (exp.endsWith(QLatin1String("++")) || exp.endsWith(QLatin1String("--"))) - exp = exp.mid(2); - - if (exp.startsWith(QLatin1Char('<')) || exp.startsWith(QLatin1Char('['))) - return false; - - if (hasSideEffects(exp) || exp.isEmpty()) - return false; - if (!m_toolTipContext.isNull() && m_toolTipContext->expression == exp) { showToolTip(); return true; diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp index c5f142d6ea9..7767dd33f2a 100644 --- a/src/plugins/debugger/watchutils.cpp +++ b/src/plugins/debugger/watchutils.cpp @@ -805,6 +805,49 @@ QString cppExpressionAt(TextEditor::ITextEditor *editor, int pos, return expr; } +// Ensure an expression can be added as side-effect +// free debugger expression. +QString fixCppExpression(const QString &expIn) +{ + QString exp = expIn; + // Extract the first identifier, everything else is considered + // too dangerous. + int pos1 = 0, pos2 = exp.size(); + bool inId = false; + for (int i = 0; i != exp.size(); ++i) { + const QChar c = exp.at(i); + const bool isIdChar = c.isLetterOrNumber() || c.unicode() == '_'; + if (inId && !isIdChar) { + pos2 = i; + break; + } + if (!inId && isIdChar) { + inId = true; + pos1 = i; + } + } + exp = exp.mid(pos1, pos2 - pos1); + + if (exp.isEmpty() || exp.startsWith(QLatin1Char('#')) || !hasLetterOrNumber(exp) || isKeyWord(exp)) + return QString(); + + if (exp.startsWith(QLatin1Char('"')) && exp.endsWith(QLatin1Char('"'))) + return QString(); + + if (exp.startsWith(QLatin1String("++")) || exp.startsWith(QLatin1String("--"))) + exp.remove(0, 2); + + if (exp.endsWith(QLatin1String("++")) || exp.endsWith(QLatin1String("--"))) + exp.truncate(exp.size() - 2); + + if (exp.startsWith(QLatin1Char('<')) || exp.startsWith(QLatin1Char('['))) + return QString(); + + if (hasSideEffects(exp) || exp.isEmpty()) + return QString(); + return exp; +} + QString cppFunctionAt(const QString &fileName, int line) { using namespace CppTools; diff --git a/src/plugins/debugger/watchutils.h b/src/plugins/debugger/watchutils.h index ced524a88a6..b62854cdb10 100644 --- a/src/plugins/debugger/watchutils.h +++ b/src/plugins/debugger/watchutils.h @@ -105,6 +105,7 @@ QString quoteUnprintableLatin1(const QByteArray &ba); bool isCppEditor(Core::IEditor *editor); QString cppExpressionAt(TextEditor::ITextEditor *editor, int pos, int *line, int *column, QString *function = 0); +QString fixCppExpression(const QString &exp); QString cppFunctionAt(const QString &fileName, int line); // Decode string data as returned by the dumper helpers. QString decodeData(const QByteArray &baIn, int encoding); -- GitLab