From 39e1113707f9eb7155e66ef79f24955137b728f4 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 18 Aug 2009 11:23:01 +0200
Subject: [PATCH] debugger: add a simple syntax highlighter for disassembler
 output

---
 src/plugins/debugger/debuggeragents.cpp       | 31 ++++++++++++++-
 src/plugins/debugger/debuggeroutputwindow.cpp |  2 +-
 src/plugins/debugger/gdb/gdbengine.cpp        | 39 ++++++++++++-------
 src/plugins/debugger/gdb/gdbengine.h          |  6 +--
 4 files changed, 59 insertions(+), 19 deletions(-)

diff --git a/src/plugins/debugger/debuggeragents.cpp b/src/plugins/debugger/debuggeragents.cpp
index d00bc5cf398..d74693f279e 100644
--- a/src/plugins/debugger/debuggeragents.cpp
+++ b/src/plugins/debugger/debuggeragents.cpp
@@ -44,6 +44,7 @@
 
 #include <QtGui/QPlainTextEdit>
 #include <QtGui/QTextCursor>
+#include <QtGui/QSyntaxHighlighter>
 
 #include <limits.h>
 
@@ -143,6 +144,30 @@ struct DisassemblerViewAgentPrivate
     LocationMark2 *locationMark;
 };
 
