diff --git a/src/backends/python/pythonhighlighter.cpp b/src/backends/python/pythonhighlighter.cpp index 24fe9521..42cb87d6 100644 --- a/src/backends/python/pythonhighlighter.cpp +++ b/src/backends/python/pythonhighlighter.cpp @@ -1,139 +1,136 @@ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --- Copyright (C) 2013 Filipe Saraiva */ #include "pythonhighlighter.h" #include "pythonkeywords.h" #include "pythonsession.h" #include #include PythonHighlighter::PythonHighlighter(QObject* parent, PythonSession* session) : Cantor::DefaultHighlighter(parent, session) { qDebug() << "PythonHighlighter constructor"; addRule(QRegularExpression(QStringLiteral("\\b\\w+(?=\\()")), functionFormat()); //Code highlighting the different keywords addKeywords(PythonKeywords::instance()->keywords()); addFunctions(PythonKeywords::instance()->functions()); addVariables(PythonKeywords::instance()->variables()); } void PythonHighlighter::highlightBlock(const QString &text) { if (skipHighlighting(text)) { return; } // Do some backend independent highlighting (brackets etc.) DefaultHighlighter::highlightBlock(text); const int IN_MULTILINE_COMMENT = 1; const int IN_SMALL_QUOTE_STRING = 2; const int IN_SINGLE_QUOTE_STRING = 4; const int IN_TRIPLE_QUOTE_STRING = 8; - QRegExp multiLineCommentStartEnd(QLatin1String("'''")); - QRegExp smallQuoteStartEnd(QLatin1String("'")); - QRegExp singleQuoteStringStartEnd(QLatin1String("\"")); - QRegExp tripleQuoteStringStartEnd(QLatin1String("\"\"\"")); - QRegExp singleLineCommentStart(QLatin1String("#")); + static const QRegularExpression multiLineCommentStartEnd(QStringLiteral("'''")); + static const QRegularExpression smallQuoteStartEnd(QStringLiteral("'")); + static const QRegularExpression singleQuoteStringStartEnd(QStringLiteral("\"")); + static const QRegularExpression tripleQuoteStringStartEnd(QStringLiteral("\"\"\"")); + static const QRegularExpression singleLineCommentStart(QStringLiteral("#")); int state = previousBlockState(); if (state == -1) { state = 0; } QList flags = { IN_TRIPLE_QUOTE_STRING, IN_SINGLE_QUOTE_STRING, IN_SMALL_QUOTE_STRING, IN_MULTILINE_COMMENT }; - QList regexps = { + const QVector regexps = { tripleQuoteStringStartEnd, singleQuoteStringStartEnd, smallQuoteStartEnd, multiLineCommentStartEnd }; QList formats = { stringFormat(), stringFormat(), stringFormat(), commentFormat() }; int pos = 0; while (pos < text.length()) { // Trying to close current environments bool triggered = false; for (int i = 0; i < flags.size() && !triggered; i++) { int flag = flags[i]; - QRegExp ®exp = regexps[i]; QTextCharFormat &format = formats[i]; if (state & flag) { - int new_pos = regexp.indexIn(text, pos); + const QRegularExpressionMatch match = regexps.at(i).match(text, pos); int length; - if (new_pos == -1) { + if (!match.hasMatch()) { length = text.length() - pos; - } else { - length = new_pos - pos + regexp.matchedLength(); + } else { // found a match + length = match.capturedStart(0) - pos + match.capturedLength(0); state -= flag; } setFormat(pos, length, format); pos = pos + length; triggered = true; } } if (triggered) { continue; } - QRegExp *minRegexp = nullptr; + QRegularExpressionMatch minMatch; int minPos = INT_MAX; int minIdx = -1; for (int i = 0; i < regexps.size(); i++) { - QRegExp ®exp = regexps[i]; - int newPos = regexp.indexIn(text, pos); - if (newPos != -1) { - minPos = qMin(minPos, newPos); - minRegexp = ®exp; + const QRegularExpressionMatch match = regexps.at(i).match(text, pos); + if (match.hasMatch()) { + minPos = qMin(minPos, match.capturedStart(0)); minIdx = i; + minMatch = match; } } - int singleLineCommentStartPos = - singleLineCommentStart.indexIn(text, pos); + const int singleLineCommentStartPos = text.indexOf(singleLineCommentStart, pos); if (singleLineCommentStartPos != -1 && singleLineCommentStartPos < minPos) { setFormat(singleLineCommentStartPos, text.length() - singleLineCommentStartPos, commentFormat()); break; - } else if (minRegexp) { + } else if (minMatch.hasMatch()) { state += flags[minIdx]; - pos = minPos + minRegexp->matchedLength(); - setFormat(minPos, minRegexp->matchedLength(), formats[minIdx]); + pos = minPos + minMatch.capturedLength(0); + setFormat(minPos, minMatch.capturedLength(0), formats[minIdx]); } else { break; } } setCurrentBlockState(state); } diff --git a/src/backends/python/pythonhighlighter.h b/src/backends/python/pythonhighlighter.h index 9bb1804d..6907bc99 100644 --- a/src/backends/python/pythonhighlighter.h +++ b/src/backends/python/pythonhighlighter.h @@ -1,43 +1,45 @@ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --- Copyright (C) 2013 Filipe Saraiva */ #ifndef _PYTHONHIGHLIGHTER_H #define _PYTHONHIGHLIGHTER_H +#include + #include "defaulthighlighter.h" class PythonSession; class PythonHighlighter : public Cantor::DefaultHighlighter { Q_OBJECT public: explicit PythonHighlighter(QObject* parent, PythonSession* session); ~PythonHighlighter() override = default; protected: void highlightBlock(const QString& text) override; private: - QRegExp commentStartExpression; - QRegExp commentEndExpression; + QRegularExpression commentStartExpression; + QRegularExpression commentEndExpression; }; #endif /* _PYTHONHIGHLIGHTER_H */