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