Commit 890e7ea9 authored by Erik Verbruggen's avatar Erik Verbruggen
Browse files

Created methods for semantic selection creation.

parent ccd46ec4
......@@ -1839,6 +1839,64 @@ void CPPEditor::semanticRehighlight()
m_semanticHighlighter->rehighlight(currentSource());
}
static QList<QTextEdit::ExtraSelection> createSelections(QTextDocument *document,
const QList<CPlusPlus::Document::DiagnosticMessage> &msgs,
const QTextCharFormat &format)
{
QList<QTextEdit::ExtraSelection> selections;
foreach (const Document::DiagnosticMessage &m, msgs) {
QTextCursor cursor(document);
cursor.setPosition(document->findBlockByNumber(m.line() - 1).position() + m.column() - 1);
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, m.length());
QTextEdit::ExtraSelection sel;
sel.cursor = cursor;
sel.format = format;
sel.format.setToolTip(m.text());
selections.append(sel);
}
return selections;
}
static QList<QTextEdit::ExtraSelection> createSelections(QTextDocument *document,
const QList<SemanticInfo::Use> &msgs,
const QTextCharFormat &format)
{
QList<QTextEdit::ExtraSelection> selections;
QTextBlock currentBlock = document->firstBlock();
unsigned currentLine = 1;
foreach (const SemanticInfo::Use &use, msgs) {
QTextCursor cursor(document);
if (currentLine != use.line) {
int delta = use.line - currentLine;
if (delta >= 0) {
while (delta--)
currentBlock = currentBlock.next();
} else {
currentBlock = document->findBlockByNumber(use.line - 1);
}
currentLine = use.line;
}
cursor.setPosition(currentBlock.position() + use.column - 1);
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, use.length);
QTextEdit::ExtraSelection sel;
sel.cursor = cursor;
sel.format = format;
selections.append(sel);
}
return selections;
}
void CPPEditor::updateSemanticInfo(const SemanticInfo &semanticInfo)
{
if (semanticInfo.revision != editorRevision()) {
......@@ -1881,83 +1939,19 @@ void CPPEditor::updateSemanticInfo(const SemanticInfo &semanticInfo)
}
if (m_lastSemanticInfo.forced || previousSemanticInfo.revision != semanticInfo.revision) {
QList<QTextEdit::ExtraSelection> undefinedSymbolSelections;
foreach (const Document::DiagnosticMessage &m, semanticInfo.diagnosticMessages) {
QTextCursor cursor(document());
cursor.setPosition(document()->findBlockByNumber(m.line() - 1).position() + m.column() - 1);
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, m.length());
QTextEdit::ExtraSelection sel;
sel.cursor = cursor;
sel.format.setUnderlineColor(Qt::darkYellow); // ### hardcoded
sel.format.setUnderlineStyle(QTextCharFormat::WaveUnderline); // ### hardcoded
sel.format.setToolTip(m.text());
undefinedSymbolSelections.append(sel);
}
setExtraSelections(UndefinedSymbolSelection, undefinedSymbolSelections);
QTextBlock currentBlock = document()->firstBlock();
unsigned currentLine = 1;
QList<QTextEdit::ExtraSelection> typeSelections;
foreach (const SemanticInfo::Use &use, semanticInfo.typeUsages) {
QTextCursor cursor(document());
if (currentLine != use.line) {
int delta = use.line - currentLine;
if (delta >= 0) {
while (delta--)
currentBlock = currentBlock.next();
} else {
currentBlock = document()->findBlockByNumber(use.line - 1);
}
currentLine = use.line;
}
cursor.setPosition(currentBlock.position() + use.column - 1);
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, use.length);
QTextEdit::ExtraSelection sel;
sel.cursor = cursor;
sel.format = m_typeFormat;
typeSelections.append(sel);
}
setExtraSelections(TypeSelection, typeSelections);
// ### extract common parts from the previous loop and the next one
QList<QTextEdit::ExtraSelection> objcKeywords;
if (isObjCEnabled()) {
foreach (const SemanticInfo::Use &use, semanticInfo.objcKeywords) {
QTextCursor cursor(document());
if (currentLine != use.line) {
int delta = use.line - currentLine;
if (delta >= 0) {
while (delta--)
currentBlock = currentBlock.next();
} else {
currentBlock = document()->findBlockByNumber(use.line - 1);
}
currentLine = use.line;
}
cursor.setPosition(currentBlock.position() + use.column - 1);
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, use.length);
QTextEdit::ExtraSelection sel;
sel.cursor = cursor;
sel.format = m_keywordFormat;
objcKeywords.append(sel);
}
}
setExtraSelections(ObjCSelection, objcKeywords);
QTextCharFormat diagnosticMessageFormat;
diagnosticMessageFormat.setUnderlineColor(Qt::darkYellow); // ### hardcoded
diagnosticMessageFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); // ### hardcoded
setExtraSelections(UndefinedSymbolSelection, createSelections(document(),
semanticInfo.diagnosticMessages,
diagnosticMessageFormat));
setExtraSelections(TypeSelection, createSelections(document(),
semanticInfo.typeUsages,
m_typeFormat));
setExtraSelections(ObjCSelection, createSelections(document(),
semanticInfo.objcKeywords,
m_keywordFormat));
}
setExtraSelections(UnusedSymbolSelection, unusedSelections);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment