From 4e2d9619fe228e11ac01e7faa35e7f23b737ad18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lucie=20G=C3=A9rard?= <lucie.gerard@qt.io>
Date: Wed, 7 Aug 2019 15:09:53 +0200
Subject: [PATCH] Refactor lupdate

No new code added
Moving around some functions to make them available outside main.
Preparing for clang cpp parser

Change-Id: Iec04cc30629d43aaec870f893df5bc43a0864877
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
---
 src/linguist/lupdate/cpp.cpp          | 104 +--------------------
 src/linguist/lupdate/cpp.h            | 129 ++++++++++++++++++++++++++
 src/linguist/lupdate/java.cpp         |   4 -
 src/linguist/lupdate/lupdate.h        |  14 ++-
 src/linguist/lupdate/lupdate.pro      |   1 +
 src/linguist/lupdate/main.cpp         |   4 -
 src/linguist/lupdate/merge.cpp        |   4 -
 src/linguist/lupdate/qdeclarative.cpp |   4 -
 src/linguist/lupdate/ui.cpp           |   4 -
 9 files changed, 141 insertions(+), 127 deletions(-)
 create mode 100644 src/linguist/lupdate/cpp.h

diff --git a/src/linguist/lupdate/cpp.cpp b/src/linguist/lupdate/cpp.cpp
index eb0549cee..9fe4ed710 100644
--- a/src/linguist/lupdate/cpp.cpp
+++ b/src/linguist/lupdate/cpp.cpp
@@ -26,29 +26,16 @@
 **
 ****************************************************************************/
 
-#include "lupdate.h"
+#include "cpp.h"
 
 #include <translator.h>
-
 #include <QtCore/QBitArray>
-#include <QtCore/QDebug>
-#include <QtCore/QFileInfo>
-#include <QtCore/QRegExp>
 #include <QtCore/QStack>
-#include <QtCore/QString>
 #include <QtCore/QTextCodec>
 #include <QtCore/QTextStream>
-#include <QtCore/QCoreApplication>
-
-#include <iostream>
-
-#include <ctype.h>              // for isXXX()
 
 QT_BEGIN_NAMESPACE
 
-class LU {
-    Q_DECLARE_TR_FUNCTIONS(LUpdate)
-};
 
 /* qmake ignore Q_OBJECT */
 
@@ -58,18 +45,6 @@ static QString MagicComment(QLatin1String("TRANSLATOR"));
 
 //#define DIAGNOSE_RETRANSLATABILITY // FIXME: should make a runtime option of this
 
-class HashString {
-public:
-    HashString() : m_hash(0x80000000) {}
-    explicit HashString(const QString &str) : m_str(str), m_hash(0x80000000) {}
-    void setValue(const QString &str) { m_str = str; m_hash = 0x80000000; }
-    const QString &value() const { return m_str; }
-    bool operator==(const HashString &other) const { return m_str == other.m_str; }
-private:
-    QString m_str;
-    mutable uint m_hash; // We use the highest bit as a validity indicator (set => invalid)
-    friend uint qHash(const HashString &str);
-};
 
 uint qHash(const HashString &str)
 {
@@ -78,16 +53,6 @@ uint qHash(const HashString &str)
     return str.m_hash;
 }
 
-class HashStringList {
-public:
-    explicit HashStringList(const QList<HashString> &list) : m_list(list), m_hash(0x80000000) {}
-    const QList<HashString> &value() const { return m_list; }
-    bool operator==(const HashStringList &other) const { return m_list == other.m_list; }
-private:
-    QList<HashString> m_list;
-    mutable uint m_hash; // We use the highest bit as a validity indicator (set => invalid)
-    friend uint qHash(const HashStringList &list);
-};
 
 uint qHash(const HashStringList &list)
 {
@@ -102,42 +67,6 @@ uint qHash(const HashStringList &list)
     return list.m_hash;
 }
 
-typedef QList<HashString> NamespaceList;
-
-struct Namespace {
-
-    Namespace() :
-            classDef(this),
-            hasTrFunctions(false), complained(false)
-    {}
-    ~Namespace()
-    {
-        qDeleteAll(children);
-    }
-
-    QHash<HashString, Namespace *> children;
-    QHash<HashString, NamespaceList> aliases;
-    QList<HashStringList> usings;
-
-    // Class declarations set no flags and create no namespaces, so they are ignored.
-    // Class definitions may appear multiple times - but only because we are trying to
-    // "compile" all sources irrespective of build configuration.
-    // Nested classes may be forward-declared inside a definition, and defined in another file.
-    // The latter will detach the class' child list, so clones need a backlink to the original
-    // definition (either one in case of multiple definitions).
-    // Namespaces can have tr() functions as well, so we need to track parent definitions for
-    // them as well. The complication is that we may have to deal with a forrest instead of
-    // a tree - in that case the parent will be arbitrary. However, it seem likely that
-    // Q_DECLARE_TR_FUNCTIONS would be used either in "class-like" namespaces with a central
-    // header or only locally in a file.
-    Namespace *classDef;
-
-    QString trQualification;
-
-    bool hasTrFunctions;
-    bool complained; // ... that tr functions are missing.
-};
-
 static int nextFileId;
 
 class VisitRecorder {
@@ -157,37 +86,6 @@ private:
     QBitArray m_ba;
 };
 
