forked from qt-creator/qt-creator
Replace the current license disclaimer in files by a SPDX-License-Identifier. Task-number: QTBUG-67283 Change-Id: I708fd1f9f2b73d60f57cc3568646929117825813 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
164 lines
5.6 KiB
C++
164 lines
5.6 KiB
C++
// Copyright (C) 2016 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
|
|
|
#include <texteditor/texteditorconstants.h>
|
|
|
|
#include <utils/qtcassert.h>
|
|
|
|
#include "gitconstants.h"
|
|
#include "githighlighters.h"
|
|
|
|
namespace Git {
|
|
namespace Internal {
|
|
|
|
static const char CHANGE_PATTERN[] = "\\b[a-f0-9]{7,40}\\b";
|
|
|
|
GitSubmitHighlighter::GitSubmitHighlighter(QChar commentChar, QTextEdit * parent) :
|
|
TextEditor::SyntaxHighlighter(parent),
|
|
m_keywordPattern("^[\\w-]+:")
|
|
{
|
|
setDefaultTextFormatCategories();
|
|
m_commentChar = commentChar.isNull() ? QChar(Constants::DEFAULT_COMMENT_CHAR) : commentChar;
|
|
QTC_CHECK(m_keywordPattern.isValid());
|
|
}
|
|
|
|
void GitSubmitHighlighter::highlightBlock(const QString &text)
|
|
{
|
|
// figure out current state
|
|
auto state = static_cast<State>(previousBlockState());
|
|
if (text.trimmed().isEmpty()) {
|
|
if (state == Header)
|
|
state = Other;
|
|
setCurrentBlockState(state);
|
|
return;
|
|
} else if (text.startsWith(m_commentChar)) {
|
|
setFormat(0, text.size(), formatForCategory(TextEditor::C_COMMENT));
|
|
setCurrentBlockState(state);
|
|
return;
|
|
} else if (state == None) {
|
|
state = Header;
|
|
}
|
|
|
|
setCurrentBlockState(state);
|
|
// Apply format.
|
|
switch (state) {
|
|
case None:
|
|
break;
|
|
case Header: {
|
|
QTextCharFormat charFormat = format(0);
|
|
charFormat.setFontWeight(QFont::Bold);
|
|
setFormat(0, text.size(), charFormat);
|
|
break;
|
|
}
|
|
case Other:
|
|
// Format key words ("Task:") italic
|
|
const QRegularExpressionMatch match = m_keywordPattern.match(text);
|
|
if (match.hasMatch() && match.capturedStart(0) == 0) {
|
|
QTextCharFormat charFormat = format(0);
|
|
charFormat.setFontItalic(true);
|
|
setFormat(0, match.capturedLength(), charFormat);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
QChar GitSubmitHighlighter::commentChar() const
|
|
{
|
|
return m_commentChar;
|
|
}
|
|
|
|
void GitSubmitHighlighter::setCommentChar(QChar commentChar)
|
|
{
|
|
if (m_commentChar == commentChar)
|
|
return;
|
|
m_commentChar = commentChar;
|
|
rehighlight();
|
|
}
|
|
|
|
GitRebaseHighlighter::RebaseAction::RebaseAction(const QString ®exp,
|
|
const Format formatCategory)
|
|
: exp(regexp),
|
|
formatCategory(formatCategory)
|
|
{
|
|
}
|
|
|
|
static TextEditor::TextStyle styleForFormat(int format)
|
|
{
|
|
using namespace TextEditor;
|
|
const auto f = Format(format);
|
|
switch (f) {
|
|
case Format_Comment: return C_COMMENT;
|
|
case Format_Change: return C_DOXYGEN_COMMENT;
|
|
case Format_Description: return C_STRING;
|
|
case Format_Pick: return C_KEYWORD;
|
|
case Format_Reword: return C_FIELD;
|
|
case Format_Edit: return C_TYPE;
|
|
case Format_Squash: return C_ENUMERATION;
|
|
case Format_Fixup: return C_NUMBER;
|
|
case Format_Exec: return C_LABEL;
|
|
case Format_Break: return C_PREPROCESSOR;
|
|
case Format_Drop: return C_REMOVED_LINE;
|
|
case Format_Label: return C_LABEL;
|
|
case Format_Reset: return C_LABEL;
|
|
case Format_Merge: return C_LABEL;
|
|
case Format_Count:
|
|
QTC_CHECK(false); // should never get here
|
|
return C_TEXT;
|
|
}
|
|
QTC_CHECK(false); // should never get here
|
|
return C_TEXT;
|
|
}
|
|
|
|
GitRebaseHighlighter::GitRebaseHighlighter(QChar commentChar, QTextDocument *parent) :
|
|
TextEditor::SyntaxHighlighter(parent),
|
|
m_commentChar(commentChar),
|
|
m_changeNumberPattern(CHANGE_PATTERN)
|
|
{
|
|
setTextFormatCategories(Format_Count, styleForFormat);
|
|
|
|
m_actions << RebaseAction("^(p|pick)\\b", Format_Pick);
|
|
m_actions << RebaseAction("^(r|reword)\\b", Format_Reword);
|
|
m_actions << RebaseAction("^(e|edit)\\b", Format_Edit);
|
|
m_actions << RebaseAction("^(s|squash)\\b", Format_Squash);
|
|
m_actions << RebaseAction("^(f|fixup)\\b", Format_Fixup);
|
|
m_actions << RebaseAction("^(x|exec)\\b", Format_Exec);
|
|
m_actions << RebaseAction("^(b|break)\\b", Format_Break);
|
|
m_actions << RebaseAction("^(d|drop)\\b", Format_Drop);
|
|
m_actions << RebaseAction("^(l|label)\\b", Format_Label);
|
|
m_actions << RebaseAction("^(t|reset)\\b", Format_Reset);
|
|
m_actions << RebaseAction("^(m|merge)\\b", Format_Merge);
|
|
}
|
|
|
|
void GitRebaseHighlighter::highlightBlock(const QString &text)
|
|
{
|
|
if (text.startsWith(m_commentChar)) {
|
|
setFormat(0, text.size(), formatForCategory(Format_Comment));
|
|
QRegularExpressionMatchIterator it = m_changeNumberPattern.globalMatch(text);
|
|
while (it.hasNext()) {
|
|
const QRegularExpressionMatch match = it.next();
|
|
setFormat(match.capturedStart(), match.capturedLength(), formatForCategory(Format_Change));
|
|
}
|
|
} else {
|
|
for (const RebaseAction &action : qAsConst(m_actions)) {
|
|
const QRegularExpressionMatch match = action.exp.match(text);
|
|
if (match.hasMatch()) {
|
|
const int len = match.capturedLength();
|
|
setFormat(0, len, formatForCategory(action.formatCategory));
|
|
const QRegularExpressionMatch changeMatch = m_changeNumberPattern.match(text, len);
|
|
const int changeIndex = changeMatch.capturedStart();
|
|
if (changeMatch.hasMatch()) {
|
|
const int changeLen = changeMatch.capturedLength();
|
|
const int descStart = changeIndex + changeLen + 1;
|
|
setFormat(changeIndex, changeLen, formatForCategory(Format_Change));
|
|
setFormat(descStart, text.size() - descStart, formatForCategory(Format_Description));
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
formatSpaces(text);
|
|
}
|
|
|
|
} // namespace Internal
|
|
} // namespace Git
|