2012-10-02 09:12:39 +02:00
|
|
|
/****************************************************************************
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2016-01-15 14:58:39 +01:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator.
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** 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
|
2016-01-15 14:58:39 +01:00
|
|
|
** 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.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2016-01-15 14:58:39 +01:00
|
|
|
** 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.
|
2010-12-17 16:01:08 +01:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
****************************************************************************/
|
2008-12-02 14:09:21 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "codegeneration.h"
|
|
|
|
|
|
2014-07-21 15:38:32 +02:00
|
|
|
#include "algorithm.h"
|
|
|
|
|
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QTextStream>
|
2014-07-21 15:38:32 +02:00
|
|
|
#include <QSet>
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QStringList>
|
|
|
|
|
#include <QFileInfo>
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
namespace Utils {
|
|
|
|
|
|
2009-11-09 12:28:22 +01:00
|
|
|
QTCREATOR_UTILS_EXPORT QString fileNameToCppIdentifier(const QString &s)
|
2009-03-05 17:12:31 +01:00
|
|
|
{
|
|
|
|
|
QString rc;
|
|
|
|
|
const int len = s.size();
|
|
|
|
|
const QChar underscore = QLatin1Char('_');
|
2009-03-20 17:01:16 +01:00
|
|
|
const QChar dot = QLatin1Char('.');
|
2009-03-05 17:12:31 +01:00
|
|
|
|
|
|
|
|
for (int i = 0; i < len; i++) {
|
|
|
|
|
const QChar c = s.at(i);
|
|
|
|
|
if (c == underscore || c.isLetterOrNumber())
|
|
|
|
|
rc += c;
|
2009-03-20 17:01:16 +01:00
|
|
|
else if (c == dot)
|
|
|
|
|
rc += underscore;
|
2009-03-05 17:12:31 +01:00
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-08 12:09:21 +02:00
|
|
|
QTCREATOR_UTILS_EXPORT QString headerGuard(const QString &file)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2011-01-18 12:18:08 +01:00
|
|
|
return headerGuard(file, QStringList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QTCREATOR_UTILS_EXPORT QString headerGuard(const QString &file, const QStringList &namespaceList)
|
|
|
|
|
{
|
|
|
|
|
const QChar underscore = QLatin1Char('_');
|
|
|
|
|
QString rc;
|
|
|
|
|
for (int i = 0; i < namespaceList.count(); i++)
|
|
|
|
|
rc += namespaceList.at(i).toUpper() + underscore;
|
|
|
|
|
|
2009-03-05 17:12:31 +01:00
|
|
|
const QFileInfo fi(file);
|
2011-01-18 12:18:08 +01:00
|
|
|
rc += fileNameToCppIdentifier(fi.fileName()).toUpper();
|
2008-12-02 12:01:29 +01:00
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-08 12:09:21 +02:00
|
|
|
QTCREATOR_UTILS_EXPORT
|
2008-12-02 12:01:29 +01:00
|
|
|
void writeIncludeFileDirective(const QString &file, bool globalInclude,
|
|
|
|
|
QTextStream &str)
|
|
|
|
|
{
|
|
|
|
|
const QChar opening = globalInclude ? QLatin1Char('<') : QLatin1Char('"');
|
|
|
|
|
const QChar closing = globalInclude ? QLatin1Char('>') : QLatin1Char('"');
|
|
|
|
|
str << QLatin1String("#include ") << opening << file << closing << QLatin1Char('\n');
|
|
|
|
|
}
|
|
|
|
|
|
2012-02-16 09:36:33 +01:00
|
|
|
QTCREATOR_UTILS_EXPORT void writeBeginQtVersionCheck(QTextStream &str)
|
|
|
|
|
{
|
|
|
|
|
str << QLatin1String("#if QT_VERSION >= 0x050000\n");
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-21 15:38:32 +02:00
|
|
|
static void qtSection(const QStringList &qtIncludes, QTextStream &str)
|
|
|
|
|
{
|
|
|
|
|
QStringList sorted = qtIncludes;
|
|
|
|
|
Utils::sort(sorted);
|
|
|
|
|
foreach (const QString &inc, sorted) {
|
|
|
|
|
if (!inc.isEmpty())
|
|
|
|
|
str << QStringLiteral("#include <%1>\n").arg(inc);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QTCREATOR_UTILS_EXPORT
|
|
|
|
|
void writeQtIncludeSection(const QStringList &qt4,
|
|
|
|
|
const QStringList &qt5,
|
|
|
|
|
bool addQtVersionCheck,
|
|
|
|
|
bool includeQtModule,
|
|
|
|
|
QTextStream &str)
|
|
|
|
|
{
|
|
|
|
|
std::function<QString(const QString &)> trans;
|
|
|
|
|
if (includeQtModule)
|
|
|
|
|
trans = [](const QString &i) { return i; };
|
|
|
|
|
else
|
|
|
|
|
trans = [](const QString &i) { return i.mid(i.indexOf(QLatin1Char('/')) + 1); };
|
|
|
|
|
|
2014-10-30 15:42:42 +01:00
|
|
|
QSet<QString> qt4Only = Utils::transform<QSet>(qt4, trans);
|
|
|
|
|
QSet<QString> qt5Only = Utils::transform<QSet>(qt5, trans);
|
2014-10-30 14:22:34 +01:00
|
|
|
|
|
|
|
|
if (addQtVersionCheck) {
|
|
|
|
|
QSet<QString> common = qt4Only;
|
|
|
|
|
common.intersect(qt5Only);
|
|
|
|
|
|
2014-10-31 13:57:13 +01:00
|
|
|
// qglobal.h is needed for QT_VERSION
|
|
|
|
|
if (includeQtModule)
|
|
|
|
|
common.insert(QLatin1String("QtCore/qglobal.h"));
|
|
|
|
|
else
|
|
|
|
|
common.insert(QLatin1String("qglobal.h"));
|
|
|
|
|
|
2014-10-30 14:22:34 +01:00
|
|
|
qt4Only.subtract(common);
|
|
|
|
|
qt5Only.subtract(common);
|
|
|
|
|
|
2019-06-21 08:40:47 +02:00
|
|
|
qtSection(Utils::toList(common), str);
|
2014-10-30 14:22:34 +01:00
|
|
|
|
|
|
|
|
if (!qt4Only.isEmpty() || !qt5Only.isEmpty()) {
|
|
|
|
|
if (addQtVersionCheck)
|
|
|
|
|
writeBeginQtVersionCheck(str);
|
2019-06-21 08:40:47 +02:00
|
|
|
qtSection(Utils::toList(qt5Only), str);
|
2014-10-30 14:22:34 +01:00
|
|
|
if (addQtVersionCheck)
|
|
|
|
|
str << QLatin1String("#else\n");
|
2019-06-21 08:40:47 +02:00
|
|
|
qtSection(Utils::toList(qt4Only), str);
|
2014-10-30 14:22:34 +01:00
|
|
|
if (addQtVersionCheck)
|
|
|
|
|
str << QLatin1String("#endif\n");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (!qt5Only.isEmpty()) // default to Qt5
|
2019-06-21 08:40:47 +02:00
|
|
|
qtSection(Utils::toList(qt5Only), str);
|
2014-10-30 14:22:34 +01:00
|
|
|
else
|
2019-06-21 08:40:47 +02:00
|
|
|
qtSection(Utils::toList(qt4Only), str);
|
2014-07-21 15:38:32 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-08 12:09:21 +02:00
|
|
|
QTCREATOR_UTILS_EXPORT
|
2008-12-02 12:01:29 +01:00
|
|
|
QString writeOpeningNameSpaces(const QStringList &l, const QString &indent,
|
|
|
|
|
QTextStream &str)
|
|
|
|
|
{
|
|
|
|
|
const int count = l.size();
|
|
|
|
|
QString rc;
|
|
|
|
|
if (count) {
|
|
|
|
|
str << '\n';
|
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
|
str << rc << "namespace " << l.at(i) << " {\n";
|
|
|
|
|
rc += indent;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
2009-05-08 12:09:21 +02:00
|
|
|
QTCREATOR_UTILS_EXPORT
|
2008-12-02 12:01:29 +01:00
|
|
|
void writeClosingNameSpaces(const QStringList &l, const QString &indent,
|
|
|
|
|
QTextStream &str)
|
|
|
|
|
{
|
|
|
|
|
if (!l.empty())
|
|
|
|
|
str << '\n';
|
|
|
|
|
for (int i = l.size() - 1; i >= 0; i--) {
|
|
|
|
|
if (i)
|
|
|
|
|
str << QString(indent.size() * i, QLatin1Char(' '));
|
|
|
|
|
str << "} // namespace " << l.at(i) << '\n';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Utils
|