]> Some of my projects - anidbudpclient.git/commitdiff
Qt6 port
authorAPTX <redacted>
Wed, 31 Dec 2025 03:34:19 +0000 (12:34 +0900)
committerAPTX <redacted>
Sun, 4 Jan 2026 07:31:00 +0000 (16:31 +0900)
Everything should be ported, except for the ECMAScript rename engine
(always returns empty name). The new QJSEngine is not designed for
scripting like the old one. There is no simple way to register
functions in JS, the concept of "script context" changed.

18 files changed:
AniDBUdpClientConfig.cmake.in
CMakeLists.txt
animecommand.cpp
client.cpp
clientinterface.cpp
episodecommand.cpp
file.cpp
filecommand.cpp
mylistaddcommand.cpp
mylistcommand.cpp
renameparser/AniAdd/lexer.cpp
renameparser/AniAdd/lexer.h
renameparser/ECMAScript/parser.cpp
renameparser/ECMAScript/parser.h
renameparser/ast.h
renameparser/functions.cpp
updatecommand.cpp
votecommand.cpp

index b6fcc7c41105786192e9cad313480076b3464495..793ad7c0c674c8b6486bdb20fa0ac119cf8474f6 100644 (file)
@@ -4,7 +4,9 @@
 include(CMakeFindDependencyMacro)
 
 # TODO find_dependency with components is nonstandard
-find_dependency(Qt5Network)
+find_dependency(Qt6Network)
+find_dependency(Qt6StateMachine)
+find_dependency(Qt6Qml)
 
 include("${CMAKE_CURRENT_LIST_DIR}/@CONFIG_NAME@Targets.cmake")
 
