/**************************************************************************** ** ** Copyright (C) 2021 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:COMM$ ** ** 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. ** ** $QT_END_LICENSE$ ** ** ** ** ** ** ** ** ****************************************************************************/ #ifndef CPP_H #define CPP_H #include "lupdate.h" #include #include 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 &list) : m_list(list), m_hash(0x80000000) {} const QList &value() const { return m_list; } bool operator==(const HashStringList &other) const { return m_list == other.m_list; } QList m_list; mutable uint m_hash; // We use the highest bit as a validity indicator (set => invalid) }; typedef QList NamespaceList; struct Namespace { Namespace() : classDef(this), hasTrFunctions(false), complained(false) {} ~Namespace() { qDeleteAll(children); } QHash children; QHash aliases; QList 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 includes; }; struct IncludeCycle { QSet fileNames; QSet results; }; typedef QHash IncludeCycleHash; typedef QHash TranslatorHash; class CppFiles { public: static QSet 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 &fileNames); private: static IncludeCycleHash &includeCycles(); static TranslatorHash &translatedFiles(); static QSet &blacklistedFiles(); }; QT_END_NAMESPACE #endif // CPP_H