diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2013-04-17 10:58:20 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-04-26 12:47:06 +0200 |
commit | 0c27b276584691f05e3efc88c95014f5bb5c3fa6 (patch) | |
tree | af65cf9dc162e0579d721bf27875d01b41e406f0 /src/plugins/cpptools/cppmodelmanager.cpp | |
parent | e8d59fb76f6c59d8a0dd1e9d6cbdcb4bcfb3c9f0 (diff) | |
download | qt-creator-0c27b276584691f05e3efc88c95014f5bb5c3fa6.tar.gz |
C++ Detach the CppEditor from code-model internals.
- Moved document update handling into CppTools.
- Moved semantic info calculation into CppTools.
- Moved semantic highlighting into CppTools.
Change-Id: I253861bf074a64b1f657f7a4a8e6583871b5285f
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cppmodelmanager.cpp')
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 247 |
1 files changed, 48 insertions, 199 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index b79f57e5c8..07067d9e56 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -643,12 +643,6 @@ CppModelManager::CppModelManager(QObject *parent) QTC_ASSERT(pe, return); ProjectExplorer::SessionManager *session = pe->session(); - m_updateEditorSelectionsTimer = new QTimer(this); - m_updateEditorSelectionsTimer->setInterval(500); - m_updateEditorSelectionsTimer->setSingleShot(true); - connect(m_updateEditorSelectionsTimer, SIGNAL(timeout()), - this, SLOT(updateEditorSelections())); - connect(session, SIGNAL(projectAdded(ProjectExplorer::Project*)), this, SLOT(onProjectAdded(ProjectExplorer::Project*))); @@ -663,16 +657,7 @@ CppModelManager::CppModelManager(QObject *parent) qRegisterMetaType<CPlusPlus::Document::Ptr>("CPlusPlus::Document::Ptr"); - // thread connections - connect(this, SIGNAL(documentUpdated(CPlusPlus::Document::Ptr)), - this, SLOT(onDocumentUpdated(CPlusPlus::Document::Ptr))); - connect(this, SIGNAL(extraDiagnosticsUpdated(QString)), - this, SLOT(onExtraDiagnosticsUpdated(QString))); - - // Listen for editor closed and opened events so that we can keep track of changing files - connect(Core::ICore::editorManager(), SIGNAL(editorOpened(Core::IEditor*)), - this, SLOT(editorOpened(Core::IEditor*))); - + // Listen for editor closed events so that we can keep track of changing files connect(Core::ICore::editorManager(), SIGNAL(editorAboutToClose(Core::IEditor*)), this, SLOT(editorAboutToClose(Core::IEditor*))); @@ -868,6 +853,22 @@ void CppModelManager::removeEditorSupport(AbstractEditorSupport *editorSupport) m_addtionalEditorSupport.remove(editorSupport); } +/// \brief Returns the \c CppEditorSupport for the given text editor. It will +/// create one when none exists yet. +CppEditorSupport *CppModelManager::cppEditorSupport(TextEditor::BaseTextEditor *editor) +{ + Q_ASSERT(editor); + + QMutexLocker locker(&m_editorSupportMutex); + + CppEditorSupport *editorSupport = m_editorSupport.value(editor, 0); + if (!editorSupport) { + editorSupport = new CppEditorSupport(this, editor); + m_editorSupport.insert(editor, editorSupport); + } + return editorSupport; +} + QList<int> CppModelManager::references(CPlusPlus::Symbol *symbol, const LookupContext &context) { return m_findReferences->references(symbol, context); @@ -904,14 +905,17 @@ void CppModelManager::replaceSnapshot(const CPlusPlus::Snapshot &newSnapshot) CppModelManager::WorkingCopy CppModelManager::buildWorkingCopyList() { + QList<CppEditorSupport *> supporters; + + { + QMutexLocker locker(&m_editorSupportMutex); + supporters = m_editorSupport.values(); + } + WorkingCopy workingCopy; - QMapIterator<TextEditor::ITextEditor *, CppEditorSupport *> it(m_editorSupport); - while (it.hasNext()) { - it.next(); - TextEditor::ITextEditor *textEditor = it.key(); - CppEditorSupport *editorSupport = it.value(); - QString fileName = textEditor->document()->fileName(); - workingCopy.insert(fileName, editorSupport->contents(), editorSupport->editorRevision()); + foreach (const CppEditorSupport *editorSupport, supporters) { + workingCopy.insert(editorSupport->fileName(), editorSupport->contents(), + editorSupport->editorRevision()); } QSetIterator<AbstractEditorSupport *> jt(m_addtionalEditorSupport); @@ -1009,36 +1013,19 @@ QList<ProjectPart::Ptr> CppModelManager::projectPart(const QString &fileName) co return parts; } -/*! - \fn void CppModelManager::editorOpened(Core::IEditor *editor) - \brief If a C++ editor is opened, the model manager listens to content changes - in order to update the CppCodeModel accordingly. It also updates the - CppCodeModel for the first time with this editor. - - \sa void CppModelManager::editorContentsChanged() - */ -void CppModelManager::editorOpened(Core::IEditor *editor) -{ - if (isCppEditor(editor)) { - TextEditor::ITextEditor *textEditor = qobject_cast<TextEditor::ITextEditor *>(editor); - QTC_ASSERT(textEditor, return); - - CppEditorSupport *editorSupport = new CppEditorSupport(this); - editorSupport->setTextEditor(textEditor); - m_editorSupport[textEditor] = editorSupport; - } -} - +/// \brief Removes the CppEditorSupport for the closed editor. void CppModelManager::editorAboutToClose(Core::IEditor *editor) { - if (isCppEditor(editor)) { - TextEditor::ITextEditor *textEditor = qobject_cast<TextEditor::ITextEditor *>(editor); - QTC_ASSERT(textEditor, return); + if (!isCppEditor(editor)) + return; - CppEditorSupport *editorSupport = m_editorSupport.value(textEditor); - m_editorSupport.remove(textEditor); - delete editorSupport; - } + TextEditor::BaseTextEditor *textEditor = qobject_cast<TextEditor::BaseTextEditor *>(editor); + QTC_ASSERT(textEditor, return); + + QMutexLocker locker(&m_editorSupportMutex); + CppEditorSupport *editorSupport = m_editorSupport.value(textEditor, 0); + m_editorSupport.remove(textEditor); + delete editorSupport; } bool CppModelManager::isCppEditor(Core::IEditor *editor) const @@ -1048,140 +1035,8 @@ bool CppModelManager::isCppEditor(Core::IEditor *editor) const void CppModelManager::emitDocumentUpdated(Document::Ptr doc) { - emit documentUpdated(doc); -} - -void CppModelManager::onDocumentUpdated(Document::Ptr doc) -{ if (replaceDocument(doc)) - updateEditor(doc); -} - -void CppModelManager::onExtraDiagnosticsUpdated(const QString &fileName) -{ - if (Document::Ptr doc = document(fileName)) - updateEditor(doc); -} - -void CppModelManager::updateEditor(Document::Ptr doc) -{ - const QString fileName = doc->fileName(); - - QList<Core::IEditor *> openedEditors = Core::ICore::editorManager()->openedEditors(); - foreach (Core::IEditor *editor, openedEditors) { - if (editor->document()->fileName() == fileName) { - TextEditor::ITextEditor *textEditor = qobject_cast<TextEditor::ITextEditor *>(editor); - if (! textEditor) - continue; - - TextEditor::BaseTextEditorWidget *ed = qobject_cast<TextEditor::BaseTextEditorWidget *>(textEditor->widget()); - if (! ed) - continue; - - QList<TextEditor::BaseTextEditorWidget::BlockRange> blockRanges; - - foreach (const Document::Block &block, doc->skippedBlocks()) { - blockRanges.append(TextEditor::BaseTextEditorWidget::BlockRange(block.begin(), block.end())); - } - - // set up the format for the errors - QTextCharFormat errorFormat; - errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); - errorFormat.setUnderlineColor(Qt::red); - - // set up the format for the warnings. - QTextCharFormat warningFormat; - warningFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); - warningFormat.setUnderlineColor(Qt::darkYellow); - - QList<Editor> todo; - foreach (const Editor &e, m_todo) { - if (e.textEditor != textEditor) - todo.append(e); - } - Editor e; - - if (m_highlightingFactory->hightlighterHandlesDiagnostics()) { - e.updateSelections = false; - } else { - QSet<int> lines; - QList<Document::DiagnosticMessage> messages = doc->diagnosticMessages(); - messages += extraDiagnostics(doc->fileName()); - foreach (const Document::DiagnosticMessage &m, messages) { - if (m.fileName() != fileName) - continue; - else if (lines.contains(m.line())) - continue; - - lines.insert(m.line()); - - QTextEdit::ExtraSelection sel; - if (m.isWarning()) - sel.format = warningFormat; - else - sel.format = errorFormat; - - QTextCursor c(ed->document()->findBlockByNumber(m.line() - 1)); - const QString text = c.block().text(); - if (m.length() > 0 && m.column() + m.length() < (unsigned)text.size()) { - int column = m.column() > 0 ? m.column() - 1 : 0; - c.setPosition(c.position() + column); - c.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, m.length()); - } else { - 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(m.text()); - e.selections.append(sel); - } - } - - - e.revision = ed->document()->revision(); - e.textEditor = textEditor; - e.ifdefedOutBlocks = blockRanges; - todo.append(e); - m_todo = todo; - postEditorUpdate(); - break; - } - } -} - -void CppModelManager::postEditorUpdate() -{ - m_updateEditorSelectionsTimer->start(500); -} - -void CppModelManager::updateEditorSelections() -{ - foreach (const Editor &ed, m_todo) { - if (! ed.textEditor) - continue; - - TextEditor::ITextEditor *textEditor = ed.textEditor; - TextEditor::BaseTextEditorWidget *editor = qobject_cast<TextEditor::BaseTextEditorWidget *>(textEditor->widget()); - - if (! editor) - continue; - else if (editor->document()->revision() != ed.revision) - continue; // outdated - - if (ed.updateSelections) - editor->setExtraSelections(TextEditor::BaseTextEditorWidget::CodeWarningsSelection, - ed.selections); - - editor->setIfdefedOutBlocks(ed.ifdefedOutBlocks); - } - - m_todo.clear(); - + emit documentUpdated(doc); } void CppModelManager::onProjectAdded(ProjectExplorer::Project *) @@ -1308,26 +1163,20 @@ CppIndexingSupport *CppModelManager::indexingSupport() return m_indexingSupporter ? m_indexingSupporter : m_internalIndexingSupport; } -void CppModelManager::setExtraDiagnostics(const QString &fileName, int kind, +void CppModelManager::setExtraDiagnostics(const QString &fileName, const QString &kind, const QList<Document::DiagnosticMessage> &diagnostics) { + QList<CppEditorSupport *> supporters; + { - QMutexLocker locker(&m_protectExtraDiagnostics); - if (m_extraDiagnostics[fileName][kind] == diagnostics) - return; - m_extraDiagnostics[fileName].insert(kind, diagnostics); + QMutexLocker locker(&m_editorSupportMutex); + supporters = m_editorSupport.values(); } - emit extraDiagnosticsUpdated(fileName); -} -QList<Document::DiagnosticMessage> CppModelManager::extraDiagnostics(const QString &fileName, int kind) const -{ - QMutexLocker locker(&m_protectExtraDiagnostics); - if (kind == -1) { - QList<Document::DiagnosticMessage> messages; - foreach (const QList<Document::DiagnosticMessage> &list, m_extraDiagnostics.value(fileName)) - messages += list; - return messages; + foreach (CppEditorSupport *supporter, supporters) { + if (supporter->fileName() == fileName) { + supporter->setExtraDiagnostics(kind, diagnostics); + break; + } } - return m_extraDiagnostics.value(fileName).value(kind); } |