summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2013-08-09 11:43:20 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-08-19 13:01:07 +0200
commit073e5d6632c8f1a62b260d331aeebe5c35e58c18 (patch)
treed02b90373099ea4451f1cc9dc8767591c8cb59e0
parent480f7c09fc3a5cf0fa39a80c7d3e7377269e3224 (diff)
downloadqt-creator-073e5d6632c8f1a62b260d331aeebe5c35e58c18.tar.gz
C++: optionally let the highlighter handle ifdefed-out blocks.
Change-Id: I38cc0e55348cac0245d2ab8f3e39c68de76e3e6d Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
-rw-r--r--src/plugins/cpptools/cpphighlightingsupport.h1
-rw-r--r--src/plugins/cpptools/cpphighlightingsupportinternal.h3
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp18
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h2
-rw-r--r--src/plugins/cpptools/cppmodelmanagerinterface.h4
-rw-r--r--src/plugins/cpptools/cpptoolseditorsupport.cpp19
-rw-r--r--src/plugins/cpptools/cpptoolseditorsupport.h4
-rw-r--r--src/plugins/texteditor/basetexteditor.cpp7
-rw-r--r--src/plugins/texteditor/basetexteditor.h12
-rw-r--r--src/plugins/texteditor/itexteditor.h19
10 files changed, 67 insertions, 22 deletions
diff --git a/src/plugins/cpptools/cpphighlightingsupport.h b/src/plugins/cpptools/cpphighlightingsupport.h
index 7fd77898c2..2557681d50 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 a2b5d4db73..ca3f9296ac 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 b22c42fdaa..eaa45bf5b0 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 d8dcd55f5a..2351576953 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 d61020337e..0d89fef91f 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 4bec4d9058..e99338bc4a 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 f3bce1b546..b8f066174a 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 17fca6633f..8ffbf647ed 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 0c2e3b30ba..5f886b9c6b 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 6761254819..2fa63d34c1 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