-struct ParseResults {
-    int fileId;
-    Namespace rootNamespace;
-    QSet<const ParseResults *> includes;
-};
-
-struct IncludeCycle {
-    QSet<QString> fileNames;
-    QSet<const ParseResults *> results;
-};
-
-typedef QHash<QString, IncludeCycle *> IncludeCycleHash;
-typedef QHash<QString, const Translator *> TranslatorHash;
-
-class CppFiles {
-
-public:
-    static QSet<const ParseResults *> getResults(const QString &cleanFile);
-    static void setResults(const QString &cleanFile, const ParseResults *results);
-    static const Translator *getTranslator(const QString &cleanFile);
-    static void setTranslator(const QString &cleanFile, const Translator *results);
-    static bool isBlacklisted(const QString &cleanFile);
-    static void setBlacklisted(const QString &cleanFile);
-    static void addIncludeCycle(const QSet<QString> &fileNames);
-
-private:
-    static IncludeCycleHash &includeCycles();
-    static TranslatorHash &translatedFiles();
-    static QSet<QString> &blacklistedFiles();
-};
-
 class CppParser {
 
 public:
diff --git a/src/linguist/lupdate/cpp.h b/src/linguist/lupdate/cpp.h
new file mode 100644
index 000000000..d12c5e924
--- /dev/null
+++ b/src/linguist/lupdate/cpp.h
@@ -0,0 +1,129 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Linguist of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CPP_H
+#define CPP_H
+
+#include "lupdate.h"
+
+#include <QtCore/QSet>
+
+#include <iostream>
+
+QT_BEGIN_NAMESPACE
+
+struct HashString {
+    HashString() : m_hash(0x80000000) {}
+    explicit HashString(const QString &str) : m_str(str), m_hash(0x80000000) {}
+    void setValue(const QString &str) { m_str = str; m_hash = 0x80000000; }
+    const QString &value() const { return m_str; }
+    bool operator==(const HashString &other) const { return m_str == other.m_str; }
+    QString m_str;
+
+    mutable uint m_hash; // We use the highest bit as a validity indicator (set => invalid)
+};
+
+struct HashStringList {
+    explicit HashStringList(const QList<HashString> &list) : m_list(list), m_hash(0x80000000) {}
+    const QList<HashString> &value() const { return m_list; }
+    bool operator==(const HashStringList &other) const { return m_list == other.m_list; }
+
+    QList<HashString> m_list;
+    mutable uint m_hash; // We use the highest bit as a validity indicator (set => invalid)
+};
+
+typedef QList<HashString> NamespaceList;
+
+struct Namespace {
+
+    Namespace() :
+            classDef(this),
+            hasTrFunctions(false), complained(false)
+    {}
+    ~Namespace()
+    {
+        qDeleteAll(children);
+    }
+
+    QHash<HashString, Namespace *> children;
+    QHash<HashString, NamespaceList> aliases;
+    QList<HashStringList> usings;
+
+    // Class declarations set no flags and create no namespaces, so they are ignored.
+    // Class definitions may appear multiple times - but only because we are trying to
+    // "compile" all sources irrespective of build configuration.
+    // Nested classes may be forward-declared inside a definition, and defined in another file.
+    // The latter will detach the class' child list, so clones need a backlink to the original
+    // definition (either one in case of multiple definitions).
+    // Namespaces can have tr() functions as well, so we need to track parent definitions for
+    // them as well. The complication is that we may have to deal with a forrest instead of
+    // a tree - in that case the parent will be arbitrary. However, it seem likely that
+    // Q_DECLARE_TR_FUNCTIONS would be used either in "class-like" namespaces with a central
+    // header or only locally in a file.
+    Namespace *classDef;
+
+    QString trQualification;
+
+    bool hasTrFunctions;
+    bool complained; // ... that tr functions are missing.
+};
+
+struct ParseResults {
+    int fileId;
+    Namespace rootNamespace;
+    QSet<const ParseResults *> includes;
+};
+
+struct IncludeCycle {
+    QSet<QString> fileNames;
+    QSet<const ParseResults *> results;
+};
+
+typedef QHash<QString, IncludeCycle *> IncludeCycleHash;
+typedef QHash<QString, const Translator *> TranslatorHash;
+
+class CppFiles {
+
+public:
+    static QSet<const ParseResults *> getResults(const QString &cleanFile);
+    static void setResults(const QString &cleanFile, const ParseResults *results);
+    static const Translator *getTranslator(const QString &cleanFile);
+    static void setTranslator(const QString &cleanFile, const Translator *results);
+    static bool isBlacklisted(const QString &cleanFile);
+    static void setBlacklisted(const QString &cleanFile);
+    static void addIncludeCycle(const QSet<QString> &fileNames);
+
+private:
+    static IncludeCycleHash &includeCycles();
+    static TranslatorHash &translatedFiles();
+    static QSet<QString> &blacklistedFiles();
+};
+
+QT_END_NAMESPACE
+
+#endif // CPP_H
diff --git a/src/linguist/lupdate/java.cpp b/src/linguist/lupdate/java.cpp
index 670ca8ec9..3c00af40c 100644
--- a/src/linguist/lupdate/java.cpp
+++ b/src/linguist/lupdate/java.cpp
@@ -45,10 +45,6 @@
 
 QT_BEGIN_NAMESPACE
 
-class LU {
-    Q_DECLARE_TR_FUNCTIONS(LUpdate)
-};
-
 enum { Tok_Eof, Tok_class, Tok_return, Tok_tr,
        Tok_translate, Tok_Ident, Tok_Package,
        Tok_Comment, Tok_String, Tok_Colon, Tok_Dot,
diff --git a/src/linguist/lupdate/lupdate.h b/src/linguist/lupdate/lupdate.h
index bb58cbd1e..80076afbe 100644
--- a/src/linguist/lupdate/lupdate.h
+++ b/src/linguist/lupdate/lupdate.h
@@ -31,10 +31,12 @@
 
 #include "qglobal.h"
 
-#include <QList>
-#include <QString>
-#include <QStringList>
-#include <QHash>
+#include <QtCore/QList>
+#include <QtCore/QHash>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QTranslator>
 
 QT_BEGIN_NAMESPACE
 
@@ -137,6 +139,10 @@ private:
     mutable QHash<QString,TrFunction> m_nameToTrFunctionMap;
 };
 
+class LU {
+    Q_DECLARE_TR_FUNCTIONS(LUpdate)
+};
+
 QT_END_NAMESPACE
 
 extern QT_PREPEND_NAMESPACE(TrFunctionAliasManager) trFunctionAliasManager;
diff --git a/src/linguist/lupdate/lupdate.pro b/src/linguist/lupdate/lupdate.pro
index 121717f03..e69703da2 100644
--- a/src/linguist/lupdate/lupdate.pro
+++ b/src/linguist/lupdate/lupdate.pro
@@ -27,6 +27,7 @@ qtHaveModule(qmldevtools-private): SOURCES += qdeclarative.cpp
 
 HEADERS += \
     lupdate.h \
+    cpp.h \
     ../shared/projectdescriptionreader.h \
     ../shared/qrcreader.h \
     ../shared/runqttool.h \
diff --git a/src/linguist/lupdate/main.cpp b/src/linguist/lupdate/main.cpp
index 8bdfff479..712b95550 100644
--- a/src/linguist/lupdate/main.cpp
+++ b/src/linguist/lupdate/main.cpp
@@ -197,10 +197,6 @@ static void printErr(const QString & out)
     std::cerr << qPrintable(out);
 }
 
