From 073e5d6632c8f1a62b260d331aeebe5c35e58c18 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen <erik.verbruggen@digia.com> Date: Fri, 9 Aug 2013 11:43:20 +0200 Subject: [PATCH] C++: optionally let the highlighter handle ifdefed-out blocks. Change-Id: I38cc0e55348cac0245d2ab8f3e39c68de76e3e6d Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com> --- src/plugins/cpptools/cpphighlightingsupport.h | 1 + .../cpptools/cpphighlightingsupportinternal.h | 3 +++ src/plugins/cpptools/cppmodelmanager.cpp | 18 ++++++++++++++++++ src/plugins/cpptools/cppmodelmanager.h | 2 ++ .../cpptools/cppmodelmanagerinterface.h | 4 +++- .../cpptools/cpptoolseditorsupport.cpp | 19 ++++++++++++++----- src/plugins/cpptools/cpptoolseditorsupport.h | 4 +++- src/plugins/texteditor/basetexteditor.cpp | 7 ++++--- src/plugins/texteditor/basetexteditor.h | 12 ------------ src/plugins/texteditor/itexteditor.h | 19 +++++++++++++++++++ 10 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/plugins/cpptools/cpphighlightingsupport.h b/src/plugins/cpptools/cpphighlightingsupport.h index 7fd77898c24..2557681d50a 100644 --- a/src/plugins/cpptools/cpphighlightingsupport.h +++ b/src/plugins/cpptools/cpphighlightingsupport.h @@ -67,6 +67,7 @@ public: virtual bool requiresSemanticInfo() const = 0; virtual bool hightlighterHandlesDiagnostics() const = 0; + virtual bool hightlighterHandlesIfdefedOutBlocks() const = 0; virtual QFuture<TextEditor::HighlightingResult> highlightingFuture( const CPlusPlus::Document::Ptr &doc, diff --git a/src/plugins/cpptools/cpphighlightingsupportinternal.h b/src/plugins/cpptools/cpphighlightingsupportinternal.h index a2b5d4db739..ca3f9296acc 100644 --- a/src/plugins/cpptools/cpphighlightingsupportinternal.h +++ b/src/plugins/cpptools/cpphighlightingsupportinternal.h @@ -49,6 +49,9 @@ public: virtual bool hightlighterHandlesDiagnostics() const { return false; } + virtual bool hightlighterHandlesIfdefedOutBlocks() const + { return false; } + virtual QFuture<TextEditor::HighlightingResult> highlightingFuture( const CPlusPlus::Document::Ptr &doc, const CPlusPlus::Snapshot &snapshot) const; diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index b22c42fdaa8..eaa45bf5b07 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -969,3 +969,21 @@ void CppModelManager::setExtraDiagnostics(const QString &fileName, } } } + +void CppModelManager::setIfdefedOutBlocks(const QString &fileName, + const QList<TextEditor::BlockRange> &ifdeffedOutBlocks) +{ + QList<CppEditorSupport *> cppEditorSupports; + + { + QMutexLocker locker(&m_cppEditorSupportsMutex); + cppEditorSupports = m_cppEditorSupports.values(); + } + + foreach (CppEditorSupport *editorSupport, cppEditorSupports) { + if (editorSupport->fileName() == fileName) { + editorSupport->setIfdefedOutBlocks(ifdeffedOutBlocks); + break; + } + } +} diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index d8dcd55f5a3..23515769534 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -99,6 +99,8 @@ public: virtual void setExtraDiagnostics(const QString &fileName, const QString &key, const QList<Document::DiagnosticMessage> &diagnostics); + virtual void setIfdefedOutBlocks(const QString &fileName, + const QList<TextEditor::BlockRange> &ifdeffedOutBlocks); void finishedRefreshingSourceFiles(const QStringList &files); diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h index d61020337e8..0d89fef91fc 100644 --- a/src/plugins/cpptools/cppmodelmanagerinterface.h +++ b/src/plugins/cpptools/cppmodelmanagerinterface.h @@ -46,7 +46,7 @@ namespace Core { class IEditor; } namespace CPlusPlus { class LookupContext; } namespace ProjectExplorer { class Project; } -namespace TextEditor { class BaseTextEditor; } +namespace TextEditor { class BaseTextEditor; class BlockRange; } namespace Utils { class FileName; } namespace CppTools { @@ -238,6 +238,8 @@ public: virtual void setExtraDiagnostics(const QString &fileName, const QString &kind, const QList<CPlusPlus::Document::DiagnosticMessage> &diagnostics) = 0; + virtual void setIfdefedOutBlocks(const QString &fileName, + const QList<TextEditor::BlockRange> &ifdeffedOutBlocks) = 0; virtual CppTools::CppCompletionSupport *completionSupport(Core::IEditor *editor) const = 0; virtual void setCppCompletionAssistProvider(CppTools::CppCompletionAssistProvider *completionAssistProvider) = 0; diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp index 4bec4d90589..e99338bc4a2 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.cpp +++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp @@ -192,6 +192,13 @@ void CppEditorSupport::setExtraDiagnostics(const QString &key, emit diagnosticsChanged(); } +void CppEditorSupport::setIfdefedOutBlocks(const QList<BlockRange> &ifdefedOutBlocks) +{ + m_editorUpdates.ifdefedOutBlocks = ifdefedOutBlocks; + + emit diagnosticsChanged(); +} + bool CppEditorSupport::initialized() { return m_initialized; @@ -262,11 +269,13 @@ void CppEditorSupport::onDocumentUpdated(Document::Ptr doc) return; // outdated content, wait for a new document to be parsed // Update the ifdeffed-out blocks: - QList<Document::Block> skippedBlocks = doc->skippedBlocks(); - m_editorUpdates.ifdefedOutBlocks.clear(); - m_editorUpdates.ifdefedOutBlocks.reserve(skippedBlocks.size()); - foreach (const Document::Block &block, skippedBlocks) { - m_editorUpdates.ifdefedOutBlocks.append(BlockRange(block.begin(), block.end())); + if (m_highlightingSupport && !m_highlightingSupport->hightlighterHandlesIfdefedOutBlocks()) { + QList<Document::Block> skippedBlocks = doc->skippedBlocks(); + QList<BlockRange> ifdefedOutBlocks; + ifdefedOutBlocks.reserve(skippedBlocks.size()); + foreach (const Document::Block &block, skippedBlocks) + ifdefedOutBlocks.append(BlockRange(block.begin(), block.end())); + setIfdefedOutBlocks(ifdefedOutBlocks); } if (m_highlightingSupport && !m_highlightingSupport->hightlighterHandlesDiagnostics()) { diff --git a/src/plugins/cpptools/cpptoolseditorsupport.h b/src/plugins/cpptools/cpptoolseditorsupport.h index f3bce1b5464..b8f066174af 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.h +++ b/src/plugins/cpptools/cpptoolseditorsupport.h @@ -86,6 +86,8 @@ class CPPTOOLS_EXPORT CppEditorSupport: public QObject { Q_OBJECT + typedef TextEditor::BlockRange BlockRange; + public: CppEditorSupport(Internal::CppModelManager *modelManager, TextEditor::BaseTextEditor *textEditor); virtual ~CppEditorSupport(); @@ -97,6 +99,7 @@ public: void setExtraDiagnostics(const QString &key, const QList<CPlusPlus::Document::DiagnosticMessage> &messages); + void setIfdefedOutBlocks(const QList<BlockRange> &ifdefedOutBlocks); /// True after the document was parsed/updated for the first time /// and the first semantic info calculation was started. @@ -136,7 +139,6 @@ private slots: void updateEditorNow(); private: - typedef TextEditor::BaseTextEditorWidget::BlockRange BlockRange; struct EditorUpdates { EditorUpdates() : revision(-1) diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 17fca6633f7..8ffbf647ed9 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -5416,7 +5416,7 @@ QString BaseTextEditorWidget::extraSelectionTooltip(int pos) const } // the blocks list must be sorted -void BaseTextEditorWidget::setIfdefedOutBlocks(const QList<BaseTextEditorWidget::BlockRange> &blocks) +void BaseTextEditorWidget::setIfdefedOutBlocks(const QList<BlockRange> &blocks) { QTextDocument *doc = document(); BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(doc->documentLayout()); @@ -5433,11 +5433,12 @@ void BaseTextEditorWidget::setIfdefedOutBlocks(const QList<BaseTextEditorWidget: bool set = false; if (rangeNumber < blocks.size()) { const BlockRange &range = blocks.at(rangeNumber); - if (block.position() >= range.first && ((block.position() + block.length() - 1) <= range.last || !range.last)) + if (block.position() >= range.first() + && ((block.position() + block.length() - 1) <= range.last() || !range.last())) set = BaseTextDocumentLayout::setIfdefedOut(block); else cleared = BaseTextDocumentLayout::clearIfdefedOut(block); - if (block.contains(range.last)) + if (block.contains(range.last())) ++rangeNumber; } else { cleared = BaseTextDocumentLayout::clearIfdefedOut(block); diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h index 0c2e3b30bad..5f886b9c6b8 100644 --- a/src/plugins/texteditor/basetexteditor.h +++ b/src/plugins/texteditor/basetexteditor.h @@ -428,18 +428,6 @@ signals: void refactorMarkerClicked(const TextEditor::RefactorMarker &marker); public: - - struct BlockRange - { - BlockRange() : first(0), last(-1) {} - BlockRange(int first_position, int last_position) - : first(first_position), last(last_position) - {} - int first; - int last; - inline bool isNull() const { return last < first; } - }; - // the blocks list must be sorted void setIfdefedOutBlocks(const QList<BlockRange> &blocks); diff --git a/src/plugins/texteditor/itexteditor.h b/src/plugins/texteditor/itexteditor.h index 67612548196..2fa63d34c16 100644 --- a/src/plugins/texteditor/itexteditor.h +++ b/src/plugins/texteditor/itexteditor.h @@ -56,6 +56,25 @@ namespace Utils { namespace TextEditor { +class TEXTEDITOR_EXPORT BlockRange +{ +public: + BlockRange() : _first(0), _last(-1) {} + BlockRange(int firstPosition, int lastPosition) + : _first(firstPosition), _last(lastPosition) + {} + + inline bool isNull() const { return _last < _first; } + + int first() const { return _first; } + int last() const { return _last; } + +private: + int _first; + int _last; +}; + + class TEXTEDITOR_EXPORT ITextEditorDocument : public Core::TextDocument { Q_OBJECT -- GitLab