2017-02-07 21:39:45 +01:00
|
|
|
|
#include "SqlSyntaxHighlighter.h"
|
|
|
|
|
|
|
2017-08-23 13:27:23 +02:00
|
|
|
|
#include "PgTypeContainer.h"
|
2017-02-11 08:03:10 +01:00
|
|
|
|
#include "SqlLexer.h"
|
2017-02-07 21:39:45 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SqlSyntaxHighlighter::SqlSyntaxHighlighter(QTextDocument *parent)
|
|
|
|
|
|
: QSyntaxHighlighter(parent)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_keywordFormat.setForeground(QColor(32, 32, 192));
|
|
|
|
|
|
m_keywordFormat.setFontWeight(QFont::Bold);
|
|
|
|
|
|
|
2017-02-09 21:54:31 +01:00
|
|
|
|
m_commentFormat.setForeground(QColor(128, 128, 128));
|
|
|
|
|
|
|
2017-02-07 21:39:45 +01:00
|
|
|
|
m_quotedStringFormat.setForeground(QColor(192, 32, 192));
|
|
|
|
|
|
|
2017-02-09 21:54:31 +01:00
|
|
|
|
m_quotedIdentifierFormat.setForeground(QColor(192, 128, 32));
|
|
|
|
|
|
|
2017-02-07 21:39:45 +01:00
|
|
|
|
m_typeFormat.setForeground(QColor(32, 192, 32));
|
|
|
|
|
|
m_typeFormat.setFontWeight(QFont::Bold);
|
2017-09-10 10:13:58 +02:00
|
|
|
|
|
|
|
|
|
|
m_parameterFormat.setForeground(QColor(192, 32, 32));
|
|
|
|
|
|
m_parameterFormat.setFontWeight(QFont::Bold);
|
2017-02-07 21:39:45 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SqlSyntaxHighlighter::~SqlSyntaxHighlighter()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-12-09 20:21:22 +01:00
|
|
|
|
void SqlSyntaxHighlighter::setTypes(const PgTypeContainer& types)
|
2017-02-07 21:39:45 +01:00
|
|
|
|
{
|
|
|
|
|
|
m_typeNames.clear();
|
2018-10-07 19:40:06 +02:00
|
|
|
|
for (auto&& e : types) {
|
2018-12-16 09:24:27 +01:00
|
|
|
|
m_typeNames.insert(e.objectName());
|
2017-02-07 21:39:45 +01:00
|
|
|
|
}
|
2018-10-07 19:40:06 +02:00
|
|
|
|
rehighlight();
|
2017-02-07 21:39:45 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SqlSyntaxHighlighter::highlightBlock(const QString &text)
|
|
|
|
|
|
{
|
2017-02-26 19:29:50 +01:00
|
|
|
|
int previous_state = previousBlockState();
|
|
|
|
|
|
if (previous_state <= 0)
|
|
|
|
|
|
previous_state = 0;
|
|
|
|
|
|
SqlLexer lexer(text, (LexerState)previous_state);
|
2017-02-07 21:39:45 +01:00
|
|
|
|
int startpos, length;
|
|
|
|
|
|
BasicTokenType tokentype;
|
|
|
|
|
|
QString s;
|
|
|
|
|
|
while (lexer.nextBasicToken(startpos, length, tokentype, s)) {
|
|
|
|
|
|
switch (tokentype) {
|
|
|
|
|
|
case BasicTokenType::None:
|
|
|
|
|
|
case BasicTokenType::End: // End of input
|
2017-09-10 10:13:58 +02:00
|
|
|
|
case BasicTokenType::DollarQuote:
|
2017-02-07 21:39:45 +01:00
|
|
|
|
break;
|
2018-01-06 21:22:22 +01:00
|
|
|
|
case BasicTokenType::Symbol: { // can be many things, keyword, object name, operator, ..
|
|
|
|
|
|
auto kw = getPgsqlKeyword(s);
|
|
|
|
|
|
if (kw != nullptr) {
|
|
|
|
|
|
setFormat(startpos, length, m_keywordFormat);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (m_typeNames.count(s.toLower()) > 0) {
|
|
|
|
|
|
setFormat(startpos, length, m_typeFormat);
|
|
|
|
|
|
}
|
2017-02-07 21:39:45 +01:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2017-02-26 19:29:50 +01:00
|
|
|
|
case BasicTokenType::OpenBlockComment:
|
|
|
|
|
|
setCurrentBlockState((int)lexer.currentState());
|
|
|
|
|
|
case BasicTokenType::BlockComment:
|
2017-02-07 21:39:45 +01:00
|
|
|
|
case BasicTokenType::Comment:
|
|
|
|
|
|
setFormat(startpos, length, m_commentFormat);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case BasicTokenType::QuotedString:
|
|
|
|
|
|
setFormat(startpos, length, m_quotedStringFormat);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case BasicTokenType::QuotedIdentifier:
|
2017-02-09 21:54:31 +01:00
|
|
|
|
setFormat(startpos, length, m_quotedIdentifierFormat);
|
2017-02-07 21:39:45 +01:00
|
|
|
|
break;
|
2017-09-10 10:13:58 +02:00
|
|
|
|
case BasicTokenType::Parameter:
|
|
|
|
|
|
setFormat(startpos, length, m_parameterFormat);
|
|
|
|
|
|
break;
|
2017-02-07 21:39:45 +01:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|