Files
seer/src/SeerOdinSourceHighlighter.cpp
T

98 lines
4.7 KiB
C++
Raw Normal View History

2025-09-29 15:17:39 -01:00
// SPDX-FileCopyrightText: 2021 Ernie Pasveer <epasveer@att.net>
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "SeerOdinSourceHighlighter.h"
SeerOdinSourceHighlighter::SeerOdinSourceHighlighter (QTextDocument* parent) : SeerSourceHighlighter(parent) {
// Set to default formats.
2025-10-01 21:11:05 -01:00
setHighlighterSettings(SeerHighlighterSettings::populate(""));
2025-09-29 15:17:39 -01:00
}
void SeerOdinSourceHighlighter::setHighlighterSettings (const SeerHighlighterSettings& settings) {
_highlighterSettings = settings;
_classFormat = _highlighterSettings.get("Class");
_quotationFormat = _highlighterSettings.get("Quotation");
_functionFormat = _highlighterSettings.get("Function");
_singleLineCommentFormat = _highlighterSettings.get("Comment");
_multiLineCommentFormat = _highlighterSettings.get("Multiline Comment");
_keywordFormat = _highlighterSettings.get("Keyword");
const QString keywordPatterns[] = {
2025-09-29 18:18:58 -01:00
QStringLiteral("\\bpackage\\b"), QStringLiteral("\\bimport\\b"), QStringLiteral("\\bforeign\\b"),
QStringLiteral("\\bproc\\b"), QStringLiteral("\\breturn\\b"), QStringLiteral("\\bif\\b"),
QStringLiteral("\\belse\\b"), QStringLiteral("\\bswitch\\b"), QStringLiteral("\\bcase\\b"),
QStringLiteral("\\bbreak\\b"), QStringLiteral("\\bcontinue\\b"), QStringLiteral("\\bfallthrough\\b"),
QStringLiteral("\\bfor\\b"), QStringLiteral("\\bdo\\b"), QStringLiteral("\\bin\\b"),
QStringLiteral("\\bnot_in\\b"), QStringLiteral("\\bdefer\\b"), QStringLiteral("\\bdynamic\\b"),
QStringLiteral("\\bconst\\b"), QStringLiteral("\\bwhere\\b"), QStringLiteral("\\busing\\b"),
QStringLiteral("\\bor_else\\b"), QStringLiteral("\\bor_break\\b"), QStringLiteral("\\bor_continue\\b"),
QStringLiteral("\\bor_return\\b"), QStringLiteral("\\basm\\b"), QStringLiteral("\\bdistinct\\b"),
QStringLiteral("\\bcontext\\b"), QStringLiteral("\\bnil\\b"), QStringLiteral("\\btrue\\b"),
QStringLiteral("\\bfalse\\b"), QStringLiteral("\\bstruct\\b"), QStringLiteral("\\benum\\b"),
QStringLiteral("\\bunion\\b"), QStringLiteral("\\bmap\\b"), QStringLiteral("\\bbit_set\\b"),
QStringLiteral("\\bbit_field\\b"), QStringLiteral("\\bcast\\b"), QStringLiteral("\\btransmute\\b"),
QStringLiteral("\\bauto_cast\\b"), QStringLiteral("\\bwhen\\b"),
// builtin types
QStringLiteral("\\b(i8|i16|i32|i64|i128|int)\\b"),
QStringLiteral("\\b(u8|u16|u32|u64|u128|uint|uintptr)\\b"),
QStringLiteral("\\b(f16|f32|f64|f128)\\b"),
QStringLiteral("\\bf16le|f32le|f64le|f128le\\b"),
QStringLiteral("\\b(f16be|f32be|f64be|f128be)\\b"),
QStringLiteral("\\b(complex32|complex64|complex128)\\b"),
QStringLiteral("\\b(quaternion64|quaternion128|quaternion256)\\b"),
QStringLiteral("\\b(bool|b8|b16|b32|b64)\\b"),
QStringLiteral("\\b(string|cstring|rune)\\b"),
QStringLiteral("\\b(rawptr)\\b"),
QStringLiteral("\\b(any|typeid)\\b"),
QStringLiteral("\\b(byte)\\b"),
QStringLiteral("\\b(u16le|u32le|u64le|u128le|i16le|i32le|i64le|i128le)\\b"),
QStringLiteral("\\b(i16be|i32be|i64be|i128be|u16be|u32be|u64be|u128be)\\b"),
// matches all the #+ and # compiler directives/builtins
QStringLiteral("#([^\\s\\(]+)(\\([^\\)]*\\))?"),
// matches all attributes like @(attribute) with optional parentheses
QStringLiteral("@(\\([^\\)]*\\)|\\w+)"),
};
2025-09-29 15:17:39 -01:00
_highlightingRules.clear(); // Clear old rules.
HighlightingRule rule;
// Set class format and expression.
2025-10-01 21:11:05 -01:00
rule.pattern = QRegularExpression(QStringLiteral("\\b[A-Z][A-Z0-9_]*\\b"));
rule.format = _classFormat;
2025-09-29 15:17:39 -01:00
_highlightingRules.append(rule);
// Set quote format and expression.
rule.pattern = QRegularExpression(QStringLiteral("\".*\""));
rule.format = _quotationFormat;
2025-09-29 15:17:39 -01:00
_highlightingRules.append(rule);
// Set function format and expression.
rule.pattern = QRegularExpression(QStringLiteral("\\b[A-Za-z0-9_]+(?=\\s*\\()"));
rule.format = _functionFormat;
2025-09-29 15:17:39 -01:00
_highlightingRules.append(rule);
// Set keywords format and expression (must have precedence over functions)
2025-09-29 15:17:39 -01:00
for (const QString& pattern : keywordPatterns) {
rule.pattern = QRegularExpression(pattern);
rule.format = _keywordFormat;
_highlightingRules.append(rule);
}
// Set single line comment format and expression.
rule.pattern = QRegularExpression(QStringLiteral("//[^\n]*"));
rule.format = _singleLineCommentFormat;
_highlightingRules.append(rule);
// Set multi-line comment expression. Format is defined later.
_commentStartExpression = QRegularExpression(QStringLiteral("/\\*"));
_commentEndExpression = QRegularExpression(QStringLiteral("\\*/"));
}