From 746e4f41197a37418d03975ee856e28b3c5c13c3 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 16 Jul 2013 13:51:44 +0200 Subject: [PATCH] Fix marking JavaScript lines that threw an exception Since EditorManager::openedEditors doesn't exactly do what one would expect, it was only marking a single editor even if there were multiple editors on the same document. Change-Id: Iae579c2cfd8455de2783d39fa69944fe92dfc60a Reviewed-by: Aurindam Jana --- .../editormanager/documentmodel.cpp | 10 +-- .../coreplugin/editormanager/documentmodel.h | 2 +- .../debugger/qml/qmlv8debuggerclient.cpp | 62 ++++++++++--------- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp index f4191105fd0..f4eb1fef3ad 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.cpp +++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp @@ -163,7 +163,7 @@ void DocumentModel::addEntry(Entry *entry) QString fileName = entry->fileName(); // replace a non-loaded entry (aka 'restored') if possible - int previousIndex = indexofFileName(fileName); + int previousIndex = indexOfFilePath(fileName); if (previousIndex >= 0) { if (entry->document && d->m_documents.at(previousIndex)->document == 0) { Entry *previousEntry = d->m_documents.at(previousIndex); @@ -190,12 +190,12 @@ void DocumentModel::addEntry(Entry *entry) endInsertRows(); } -int DocumentModel::indexofFileName(const QString &filename) const +int DocumentModel::indexOfFilePath(const QString &filePath) const { - if (filename.isEmpty()) + if (filePath.isEmpty()) return -1; for (int i = 0; i < d->m_documents.count(); ++i) { - if (d->m_documents.at(i)->fileName() == filename) + if (d->m_documents.at(i)->fileName() == filePath) return i; } return -1; @@ -226,7 +226,7 @@ void DocumentModel::removeEditor(IEditor *editor, bool *lastOneForDocument) void DocumentModel::removeDocument(const QString &fileName) { - int index = indexofFileName(fileName); + int index = indexOfFilePath(fileName); QTC_ASSERT(!d->m_documents.at(index)->document, return); // we wouldn't know what to do with the associated editors removeDocument(index); } diff --git a/src/plugins/coreplugin/editormanager/documentmodel.h b/src/plugins/coreplugin/editormanager/documentmodel.h index e2e5c309c63..929298d16fb 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.h +++ b/src/plugins/coreplugin/editormanager/documentmodel.h @@ -77,6 +77,7 @@ public: int documentCount() const; QList documents() const; int indexOfDocument(IDocument *document) const; + int indexOfFilePath(const QString &filePath) const; Entry *entryForDocument(IDocument *document) const; QList openedDocuments() const; @@ -98,7 +99,6 @@ private slots: private: void addEntry(Entry *entry); - int indexofFileName(const QString &filename) const; void removeDocument(int idx); DocumentModelPrivate *d; diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp index 02b10ea5461..361d83d0810 100644 --- a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp +++ b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp @@ -1993,50 +1993,52 @@ void QmlV8DebuggerClient::highlightExceptionCode(int lineNumber, const QString &filePath, const QString &errorMessage) { - EditorManager *editorManager = EditorManager::instance(); - QList openedEditors = editorManager->openedEditors(); + DocumentModel *documentModel = EditorManager::documentModel(); + int index = documentModel->indexOfFilePath(filePath); + if (index < 0 || !documentModel->documents().at(index)->document) + return; + QList editors = documentModel->editorsForDocument( + documentModel->documents().at(index)->document); // set up the format for the errors QTextCharFormat errorFormat; errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); errorFormat.setUnderlineColor(Qt::red); - foreach (IEditor *editor, openedEditors) { - if (editor->document()->filePath() == filePath) { - TextEditor::BaseTextEditorWidget *ed = qobject_cast(editor->widget()); - if (!ed) - continue; + foreach (IEditor *editor, editors) { + TextEditor::BaseTextEditorWidget *ed = qobject_cast(editor->widget()); + if (!ed) + continue; - QList selections; - QTextEdit::ExtraSelection sel; - sel.format = errorFormat; - QTextCursor c(ed->document()->findBlockByNumber(lineNumber - 1)); - const QString text = c.block().text(); - for (int i = 0; i < text.size(); ++i) { - if (! text.at(i).isSpace()) { - c.setPosition(c.position() + i); - break; - } + QList selections; + QTextEdit::ExtraSelection sel; + sel.format = errorFormat; + QTextCursor c(ed->document()->findBlockByNumber(lineNumber - 1)); + const QString text = c.block().text(); + for (int i = 0; i < text.size(); ++i) { + if (! text.at(i).isSpace()) { + c.setPosition(c.position() + i); + break; } - c.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); - sel.cursor = c; - - sel.format.setToolTip(errorMessage); - - selections.append(sel); - ed->setExtraSelections(TextEditor::BaseTextEditorWidget::DebuggerExceptionSelection, selections); - - QString message = QString(_("%1: %2: %3")).arg(filePath).arg(lineNumber) - .arg(errorMessage); - d->engine->showMessage(message, ConsoleOutput); } + c.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); + sel.cursor = c; + + sel.format.setToolTip(errorMessage); + + selections.append(sel); + ed->setExtraSelections(TextEditor::BaseTextEditorWidget::DebuggerExceptionSelection, selections); + + QString message = QString(_("%1: %2: %3")).arg(filePath).arg(lineNumber) + .arg(errorMessage); + d->engine->showMessage(message, ConsoleOutput); } } void QmlV8DebuggerClient::clearExceptionSelection() { - EditorManager *editorManager = EditorManager::instance(); - QList openedEditors = editorManager->openedEditors(); + DocumentModel *documentModel = EditorManager::documentModel(); + QList openedEditors = documentModel->editorsForDocuments(documentModel->openedDocuments()); QList selections; foreach (IEditor *editor, openedEditors) {