-class LU {
-    Q_DECLARE_TR_FUNCTIONS(LUpdate)
-};
-
 static void recursiveFileInfoList(const QDir &dir,
     const QSet<QString> &nameFilters, QDir::Filters filter,
     QFileInfoList *fileinfolist)
diff --git a/src/linguist/lupdate/merge.cpp b/src/linguist/lupdate/merge.cpp
index f413610f9..0a5a9c1f5 100644
--- a/src/linguist/lupdate/merge.cpp
+++ b/src/linguist/lupdate/merge.cpp
@@ -39,10 +39,6 @@
 
 QT_BEGIN_NAMESPACE
 
-class LU {
-    Q_DECLARE_TR_FUNCTIONS(LUpdate)
-};
-
 static bool isDigitFriendly(QChar c)
 {
     return c.isPunct() || c.isSpace();
diff --git a/src/linguist/lupdate/qdeclarative.cpp b/src/linguist/lupdate/qdeclarative.cpp
index 23e8dc451..216bc8329 100644
--- a/src/linguist/lupdate/qdeclarative.cpp
+++ b/src/linguist/lupdate/qdeclarative.cpp
@@ -52,10 +52,6 @@
 
 QT_BEGIN_NAMESPACE
 
-class LU {
-    Q_DECLARE_TR_FUNCTIONS(LUpdate)
-};
-
 using namespace QQmlJS;
 
 static QString MagicComment(QLatin1String("TRANSLATOR"));
diff --git a/src/linguist/lupdate/ui.cpp b/src/linguist/lupdate/ui.cpp
index 417f32cc6..ce4ecc045 100644
--- a/src/linguist/lupdate/ui.cpp
+++ b/src/linguist/lupdate/ui.cpp
@@ -43,10 +43,6 @@
 
 QT_BEGIN_NAMESPACE
 
-class LU {
-    Q_DECLARE_TR_FUNCTIONS(LUpdate)
-};
-
 class UiReader : public QXmlDefaultHandler
 {
 public:
-- 
GitLab