index d7c3dc988116c1bf292e75a1866779a3e37ef05c..d587a5a07342376b6e49e922f65d6d1457ee8682 100644 (file)
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
+cmake_minimum_required(VERSION 4.0 FATAL_ERROR)
 include(FeatureSummary)
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
@@ -15,16 +15,20 @@ add_feature_info(Encryption WITH_ENCRYPTION "ENCRYPT command support (requires Q
 option(WITH_CLIENT_DEBUG "Enable client debug logs" OFF)
 add_feature_info(ClientDebug WITH_CLIENT_DEBUG "Print extra logs for debug purposes")
 
-set(QT_MIN_VERSION "5.8.0")
-find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
+set(QT_MIN_VERSION "6.10.0")
+find_package(Qt6 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
     Core
     Network
-    Script
+    StateMachine
+    # For QJSEngine
+    Qml
 )
 
 set(AniDBUdpClient_PUBLIC_LIBS
-    Qt5::Core
-    Qt5::Network
+    Qt6::Core
+    Qt6::Network
+    Qt6::StateMachine
+    Qt6::Qml
 )
 
 set(AniDBUdpClient_SOURCES
@@ -110,6 +114,9 @@ install(FILES ${AniDBUdpClient_CONV_HEADERS}
 )
 
 if(WITH_RENAMEPARSER)
+    find_package(AucQJSEngineFunction CONFIG REQUIRED)
+    set(AniDBUdpClient_LIBS ${AniDBUdpClient_LIBS} AucQJSEngineFunction::AucQJSEngineFunction)
+
     set(AniDBUdpClient_RENAMEPARSER_HEADERS
         renameparser/renameengine.h
         renameparser/functions.h
@@ -148,11 +155,6 @@ if(WITH_RENAMEPARSER)
         include/RenameParser/RenameEngine
     )
 
-    set(AniDBUdpClient_LIBS
-        ${AniDBUdpClient_LIBS}
-        Qt5::Script
-    )
-
     install(FILES
         ${AniDBUdpClient_RENAMEPARSER_HEADERS}
         ${AniDBUdpClient_RENAMEPARSER_CONV_HEADERS}
@@ -170,7 +172,7 @@ endif()
 
 
 if(WITH_ENCRYPTION)
-    set(QCA_NAME "Qca-qt5")
+    set(QCA_NAME "Qca-qt6")
     find_package(${QCA_NAME} CONFIG REQUIRED)
     if (${QCA_NAME}_FOUND)
         # TODO Runtime plugins are required
index 6d70a9de062063c8aa42d4ccc5bff80bcb22fb55..5243b4ab63113a378a9b6d5547e56356380d5a56 100644 (file)
@@ -124,7 +124,7 @@ void AnimeReply::setRawReply(ReplyCode replyCode, const QString &reply)
 void AnimeReply::readReplyData(const QString &reply)
 {
        QString d = reply.mid(reply.indexOf('\n')).trimmed();
-       QStringList parts = d.split('|', QString::KeepEmptyParts);
+       QStringList parts = d.split('|', Qt::KeepEmptyParts);
 
        if (command().amask() == 0)
        {
@@ -208,7 +208,9 @@ QStringList AnimeReply::characterIdList() const
 
 QDateTime AnimeReply::dateRecordUpdated() const
 {
-       return QDateTime::fromTime_t(animeFlagData.value(AnimeFlag::DateRecordUpdated).toUInt());
+       return QDateTime::fromSecsSinceEpoch(
+               animeFlagData.value(AnimeFlag::DateRecordUpdated).toUInt(),
+               QTimeZone::UTC);
 }
 
 QList<int> AnimeReply::tagWeightList() const
@@ -311,12 +313,14 @@ QUrl AnimeReply::url() const
 
 QDateTime AnimeReply::endDate() const
 {
-       return QDateTime::fromTime_t(animeFlagData.value(AnimeFlag::EndDate).toUInt());
+       return QDateTime::fromSecsSinceEpoch(
+               animeFlagData.value(AnimeFlag::EndDate).toUInt(), QTimeZone::UTC);
 }
 
 QDateTime AnimeReply::airDate() const
 {
-       return QDateTime::fromTime_t(animeFlagData.value(AnimeFlag::AirDate).toUInt());
+       return QDateTime::fromSecsSinceEpoch(
+               animeFlagData.value(AnimeFlag::AirDate).toUInt(), QTimeZone::UTC);
 }
 
 int AnimeReply::specialEpCount() const
index 3eb994d927721de678604028d43b5448d4b75d6e..f33658de8545c47c34d4d2c1f38a40135adc85db 100644 (file)
@@ -5,9 +5,9 @@
 #include <QState>
 
 #include <QCoreApplication>
-#include <QUdpSocket>
+#include <QRegularExpression>
 #include <QTimer>
-#include <QRegExp>
+#include <QUdpSocket>
 
 #include "rawcommand.h"
 #include "logoutcommand.h"
@@ -627,8 +627,9 @@ qDebug() << QString("Received datagram from [%1]:%2\nRaw datagram contents:%3")
 
                // Check if it is a 6xx error.
                {
-                       QRegExp rx("(?:50[34]|555|598|6[0-9]{2}) ");
-                       if (rx.exactMatch(tmp.mid(0, 4)))
+                       static QRegularExpression rx("(?:50[34]|555|598|6[0-9]{2}) ");
+                       auto match = rx.match(tmp.mid(0, 4));
+                       if (match.hasMatch())
                        {
                                int replyCode = tmp.mid(0, 3).toInt();
                                switch (replyCode)
index 2644324f92e55b5f92a2f0db17886b8dc23d796b..a84e270edee92c519fe10ecacf986eadb7cc83bf 100644 (file)
@@ -1,5 +1,8 @@
 #include "clientinterface.h"
 
+#include <QMetaType>
+#include <QRandomGenerator>
+
 namespace AniDBUdpClient {
 
 ClientInterface::ClientInterface(QObject *parent) :
@@ -60,7 +63,7 @@ QByteArray ClientInterface::nextCommandId(int len)
 
        QByteArray result(len, '-');
        while (len--)
-               result[len] = chars[qrand() % numChars];
+               result[len] = chars[QRandomGenerator::global()->bounded(numChars)];
 
 #ifdef ANIDBUDPCLIENT_CLIENT_MISC_DEBUG
 qDebug() << QString("Generated id %1").arg(result.constData());
@@ -73,7 +76,7 @@ QByteArray ClientInterface::buildCmd(const QString &cmd, const QVariantMap &args
        QString result = cmd;
        for (QVariantMap::const_iterator it = args.constBegin(); it != args.constEnd(); ++it)
        {
-               if (!it.value().canConvert(QVariant::String))
+               if (!it.value().canConvert<QString>())
                {
                        qWarning("Passed value cannot be converted to string!");
                        continue;
@@ -81,7 +84,7 @@ QByteArray ClientInterface::buildCmd(const QString &cmd, const QVariantMap &args
 
                // The string version of bool is "true" or "false", but the API expects 1 or 0
                QString value;
-               if (it.value().type() == QVariant::Bool)
+               if (it.value().typeId() == QMetaType::Bool)
                {
                        value = it.value().toBool() ? "1" : "0";
                }
index 17561f284568d120669b89307cb4fc32008cba71..0a1c2cd166687e2db5f8e9418ebec599495ba1e0 100644 (file)
@@ -183,7 +183,8 @@ void EpisodeReply::setRawReply(ReplyCode replyCode, const QString &reply)
        {
                case EPISODE:
                {
-                       QStringList parts = reply.mid(reply.indexOf("\n")).split('|', QString::KeepEmptyParts);
+                       QStringList parts =
+                               reply.mid(reply.indexOf("\n")).split('|', Qt::KeepEmptyParts);
                        if (parts.count() < 10)
                        {
                                signalReplyReady(false);
@@ -215,7 +216,8 @@ void EpisodeReply::setRawReply(ReplyCode replyCode, const QString &reply)
                        m_titleEnglish = parts[6];
                        m_titleRomaji = parts[7];
                        m_titleKanji = parts[8];
-                       m_airDate = QDateTime::fromTime_t(parts[9].toUInt(&ok, 10));
+                       m_airDate = QDateTime::fromSecsSinceEpoch(parts[9].toUInt(&ok, 10),
+                                                                                                         QTimeZone::UTC);
                        if (parts.size() > 11)
                        {
                                m_typeAsInt = parts[10].toInt(&ok, 10);
index 5a1c0965f058f67d72aef4bd9cfa03c9f786df63..3ce363576666638ed0556e37e9d67f92a522ab85 100644 (file)
--- a/file.cpp
+++ b/file.cpp
@@ -1,6 +1,6 @@
 #include "file.h"
 
-#include <QRegExp>
+#include <QRegularExpression>
 #include "client.h"
 #include "hash.h"
 #include "filerenamedelegate.h"
@@ -205,17 +205,20 @@ MyListState File::state() const
 
 File *File::fromEd2k(const QString &ed2k)
 {
-       QRegExp rx("^ed2k://\\|file\\|[^|]+\\|([0-9]+)\\|([a-z0-9]{32})\\|", Qt::CaseInsensitive, QRegExp::RegExp2);
+       static QRegularExpression rx(
+               "^ed2k://\\|file\\|[^|]+\\|([0-9]+)\\|([a-z0-9]{32})\\|",
+               QRegularExpression::CaseInsensitiveOption);
 
-       if (rx.indexIn(ed2k) == -1)
+       auto match = rx.match(ed2k);
+       if (!match.hasMatch())
                return 0;
 
        bool ok = false;
-       qint64 size = rx.cap(1).toLongLong(&ok);
+       qint64 size = match.captured(1).toLongLong(&ok);
        if (!ok)
                return 0;
 
-       QByteArray hash = rx.cap(2).toLower().toLatin1();
+       QByteArray hash = match.captured(2).toLower().toLatin1();
 
        File *ret = new File();
        ret->m_size = size;
@@ -297,8 +300,10 @@ qDebug() << "lid = " << m_lid;
                                           .arg(fileReply->value(FileFlag::FileType).toString());
        }
        newFileName.replace('"', "'");
-       newFileName.replace(QRegExp("[\\/]"), "-");
-       newFileName.replace(QRegExp("[\\/:*?\"<>|]"), "");
+       static QRegularExpression rx1("[\\/]");
+       newFileName.replace(rx1, "-");
+       static QRegularExpression rx2("[\\/:*?\"<>|]");
+       newFileName.replace(rx2, "");
 #ifdef ANIDBUDPCLIENT_RENAME_DEBUG
 qDebug() << "New file name:" << newFileName;
 #endif
index 177f12aab7cd6fc59af70c38046b70c5541b5580..d50670d997ecefe84de8692349c77e1ea7e17668 100644 (file)
@@ -302,7 +302,7 @@ void FileReply::setRawReply(ReplyCode replyCode, const QString &reply)
 void FileReply::readReplyData(const QString &reply)
 {
        QString d = reply.mid(reply.indexOf('\n')).trimmed();
-       QList<QString> parts = d.split('|', QString::KeepEmptyParts);
+       QList<QString> parts = d.split('|', Qt::KeepEmptyParts);
        m_fid = parts[0].toInt();
 
        if (command().fmask() == 0 && command().amask() == 0)
@@ -356,7 +356,9 @@ void FileReply::init()
 
 QDateTime FileReply::dateAidRecordUpdated() const
 {
-       return QDateTime::fromTime_t(fileAnimeFlagData.value(FileAnimeFlag::DateAidRecordUpdated).toUInt());
+       return QDateTime::fromSecsSinceEpoch(
+               fileAnimeFlagData.value(FileAnimeFlag::DateAidRecordUpdated).toUInt(),
+               QTimeZone::UTC);
 }
 
 QString FileReply::groupShortName() const
@@ -489,7 +491,7 @@ QDateTime FileReply::myListViewDate() const
        bool ok;
        uint timestamp = fileFlagData.value(FileFlag::MyListViewDate).toUInt(&ok);
        if (ok && timestamp)
-               return QDateTime::fromTime_t(timestamp);
+               return QDateTime::fromSecsSinceEpoch(timestamp, QTimeZone::UTC);
        return QDateTime();
 }
 
index 56e50e71ad507af18aef11b1f4fb9c2599068528..09756fa128e91d58d8c871d2316883639f278e5f 100644 (file)
@@ -209,7 +209,7 @@ Command MyListAddCommand::rawCommand() const
 
        if (!m_viewDate.isNull())
        {
-               cmd.second["viewdate"] = m_viewDate.toTime_t();
+               cmd.second["viewdate"] = m_viewDate.toSecsSinceEpoch();
        }
 
        if (!m_source.isEmpty())
index 72bcf5b2e3bf60b46a70c4535e7622e5e26b5c32..b7f8a03bae36ce34de53ae61c77ecef694017a8f 100644 (file)
@@ -307,7 +307,7 @@ void MyListReply::setRawReply(ReplyCode replyCode, const QString &reply)
        {
                case MYLIST:
                {
-                       QStringList parts = reply.mid(reply.indexOf("\n")).split('|', QString::KeepEmptyParts);
+                       QStringList parts = reply.mid(reply.indexOf("\n")).split('|', Qt::KeepEmptyParts);
                        if (parts.count() < 12)
                        {
                                signalReplyReady(false);
@@ -319,9 +319,11 @@ void MyListReply::setRawReply(ReplyCode replyCode, const QString &reply)
                        m_eid = parts[2].toInt(&ok, 10);
                        m_aid = parts[3].toInt(&ok, 10);
                        m_gid = parts[4].toInt(&ok, 10);
-                       m_date = QDateTime::fromTime_t(parts[5].toUInt(&ok, 10));
+                       m_date = QDateTime::fromSecsSinceEpoch(parts[5].toUInt(&ok, 10),
+                                                                                                  QTimeZone::UTC);
                        m_state = State(parts[6].toInt(&ok, 10));
-                       m_viewDate = QDateTime::fromTime_t(parts[7].toUInt(&ok, 10));
+                       m_viewDate = QDateTime::fromSecsSinceEpoch(parts[7].toUInt(&ok, 10),
+                                                                                                          QTimeZone::UTC);
                        m_storage = parts[8];
                        m_source = parts[9];
                        m_other = parts[10];
@@ -331,7 +333,7 @@ void MyListReply::setRawReply(ReplyCode replyCode, const QString &reply)
                break;
                case MULTIPLE_MYLIST_ENTRIES:
                {
-                       m_multipleEntries = reply.mid(reply.indexOf("\n")).split('|', QString::KeepEmptyParts);
+                       m_multipleEntries = reply.mid(reply.indexOf("\n")).split('|', Qt::KeepEmptyParts);
                        signalReplyReady(true);
                }
                break;
index ca6c1cd1d74c833595819983e346c12a65766b72..b3606ab2f6c1e8b8bc13577363704d38a1c956ee 100644 (file)
@@ -28,21 +28,24 @@ void Lexer::lex(const QString &s)
 
 bool Lexer::next()
 {
-       m_pos = rx.indexIn(m_data, m_pos);
+       m_last_match = rx.match(m_data, m_pos);
+       m_pos = m_last_match.capturedStart();
 
-       if (m_pos == -1)
+       if (!m_last_match.hasMatch())
        {
                m_type = 0;
                return false;
        }
 #ifdef PARSER_DEBUG
-QString m = rx.cap();
-qDebug() << "TOKEN=" << m;
+       QString m = rx.cap();
+       qDebug() << "TOKEN=" << m;
 #endif
-       m_pos += rx.matchedLength();
-       m_column += rx.matchedLength();
+       m_pos += m_last_match.capturedLength();
+       m_column += m_last_match.capturedLength();
 
-       if (rx.cap() == "\n" || rx.cap()[0] == QChar('#') || rx.cap().left(2) == "//")
+       if (m_last_match.captured() == "\n" ||
+               m_last_match.captured()[0] == QChar('#') ||
+               m_last_match.captured().left(2) == "//")
        {
                ++m_line;
                m_column = 1;
@@ -50,18 +53,19 @@ qDebug() << "TOKEN=" << m;
                return true;
        }
 
-       if (tokenMap.contains(rx.cap()))
+       if (tokenMap.contains(m_last_match.captured()))
        {
-               m_type = tokenMap.value(rx.cap());
+               m_type = tokenMap.value(m_last_match.captured());
        }
-       else if (rx.cap()[0] == QChar('"') || rx.cap()[0] == QChar('\''))
+       else if (m_last_match.captured()[0] == QChar('"') ||
+                        m_last_match.captured()[0] == QChar('\''))
        {
                m_type = RenameGrammar::STRING;
        }
        else
        {
                bool ok;
-               rx.cap().toDouble(&ok);
+               m_last_match.captured().toDouble(&ok);
 
                if (ok)
                        m_type = RenameGrammar::NUMBER;
@@ -74,8 +78,9 @@ qDebug() << "TOKEN=" << m;
 QString Lexer::value() const
 {
        if (m_type == RenameGrammar::STRING)
-               return rx.cap().mid(1, rx.cap().length() - 2);
-       return rx.cap();
+               return m_last_match.captured().mid(1, m_last_match.captured().length() -
+                                                                                                 2);
+       return m_last_match.captured();
 }
 
 int Lexer::type() const
@@ -128,7 +133,7 @@ void Lexer::staticInit()
 
 const char *Lexer::regexp = ":=|=|%|\\?|:|\\$|,|\\(|\\)|\\[|\\]|\\{|\\}|\\n|else|if|(:?//|#)[^\\n]*\\n|[^\"\\[\\]:= {}(),%$?\\n]+|\"[^\"]*\"|'[^']*'";
 
-QRegExp Lexer::rx(Lexer::regexp);
+QRegularExpression Lexer::rx(Lexer::regexp);
 QMap<QString, int> Lexer::tokenMap;
 bool Lexer::staticInitialised = false;
 
index cdc44bd30314e43e70f37a21aeb600ffd4d340c7..9afeaf00bf3421224933ab4918c74ebf371920e9 100644 (file)
@@ -2,7 +2,8 @@
 #define LEXER_H
 
 #include <QMap>
-#include <QRegExp>
+#include <QRegularExpression>
+#include <QRegularExpressionMatch>
 
 #include "renameparser.h"
 
@@ -41,7 +42,8 @@ private:
        int m_column;
 
        int m_pos;
-       static QRegExp rx;
+       QRegularExpressionMatch m_last_match;
+       static QRegularExpression rx;
        static const char *regexp;
 
        static QMap<QString, int> tokenMap;
index 117772e17cfe3ad3391d967aecf3ac9526e1d00d..d6d1f82174348749cf56e93e5e7b7dc10c533370 100644 (file)
@@ -1,21 +1,22 @@
 #include "parser.h"
 
-#include <QScriptValueIterator>
+#include "../renameengine.h"
+#include <AucQJSEngineFunction/aucqjsenginefunction.h>
 
-namespace RenameParser {
-namespace ECMAScript {
+#include <QJSValueIterator>
+#include <utility>
 
-QScriptValue RenameEngine2QtScriptHelper(QScriptContext *context, QScriptEngine *engine, void *arg)
+namespace RenameParser {
+namespace ECMAScript
 {
-       Q_UNUSED(engine);
-
-       RenameFunction func = (RenameFunction) arg;
-
-       QStringList args;
-       for (int i = 0; i < context->argumentCount(); ++i)
-               args << context->argument(i).toString();
+QJSValue RenameEngineFunctionWrapperHelper(RenameParser::RenameFunction func,
+                                                                                  const QJSValueList &args)
+{
+       QStringList strArgs;
+       for (const auto &arg : args)
+               strArgs << arg.toString();
 
-       return QScriptValue(func(args));
+       return QJSValue{func(strArgs)};
 }
 
 Parser::Parser() : AbstractParser()
@@ -33,51 +34,47 @@ bool Parser::parse(const QString &string)
        m_line = 0;
        m_column = 0;
 
-       QScriptSyntaxCheckResult checkResult = engine.checkSyntax(string);
+       QJSEngine engine;
 
-       if (checkResult.state() == QScriptSyntaxCheckResult::Valid)
-       {
-               program = string;
-               return true;
-       }
-       m_error = checkResult.errorMessage();
-       m_line = checkResult.errorLineNumber();
-       m_column = checkResult.errorColumnNumber();
+       QJSValue result = engine.evaluate(string, QStringLiteral("<input>"), 1);
 
-       return false;
+       if (result.isError()) {
+               m_line = result.property("lineNumber").toInt();
+               m_column = 0;
+               m_error =
+                       QStringLiteral("%1 at line %2").arg(result.toString()).arg(m_line);
+               return false;
+       }
+       program = string;
+       return true;
 }
 
 QString Parser::evaluate(Environment &env) const
 {
-       QScriptContext *fct = engine.pushContext();
-
-       foreach (const QString &funcName, RenameEngine::registeredFunctions())
+       QJSEngine engine;
+       const auto functionList = RenameEngine::registeredFunctions();
+       for (const QString &funcName : std::as_const(functionList))
        {
-               fct->activationObject().setProperty(funcName,
-                       engine.newFunction(
-                                        &RenameEngine2QtScriptHelper, (void *) RenameEngine::function(funcName)));
+               RenameFunction func = RenameEngine::function(funcName);
+               AucQJSEngineFunction::registerFunction(
+                       engine, funcName, [func](const QJSValueList &args) -> QJSValue
+                       { return RenameEngineFunctionWrapperHelper(func, args); });
        }
-
-       QScriptContext *ct = engine.pushContext();
-
-       for (Environment::const_iterator i = env.constBegin(); i != env.constEnd(); ++i)
+       for (auto it = env.constBegin(); it != env.constEnd(); ++it)
        {
-               ct->activationObject().setProperty(i.key(), i.value());
+               engine.globalObject().setProperty(it.key(), it.value());
        }
 
        QString ret = engine.evaluate(program).toString();
 
-       QScriptValueIterator it(ct->activationObject());
-
+       QJSValueIterator it(engine.globalObject());
        while (it.hasNext())
        {
                it.next();
+               if (!env.contains(it.name()))
+                       continue;
                env[it.name()] = it.value().toString();
        }
-
-       engine.popContext();
-       engine.popContext();
-
        return ret;
 }
 
@@ -96,4 +93,5 @@ int Parser::column() const
        return m_column;
 }
 
-}} // namespace
+} // namespace ECMAScript
+} // namespace RenameParser
index 10d058046a3038fbc56a97558423e194c7f825ff..9afd3c9fb8e7ad6f0710a4be56008b87f102e44f 100644 (file)
@@ -1,10 +1,8 @@
 #ifndef ECMASCRIPTPARSER_H
 #define ECMASCRIPTPARSER_H
 
-#include <QScriptEngine>
-#include <QScriptSyntaxCheckResult>
 #include "../abstractparser.h"
-#include "../renameengine.h"
+#include <QJSEngine>
 
 namespace RenameParser {
 namespace ECMAScript {
@@ -23,13 +21,13 @@ public:
        int column() const;
 
 private:
-       mutable QScriptEngine engine;
-       QScriptProgram program;
+       QString program;
        QString m_error;
        int m_line;
        int m_column;
 };
 
-}} // namespace
+} // namespace ECMAScript
+} // namespace RenameParser
 
 #endif // ECMASCRIPTPARSER_H
index 38c67fcb5bcca6c299a876bf16209e01a3ae21e6..346a7f22d640ef278b01d3891323a00b5228660a 100644 (file)
@@ -1,8 +1,9 @@
 #ifndef AST_H
 #define AST_H
 
-#include <QString>
+#include <QList>
 #include <QSharedPointer>
+#include <QString>
 
 namespace RenameParser {
 namespace AST
index 3590cff1f7bff7eb86dd4f7884d93b8f3990add0..0185e8f8ffa3c9c27397a0383c909f1b4e5d52b6 100644 (file)
@@ -1,5 +1,7 @@
 #include "functions.h"
 
+#include <QRegularExpression>
+
 namespace RenameParser {
 namespace RenameFunctions {
 
@@ -86,14 +88,21 @@ QString repl(const QStringList &args)
        if (args.count() != 3)
                return "";
        QString ret = args[0];
-       return ret.replace(QRegExp(args[1], Qt::CaseSensitive, QRegExp::RegExp2), args[2]);
+       return ret.replace(
+               QRegularExpression(args[1], QRegularExpression::CaseInsensitiveOption),
+               args[2]);
 }
 
 QString match(const QStringList &args)
 {
        if (args.count() != 2)
                return "";
-       return QRegExp(args[1], Qt::CaseSensitive, QRegExp::RegExp2).indexIn(args[0]) != -1 ? "1" : "";
+       return QRegularExpression(args[1],
+                                                         QRegularExpression::CaseInsensitiveOption)
+                                  .match(args[0])
+                                  .hasMatch()
+                          ? "1"
+                          : "";
 }
 
 QString uc(const QStringList &args)
@@ -199,7 +208,8 @@ QString sanitize(const QStringList &args)
 {
        if (args.isEmpty())
                return "";
-       return QString(args.at(0)).replace(QRegExp("[/\\:*\"?<>|\\r\\n]"), QString(""));
+       static QRegularExpression rx("[/\\:*\"?<>|\\r\\n]");
+       return QString(args.at(0)).replace(rx, QString(""));
 }
 
 } // namespace RenameFunctions
index 618eff20fda2dd93eb806ca6d0b3c9397d409f42..33d58d18471b86999f90535ddb31019f83ca28c8 100644 (file)
@@ -97,7 +97,7 @@ void UpdateReply::setRawReply(ReplyCode replyCode, const QString &reply)
                case UPDATED:
                {
                        QString d = reply.mid(reply.indexOf('\n')).trimmed();
-                       QStringList parts = d.split('|', QString::KeepEmptyParts);
+                       QStringList parts = d.split('|', Qt::KeepEmptyParts);
 
                        if (parts.count() < 4)
                        {
index ae2fbb1b28a75c8112d03ca5fe3d5bdc6da1dbc3..3b55c32fa1594a61f1b3cda303240eddd40c61e0 100644 (file)
@@ -235,7 +235,7 @@ void VoteReply::setRawReply(ReplyCode replyCode, const QString &reply)
 bool VoteReply::readReplyData(const QString &reply)
 {
        QString d = reply.mid(reply.indexOf('\n')).trimmed();
-       QStringList parts = d.split('|', QString::KeepEmptyParts);
+       QStringList parts = d.split('|', Qt::KeepEmptyParts);
 
        if (parts.count() < 4)
        {