+/*!
+    \class DisassemblerSyntaxHighlighter
+
+     Simple syntax highlighter to make the disassembler text less prominent.
+*/
+
+class DisassemblerHighlighter : public QSyntaxHighlighter
+{
+public:
+    DisassemblerHighlighter(QPlainTextEdit *parent)
+        : QSyntaxHighlighter(parent->document())
+    {}
+
+private:
+    void highlightBlock(const QString &text)
+    {
+        if (!text.isEmpty() && text.at(0) != ' ') {
+            QTextCharFormat format;
+            format.setForeground(QColor(128, 128, 128));
+            setFormat(0, text.size(), format);
+        }
+    }
+};
+
 /*!
     \class DisassemblerViewAgent
 
@@ -177,6 +202,7 @@ void DisassemblerViewAgent::setContents(const QString &contents)
     using namespace Core;
     using namespace TextEditor;
 
+    QPlainTextEdit *plainTextEdit = 0;
     EditorManager *editorManager = EditorManager::instance();
     if (!d->editor) {
         QString titlePattern = "Disassembler";
@@ -184,12 +210,13 @@ void DisassemblerViewAgent::setContents(const QString &contents)
             editorManager->openEditorWithContents(
             Core::Constants::K_DEFAULT_TEXT_EDITOR,
             &titlePattern));
+        if ((plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget())))
+            (void) new DisassemblerHighlighter(plainTextEdit);
     }
 
     editorManager->activateEditor(d->editor);
 
-    QPlainTextEdit *plainTextEdit =
-        qobject_cast<QPlainTextEdit *>(d->editor->widget());
+    plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget());
     if (plainTextEdit)
         plainTextEdit->setPlainText(contents);
 
diff --git a/src/plugins/debugger/debuggeroutputwindow.cpp b/src/plugins/debugger/debuggeroutputwindow.cpp
index 798a1ff15e5..54e1b1b141f 100644
--- a/src/plugins/debugger/debuggeroutputwindow.cpp
+++ b/src/plugins/debugger/debuggeroutputwindow.cpp
@@ -260,7 +260,7 @@ public:
     CombinedPane(QWidget *parent)
         : DebuggerPane(parent)
     {
-        (void)new OutputHighlighter(this);
+        (void) new OutputHighlighter(this);
     }
 
 public slots:
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 0e8dcf448b1..2d9842cb9f2 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -1256,6 +1256,19 @@ void GdbEngine::handleAsyncOutput2(const GdbMi &data)
 {
     qq->notifyInferiorStopped();
 
+    // Sometimes we get some interesting extra information. Grab it.
+    GdbMi frame = data.findChild("frame");
+    GdbMi shortName = frame.findChild("file");
+    GdbMi fullName = frame.findChild("fullname");
+    if (shortName.isValid() && fullName.isValid()) {
+        QString file = QFile::decodeName(shortName.data());
+        QString full = QFile::decodeName(fullName.data());
+        if (file != full) {
+            m_shortToFullName[file] = full;
+            m_fullToShortName[full] = file;
+        }
+    }
+
     //
     // Stack
     //
@@ -1263,6 +1276,7 @@ void GdbEngine::handleAsyncOutput2(const GdbMi &data)
     updateLocals(); // Quick shot
 
     int currentId = data.findChild("thread-id").data().toInt();
+
     reloadStack();
     if (supportsThreads())
         postCommand(_("-thread-list-ids"), WatchUpdate, CB(handleStackListThreads), currentId);
@@ -1768,7 +1782,7 @@ void GdbEngine::stepExec()
     setTokenBarrier();
     qq->notifyInferiorRunningRequested();
     if (qq->isReverseDebugging())
-        postCommand(_("reverse-step"), CB(handleExecContinue));
+        postCommand(_("-reverse-step"), CB(handleExecContinue));
     else
         postCommand(_("-exec-step"), CB(handleExecContinue));
 }
@@ -1778,7 +1792,7 @@ void GdbEngine::stepIExec()
     setTokenBarrier();
     qq->notifyInferiorRunningRequested();
     if (qq->isReverseDebugging())
-        postCommand(_("reverse-stepi"), CB(handleExecContinue));
+        postCommand(_("-reverse-stepi"), CB(handleExecContinue));
     else
         postCommand(_("-exec-step-instruction"), CB(handleExecContinue));
 }
@@ -1795,7 +1809,7 @@ void GdbEngine::nextExec()
     setTokenBarrier();
     qq->notifyInferiorRunningRequested();
     if (qq->isReverseDebugging())
-        postCommand(_("reverse-next"), CB(handleExecContinue));
+        postCommand(_("-reverse-next"), CB(handleExecContinue));
     else
         postCommand(_("-exec-next"), CB(handleExecContinue));
 }
@@ -1805,9 +1819,9 @@ void GdbEngine::nextIExec()
     setTokenBarrier();
     qq->notifyInferiorRunningRequested();
     if (qq->isReverseDebugging())
-        postCommand(_("reverse-nexti"), CB(handleExecContinue));
+        postCommand(_("-reverse-nexti"), CB(handleExecContinue));
     else
-        postCommand(_("exec-next-instruction"), CB(handleExecContinue));
+        postCommand(_("-exec-next-instruction"), CB(handleExecContinue));
 }
 
 void GdbEngine::runToLineExec(const QString &fileName, int lineNumber)
@@ -1921,9 +1935,9 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
             else
                 data->bpAddress = _(child.data());
         } else if (child.hasName("file")) {
-            files.append(QString::fromLocal8Bit(child.data()));
+            files.append(QFile::decodeName(child.data()));
         } else if (child.hasName("fullname")) {
-            QString fullName = QString::fromLocal8Bit(child.data());
+            QString fullName = QFile::decodeName(child.data());
             #ifdef Q_OS_WIN
             fullName = QDir::cleanPath(fullName);
             #endif
@@ -2446,8 +2460,8 @@ void GdbEngine::handleStackListFrames(const GdbResultRecord &record, const QVari
         const GdbMi frameMi = stack.childAt(i);
         StackFrame frame(i);
         QStringList files;
-        files.append(QString::fromLocal8Bit(frameMi.findChild("fullname").data()));
-        files.append(QString::fromLocal8Bit(frameMi.findChild("file").data()));
+        files.append(QFile::decodeName(frameMi.findChild("fullname").data()));
+        files.append(QFile::decodeName(frameMi.findChild("file").data()));
         frame.file = fullName(files);
         frame.function = _(frameMi.findChild("func").data());
         frame.from = _(frameMi.findChild("from").data());
@@ -4035,7 +4049,7 @@ static QByteArray parseLine(const GdbMi &line)
     return ba;
 }
 
-static QString parseDisassembler(const GdbMi &lines)
+QString GdbEngine::parseDisassembler(const GdbMi &lines)
 {
     // ^done,data={asm_insns=[src_and_asm_line={line="1243",file=".../app.cpp",
     // line_asm_insn=[{address="0x08054857",func-name="main",offset="27",
@@ -4058,16 +4072,15 @@ static QString parseDisassembler(const GdbMi &lines)
         if (child.hasName("src_and_asm_line")) {
             // mixed mode
             int line = child.findChild("line").data().toInt();
-            QByteArray fileName = child.findChild("file").data();
+            QString fileName = QFile::decodeName(child.findChild("file").data());
             if (!fileLoaded) {
-                QFile file(QFile::decodeName(fileName));
+                QFile file(fullName(fileName));
                 file.open(QIODevice::ReadOnly);
                 fileContents = file.readAll().split('\n');
                 fileLoaded = true;
             }
             if (line >= 0 && line < fileContents.size())
                 ba += "    " + fileContents.at(line) + '\n';
-
             GdbMi insn = child.findChild("line_asm_insn");
             foreach (const GdbMi &line, insn.children()) 
                 ba += parseLine(line);
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index e9a2b41a92f..74134e8d37a 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -144,7 +144,6 @@ private:
     //
 
     int currentFrame() const;
-    //QString currentWorkingDirectory() const { return m_pwd; }
 
     bool supportsThreads() const;
 
@@ -162,12 +161,12 @@ public: // otherwise the Qt flag macros are unhappy
         NeedsStop = 1,
         Discardable = 2,
         RebuildModel = 4,
-        WatchUpdate = Discardable|RebuildModel,
+        WatchUpdate = Discardable | RebuildModel,
         EmbedToken = 8
     };
     Q_DECLARE_FLAGS(GdbCommandFlags, GdbCommandFlag)
-private:
 
+private:
     typedef void (GdbEngine::*GdbCommandCallback)(const GdbResultRecord &record, const QVariant &cookie);
 
     struct GdbCommand
@@ -372,6 +371,7 @@ private:
     void setLocals(const QList<GdbMi> &locals);
    
     bool startModeAllowsDumpers() const;
+    QString parseDisassembler(const GdbMi &lines);
 
     int m_pendingRequests;
 
-- 
GitLab