Add flag for semantic highlighter to set diagnostics.

If the semantic highlighter does not take care of setting showing the wiggly
lines for diagnostics in the editor, the model manager will do.

Change-Id: Ie69fb798dd53d60ddca1668b8f586266a0daca4b
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
This commit is contained in:
Erik Verbruggen
2012-03-15 10:52:55 +01:00
parent 8af873de94
commit 51de4ed21a
4 changed files with 50 additions and 39 deletions

View File

@@ -72,6 +72,8 @@ public:
virtual ~CppHighlightingSupportFactory() = 0;
virtual CppHighlightingSupport *highlightingSupport(TextEditor::ITextEditor *editor) = 0;
virtual bool hightlighterHandlesDiagnostics() const = 0;
};
} // namespace CppTools

View File

@@ -62,6 +62,9 @@ public:
virtual ~CppHighlightingSupportInternalFactory();
virtual CppHighlightingSupport *highlightingSupport(TextEditor::ITextEditor *editor);
virtual bool hightlighterHandlesDiagnostics() const
{ return false; }
};
} // namespace Internal

View File

@@ -1099,8 +1099,6 @@ void CppModelManager::updateEditor(Document::Ptr doc)
blockRanges.append(TextEditor::BaseTextEditorWidget::BlockRange(block.begin(), block.end()));
}
QList<QTextEdit::ExtraSelection> selections;
// set up the format for the errors
QTextCharFormat errorFormat;
errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
@@ -1111,47 +1109,51 @@ void CppModelManager::updateEditor(Document::Ptr doc)
warningFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
warningFormat.setUnderlineColor(Qt::darkYellow);
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();
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());
selections.append(sel);
}
QList<Editor> todo;
foreach (const Editor &e, 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();
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.selections = selections;
e.ifdefedOutBlocks = blockRanges;
todo.append(e);
m_todo = todo;
@@ -1180,8 +1182,9 @@ void CppModelManager::updateEditorSelections()
else if (editor->document()->revision() != ed.revision)
continue; // outdated
editor->setExtraSelections(TextEditor::BaseTextEditorWidget::CodeWarningsSelection,
ed.selections);
if (ed.updateSelections)
editor->setExtraSelections(TextEditor::BaseTextEditorWidget::CodeWarningsSelection,
ed.selections);
editor->setIfdefedOutBlocks(ed.ifdefedOutBlocks);
}

View File

@@ -225,8 +225,11 @@ private:
struct Editor {
Editor()
: revision(-1) {}
: revision(-1)
, updateSelections(true)
{}
int revision;
bool updateSelections;
QPointer<TextEditor::ITextEditor> textEditor;
QList<QTextEdit::ExtraSelection> selections;
QList<TextEditor::BaseTextEditorWidget::BlockRange> ifdefedOutBlocks;