summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Wicking <paul.wicking@qt.io>2020-03-04 13:56:04 +0100
committerPaul Wicking <paul.wicking@qt.io>2020-03-04 13:56:04 +0100
commitf428d4be3eb00e281ed18c87e7c7f61d40ed69f9 (patch)
treed204abd674c3efbbeb318b523103bfb4a068444b
parent28811dad02f18a3dc0eeae9d91cd4819780626ee (diff)
parent94ee5927f5551d32876f5854c8b0f630b68b4659 (diff)
Merge remote-tracking branch 'origin/5.15' into dev
-rw-r--r--src/assistant/help/qfilternamedialog_p.h11
-rw-r--r--src/assistant/help/qhelpfiltersettings_p.h11
-rw-r--r--src/assistant/help/qoptionswidget_p.h11
-rw-r--r--src/linguist/linguist/mainwindow.cpp5
-rw-r--r--src/qdoc/clangcodeparser.cpp18
-rw-r--r--src/qdoc/config.cpp28
-rw-r--r--src/qdoc/config.h21
-rw-r--r--src/qdoc/docbookgenerator.cpp2
-rw-r--r--src/qdoc/generator.cpp8
-rw-r--r--src/qdoc/generator.h17
-rw-r--r--src/qdoc/htmlgenerator.cpp15
-rw-r--r--src/qdoc/location.cpp35
-rw-r--r--src/qdoc/location.h5
-rw-r--r--src/qdoc/main.cpp33
-rw-r--r--src/qdoc/qdocdatabase.cpp9
-rw-r--r--src/qdoc/qdocindexfiles.cpp7
-rw-r--r--src/qdoc/tree.cpp7
-rw-r--r--tests/auto/qdoc/generatedoutput/testdata/configs/testcpp_singleexec.qdocconf6
-rw-r--r--tests/auto/qdoc/generatedoutput/testdata/crossmodule/crossmodule_singleexec.qdocconf4
-rw-r--r--tests/auto/qdoc/generatedoutput/testdata/singleexec/singleexec.qdocconf2
-rw-r--r--tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp15
21 files changed, 147 insertions, 123 deletions
diff --git a/src/assistant/help/qfilternamedialog_p.h b/src/assistant/help/qfilternamedialog_p.h
index f805e9308..76a495d78 100644
--- a/src/assistant/help/qfilternamedialog_p.h
+++ b/src/assistant/help/qfilternamedialog_p.h
@@ -29,6 +29,17 @@
#ifndef QFILTERNAMEDIALOG_H
#define QFILTERNAMEDIALOG_H
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the help generator tools. This header file may change from version
+// to version without notice, or even be removed.
+//
+// We mean it.
+//
+
#include <QtWidgets/QDialog>
#include "ui_qfilternamedialog.h"
diff --git a/src/assistant/help/qhelpfiltersettings_p.h b/src/assistant/help/qhelpfiltersettings_p.h
index da25d300e..cf5622b6d 100644
--- a/src/assistant/help/qhelpfiltersettings_p.h
+++ b/src/assistant/help/qhelpfiltersettings_p.h
@@ -40,6 +40,17 @@
#ifndef QHELPFILTERSETTINGS_H
#define QHELPFILTERSETTINGS_H
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the help generator tools. This header file may change from version
+// to version without notice, or even be removed.
+//
+// We mean it.
+//
+
#include <QtCore/QSharedDataPointer>
QT_BEGIN_NAMESPACE
diff --git a/src/assistant/help/qoptionswidget_p.h b/src/assistant/help/qoptionswidget_p.h
index ff075e464..a6700c1d7 100644
--- a/src/assistant/help/qoptionswidget_p.h
+++ b/src/assistant/help/qoptionswidget_p.h
@@ -29,6 +29,17 @@
#ifndef QOPTIONSWIDGET_H
#define QOPTIONSWIDGET_H
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of the help generator tools. This header file may change from version
+// to version without notice, or even be removed.
+//
+// We mean it.
+//
+
#include <QtWidgets/QWidget>
#include <QtCore/QMap>
diff --git a/src/linguist/linguist/mainwindow.cpp b/src/linguist/linguist/mainwindow.cpp
index 7cc9fc740..26a3d03f2 100644
--- a/src/linguist/linguist/mainwindow.cpp
+++ b/src/linguist/linguist/mainwindow.cpp
@@ -299,7 +299,6 @@ MainWindow::MainWindow()
m_contextDock = new QDockWidget(this);
m_contextDock->setObjectName(QLatin1String("ContextDockWidget"));
m_contextDock->setAllowedAreas(Qt::AllDockWidgetAreas);
- m_contextDock->setFeatures(QDockWidget::AllDockWidgetFeatures);
m_contextDock->setWindowTitle(tr("Context"));
m_contextDock->setAcceptDrops(true);
m_contextDock->installEventFilter(this);
@@ -329,7 +328,6 @@ MainWindow::MainWindow()
m_messagesDock = new QDockWidget(this);
m_messagesDock->setObjectName(QLatin1String("StringsDockWidget"));
m_messagesDock->setAllowedAreas(Qt::AllDockWidgetAreas);
- m_messagesDock->setFeatures(QDockWidget::AllDockWidgetFeatures);
m_messagesDock->setWindowTitle(tr("Strings"));
m_messagesDock->setAcceptDrops(true);
m_messagesDock->installEventFilter(this);
@@ -366,7 +364,6 @@ MainWindow::MainWindow()
m_phrasesDock = new QDockWidget(this);
m_phrasesDock->setObjectName(QLatin1String("PhrasesDockwidget"));
m_phrasesDock->setAllowedAreas(Qt::AllDockWidgetAreas);
- m_phrasesDock->setFeatures(QDockWidget::AllDockWidgetFeatures);
m_phrasesDock->setWindowTitle(tr("Phrases and guesses"));
m_phraseView = new PhraseView(m_dataModel, &m_phraseDict, this);
@@ -376,7 +373,6 @@ MainWindow::MainWindow()
m_sourceAndFormDock = new QDockWidget(this);
m_sourceAndFormDock->setObjectName(QLatin1String("SourceAndFormDock"));
m_sourceAndFormDock->setAllowedAreas(Qt::AllDockWidgetAreas);
- m_sourceAndFormDock->setFeatures(QDockWidget::AllDockWidgetFeatures);
m_sourceAndFormDock->setWindowTitle(tr("Sources and Forms"));
m_sourceAndFormView = new QStackedWidget(this);
m_sourceAndFormDock->setWidget(m_sourceAndFormView);
@@ -391,7 +387,6 @@ MainWindow::MainWindow()
m_errorsDock = new QDockWidget(this);
m_errorsDock->setObjectName(QLatin1String("ErrorsDockWidget"));
m_errorsDock->setAllowedAreas(Qt::AllDockWidgetAreas);
- m_errorsDock->setFeatures(QDockWidget::AllDockWidgetFeatures);
m_errorsDock->setWindowTitle(tr("Warnings"));
m_errorsView = new ErrorsView(m_dataModel, this);
m_errorsDock->setWidget(m_errorsView);
diff --git a/src/qdoc/clangcodeparser.cpp b/src/qdoc/clangcodeparser.cpp
index 3c8fe78d1..fe2a0bca0 100644
--- a/src/qdoc/clangcodeparser.cpp
+++ b/src/qdoc/clangcodeparser.cpp
@@ -45,7 +45,6 @@
#include "codechunk.h"
#include "config.h"
-#include "generator.h"
#include "loggingcategory.h"
#include "qdocdatabase.h"
#include "utilities.h"
@@ -1281,8 +1280,7 @@ bool ClangCodeParser::getMoreArgs()
of reasonable places to look for include files and use
that list instead.
*/
- Location::logToStdErrAlways(
- "No include paths passed to qdoc; guessing reasonable include paths");
+ qCWarning(lcQdoc) << "No include paths passed to qdoc; guessing reasonable include paths";
guessedIncludePaths = true;
auto forest = qdb_->searchOrder();
@@ -1312,7 +1310,7 @@ void ClangCodeParser::buildPCH()
const QByteArray module = moduleHeader().toUtf8();
QByteArray header;
QByteArray privateHeaderDir;
- Location::logToStdErrAlways("Build & visit PCH for " + moduleHeader());
+ qCInfo(lcQdoc) << "Build & visit PCH for " << moduleHeader();
// A predicate for std::find_if() to locate a path to the module's header
// (e.g. QtGui/QtGui) to be used as pre-compiled header
struct FindPredicate
@@ -1403,8 +1401,7 @@ void ClangCodeParser::buildPCH()
tmpHeaderFile.close();
}
if (printParsingErrors_ == 0)
- Location::logToStdErrAlways(
- "clang not printing errors; include paths were guessed");
+ qCWarning(lcQdoc) << "clang not printing errors; include paths were guessed";
CXErrorCode err =
clang_parseTranslationUnit2(index_, tmpHeader.toLatin1().data(), args_.data(),
static_cast<int>(args_.size()), nullptr, 0,
@@ -1416,7 +1413,7 @@ void ClangCodeParser::buildPCH()
auto error = clang_saveTranslationUnit(tu, pchName_.constData(),
clang_defaultSaveOptions(tu));
if (error) {
- Location::logToStdErrAlways("Could not save PCH file for " + moduleHeader());
+ qCCritical(lcQdoc) << "Could not save PCH file for " << moduleHeader();
pchName_.clear();
} else {
// Visit the header now, as token from pre-compiled header won't be visited
@@ -1424,12 +1421,12 @@ void ClangCodeParser::buildPCH()
CXCursor cur = clang_getTranslationUnitCursor(tu);
ClangVisitor visitor(qdb_, allHeaders_);
visitor.visitChildren(cur);
- Location::logToStdErrAlways("PCH built & visited for " + moduleHeader());
+ qCInfo(lcQdoc) << "PCH built & visited for " << moduleHeader();
}
clang_disposeTranslationUnit(tu);
} else {
pchFileDir_->remove();
- Location::logToStdErrAlways("Could not create PCH file for " + moduleHeader());
+ qCCritical(lcQdoc) << "Could not create PCH file for " << moduleHeader();
}
args_.pop_back(); // remove the "-xc++";
}
@@ -1705,7 +1702,8 @@ Node *ClangCodeParser::parseFnArg(const Location &location, const QString &fnArg
*/
if (fnNode == nullptr) {
unsigned diagnosticCount = clang_getNumDiagnostics(tu);
- if (diagnosticCount > 0 && (!Generator::preparing() || Generator::singleExec())) {
+ const auto &config = Config::instance();
+ if (diagnosticCount > 0 && (!config.preparing() || config.singleExec())) {
bool report = true;
QStringList signature = fnArg.split(QChar('('));
if (signature.size() > 1) {
diff --git a/src/qdoc/config.cpp b/src/qdoc/config.cpp
index f6df0823b..dee983004 100644
--- a/src/qdoc/config.cpp
+++ b/src/qdoc/config.cpp
@@ -31,7 +31,7 @@
*/
#include "config.h"
-#include "generator.h"
+#include "loggingcategory.h"
#include <QtCore/qdebug.h>
#include <QtCore/qdir.h>
@@ -56,6 +56,7 @@ QString ConfigStrings::CPPCLASSESTITLE = QStringLiteral("cppclassestitle");
QString ConfigStrings::DEFINES = QStringLiteral("defines");
QString ConfigStrings::DEPENDS = QStringLiteral("depends");
QString ConfigStrings::DESCRIPTION = QStringLiteral("description");
+QString ConfigStrings::DOCBOOKEXTENSIONS = QStringLiteral("usedocbookextensions");
QString ConfigStrings::EDITION = QStringLiteral("edition");
QString ConfigStrings::ENDHEADER = QStringLiteral("endheader");
QString ConfigStrings::EXAMPLEDIRS = QStringLiteral("exampledirs");
@@ -84,6 +85,7 @@ QString ConfigStrings::LANDINGPAGE = QStringLiteral("landingpage");
QString ConfigStrings::LANDINGTITLE = QStringLiteral("landingtitle");
QString ConfigStrings::LANGUAGE = QStringLiteral("language");
QString ConfigStrings::LOCATIONINFO = QStringLiteral("locationinfo");
+QString ConfigStrings::LOGPROGRESS = QStringLiteral("logprogress");
QString ConfigStrings::MACRO = QStringLiteral("macro");
QString ConfigStrings::MANIFESTMETA = QStringLiteral("manifestmeta");
QString ConfigStrings::MODULEHEADER = QStringLiteral("moduleheader");
@@ -116,6 +118,7 @@ QString ConfigStrings::STYLESHEETS = QStringLiteral("stylesheets");
QString ConfigStrings::SYNTAXHIGHLIGHTING = QStringLiteral("syntaxhighlighting");
QString ConfigStrings::TABSIZE = QStringLiteral("tabsize");
QString ConfigStrings::TAGFILE = QStringLiteral("tagfile");
+QString ConfigStrings::TIMESTAMPS = QStringLiteral("timestamps");
QString ConfigStrings::TRANSLATORS = QStringLiteral("translators");
QString ConfigStrings::URL = QStringLiteral("url");
QString ConfigStrings::VERSION = QStringLiteral("version");
@@ -384,21 +387,20 @@ void Config::processCommandLineOptions(const QStringList &args)
debug_ = m_parser.isSet(m_parser.debugOption);
- // TODO: Make Generator use Config instead of storing these separately
if (m_parser.isSet(m_parser.prepareOption))
- Generator::setQDocPass(Generator::Prepare);
+ m_qdocPass = Prepare;
if (m_parser.isSet(m_parser.generateOption))
- Generator::setQDocPass(Generator::Generate);
- if (m_parser.isSet(m_parser.singleExecOption))
- Generator::setSingleExec();
- if (m_parser.isSet(m_parser.writeQaPagesOption))
- Generator::setWriteQaPages();
+ m_qdocPass = Generate;
+ if (m_parser.isSet(m_parser.writeQaPagesOption)) {
+ qCWarning(lcQdoc,
+ "The QA pages option for QDoc is deprecated and will be removed in Qt 6.");
+ }
if (m_parser.isSet(m_parser.logProgressOption))
- Location::startLoggingProgress();
+ setStringList(CONFIG_LOGPROGRESS, QStringList("true"));
if (m_parser.isSet(m_parser.timestampsOption))
- Generator::setUseTimestamps();
+ setStringList(CONFIG_TIMESTAMPS, QStringList("true"));
if (m_parser.isSet(m_parser.useDocBookExtensions))
- Generator::setUseDocBookExtensions();
+ setStringList(CONFIG_DOCBOOKEXTENSIONS, QStringList("true"));
}
void Config::setIncludePaths()
@@ -426,7 +428,7 @@ void Config::setIndexDirs()
[](const QString &s) { return !QFile::exists(s); });
std::for_each(it, m_indexDirs.end(), [](const QString &s) {
- Location::logToStdErrAlways(tr("Cannot find index directory: %1").arg(s));
+ qCWarning(lcQdoc) << "Cannot find index directory: " << s;
});
m_indexDirs.erase(it, m_indexDirs.end());
}
@@ -471,7 +473,7 @@ QString Config::getOutputDir(const QString &format) const
t = getString(CONFIG_OUTPUTDIR);
else
t = overrideOutputDir;
- if (Generator::singleExec()) {
+ if (getBool(CONFIG_SINGLEEXEC)) {
QString project = getString(CONFIG_PROJECT);
t += QLatin1Char('/') + project.toLower();
}
diff --git a/src/qdoc/config.h b/src/qdoc/config.h
index 151a8caee..30b2637f6 100644
--- a/src/qdoc/config.h
+++ b/src/qdoc/config.h
@@ -98,6 +98,8 @@ class Config : public Singleton<Config>
public:
~Config();
+ enum QDocPass { Neither, Prepare, Generate };
+
void init(const QString &programName, const QStringList &args);
bool getDebug() const { return debug_; }
@@ -163,6 +165,7 @@ public:
static QSet<QString> overrideOutputFormats;
inline bool singleExec() const;
+ inline bool dualExec() const;
QStringList &defines() { return m_defines; }
QStringList &dependModules() { return m_dependModules; }
QStringList &includePaths() { return m_includePaths; }
@@ -172,6 +175,11 @@ public:
QString previousCurrentDir() const { return m_previousCurrentDir; }
void setPreviousCurrentDir(const QString &path) { m_previousCurrentDir = path; }
+ QDocPass qdocPass() const { return m_qdocPass; }
+ void setQDocPass(const QDocPass &pass) { m_qdocPass = pass; };
+ bool preparing() const { return (m_qdocPass == Prepare); }
+ bool generating() const { return (m_qdocPass == Generate); }
+
private:
void processCommandLineOptions(const QStringList &args);
void setIncludePaths();
@@ -198,6 +206,8 @@ private:
static QStack<QString> workingDirs_;
static QMap<QString, QStringList> includeFilesMap_;
QDocCommandLineParser m_parser;
+
+ QDocPass m_qdocPass = Neither;
};
struct ConfigStrings
@@ -214,6 +224,7 @@ struct ConfigStrings
static QString DEFINES;
static QString DEPENDS;
static QString DESCRIPTION;
+ static QString DOCBOOKEXTENSIONS;
static QString EDITION;
static QString ENDHEADER;
static QString EXAMPLEDIRS;
@@ -242,6 +253,7 @@ struct ConfigStrings
static QString LANDINGTITLE;
static QString LANGUAGE;
static QString LOCATIONINFO;
+ static QString LOGPROGRESS;
static QString MACRO;
static QString MANIFESTMETA;
static QString MODULEHEADER;
@@ -273,6 +285,7 @@ struct ConfigStrings
static QString SYNTAXHIGHLIGHTING;
static QString TABSIZE;
static QString TAGFILE;
+ static QString TIMESTAMPS;
static QString TRANSLATORS;
static QString URL;
static QString VERSION;
@@ -298,6 +311,7 @@ struct ConfigStrings
#define CONFIG_DEFINES ConfigStrings::DEFINES
#define CONFIG_DEPENDS ConfigStrings::DEPENDS
#define CONFIG_DESCRIPTION ConfigStrings::DESCRIPTION
+#define CONFIG_DOCBOOKEXTENSIONS ConfigStrings::DOCBOOKEXTENSIONS
#define CONFIG_EDITION ConfigStrings::EDITION
#define CONFIG_ENDHEADER ConfigStrings::ENDHEADER
#define CONFIG_EXAMPLEDIRS ConfigStrings::EXAMPLEDIRS
@@ -326,6 +340,7 @@ struct ConfigStrings
#define CONFIG_LANDINGTITLE ConfigStrings::LANDINGTITLE
#define CONFIG_LANGUAGE ConfigStrings::LANGUAGE
#define CONFIG_LOCATIONINFO ConfigStrings::LOCATIONINFO
+#define CONFIG_LOGPROGRESS ConfigStrings::LOGPROGRESS
#define CONFIG_MACRO ConfigStrings::MACRO
#define CONFIG_MANIFESTMETA ConfigStrings::MANIFESTMETA
#define CONFIG_MODULEHEADER ConfigStrings::MODULEHEADER
@@ -357,6 +372,7 @@ struct ConfigStrings
#define CONFIG_SYNTAXHIGHLIGHTING ConfigStrings::SYNTAXHIGHLIGHTING
#define CONFIG_TABSIZE ConfigStrings::TABSIZE
#define CONFIG_TAGFILE ConfigStrings::TAGFILE
+#define CONFIG_TIMESTAMPS ConfigStrings::TIMESTAMPS
#define CONFIG_TRANSLATORS ConfigStrings::TRANSLATORS
#define CONFIG_URL ConfigStrings::URL
#define CONFIG_VERSION ConfigStrings::VERSION
@@ -374,6 +390,11 @@ inline bool Config::singleExec() const
return getBool(CONFIG_SINGLEEXEC);
}
+inline bool Config::dualExec() const
+{
+ return !getBool(CONFIG_SINGLEEXEC);
+}
+
QT_END_NAMESPACE
#endif
diff --git a/src/qdoc/docbookgenerator.cpp b/src/qdoc/docbookgenerator.cpp
index 8e2292211..5f8d961f8 100644
--- a/src/qdoc/docbookgenerator.cpp
+++ b/src/qdoc/docbookgenerator.cpp
@@ -2537,7 +2537,7 @@ void DocBookGenerator::generateDocBookSynopsis(const Node *node)
// Generator::generateThreadSafeness, QDocIndexFiles::generateIndexSection.
// This function is the only place where DocBook extensions are used.
- if (useDocBookExtensions())
+ if (config->getBool(CONFIG_DOCBOOKEXTENSIONS))
return;
// Nothing to export in some cases.
diff --git a/src/qdoc/generator.cpp b/src/qdoc/generator.cpp
index f886ef56c..7bb32f471 100644
--- a/src/qdoc/generator.cpp
+++ b/src/qdoc/generator.cpp
@@ -75,12 +75,8 @@ QStringList Generator::styleFiles;
bool Generator::noLinkErrors_ = false;
bool Generator::autolinkErrors_ = false;
bool Generator::redirectDocumentationToDevNull_ = false;
-Generator::QDocPass Generator::qdocPass_ = Generator::Neither;
bool Generator::qdocSingleExec_ = false;
-bool Generator::qdocWriteQaPages_ = false;
bool Generator::useOutputSubdirs_ = true;
-bool Generator::useTimestamps_ = false;
-bool Generator::useDocBookExtensions_ = false;
QmlTypeNode *Generator::qmlTypeContext_ = nullptr;
static QRegExp tag("</?@[^>]*>");
@@ -1814,7 +1810,7 @@ void Generator::initializeFormat()
QDir dirInfo;
if (dirInfo.exists(outDir_)) {
- if (!generating() && Generator::useOutputSubdirs()) {
+ if (!config.generating() && Generator::useOutputSubdirs()) {
if (!Config::removeDirContents(outDir_))
config.lastLocation().error(tr("Cannot empty output directory '%1'").arg(outDir_));
}
@@ -1823,7 +1819,7 @@ void Generator::initializeFormat()
}
// Output directory exists, which is enough for prepare phase.
- if (preparing())
+ if (config.preparing())
return;
if (!dirInfo.exists(outDir_ + "/images") && !dirInfo.mkdir(outDir_ + "/images"))
diff --git a/src/qdoc/generator.h b/src/qdoc/generator.h
index 05a215c46..fd5fbbcef 100644
--- a/src/qdoc/generator.h
+++ b/src/qdoc/generator.h
@@ -52,7 +52,6 @@ class Generator
Q_DECLARE_TR_FUNCTIONS(QDoc::Generator)
public:
- enum QDocPass { Neither, Prepare, Generate };
enum ListType { Generic, Obsolete };
Generator();
@@ -80,16 +79,6 @@ public:
static void augmentImageDirs(QSet<QString> &moreImageDirs);
static bool noLinkErrors() { return noLinkErrors_; }
static bool autolinkErrors() { return autolinkErrors_; }
- static void setQDocPass(QDocPass t) { qdocPass_ = t; }
- static void setUseTimestamps() { useTimestamps_ = true; }
- static void setUseDocBookExtensions() { useDocBookExtensions_ = true; }
- static bool preparing() { return (qdocPass_ == Prepare); }
- static bool generating() { return (qdocPass_ == Generate); }
- static bool singleExec() { return qdocSingleExec_; }
- static bool dualExec() { return !qdocSingleExec_; }
- static bool writeQaPages() { return qdocWriteQaPages_; }
- static void setSingleExec() { qdocSingleExec_ = true; }
- static void setWriteQaPages() { qdocWriteQaPages_ = true; }
static QString defaultModuleName() { return project_; }
static void resetUseOutputSubdirs() { useOutputSubdirs_ = false; }
static bool useOutputSubdirs() { return useOutputSubdirs_; }
@@ -97,8 +86,6 @@ public:
static QmlTypeNode *qmlTypeContext() { return qmlTypeContext_; }
static QString cleanRef(const QString &ref);
static QString plainCode(const QString &markedCode);
- static bool useTimestamps() { return useTimestamps_; }
- static bool useDocBookExtensions() { return useDocBookExtensions_; }
protected:
static QFile *openSubPageFile(const Node *node, const QString &fileName);
@@ -220,12 +207,8 @@ private:
static bool noLinkErrors_;
static bool autolinkErrors_;
static bool redirectDocumentationToDevNull_;
- static QDocPass qdocPass_;
static bool qdocSingleExec_;
- static bool qdocWriteQaPages_;
static bool useOutputSubdirs_;
- static bool useTimestamps_;
- static bool useDocBookExtensions_;
static QmlTypeNode *qmlTypeContext_;
void generateReimplementsClause(const FunctionNode *fn, CodeMarker *marker);
diff --git a/src/qdoc/htmlgenerator.cpp b/src/qdoc/htmlgenerator.cpp
index 8bd009f5f..e7f4dc1cb 100644
--- a/src/qdoc/htmlgenerator.cpp
+++ b/src/qdoc/htmlgenerator.cpp
@@ -285,19 +285,19 @@ void HtmlGenerator::generateDocs()
Node *qflags = qdb_->findClassNode(QStringList("QFlags"));
if (qflags)
qflagsHref_ = linkForNode(qflags, nullptr);
- if (!preparing())
+ if (!config->preparing())
Generator::generateDocs();
- if (Generator::generating() && Generator::writeQaPages())
+ if (config->generating() && config->getBool(CONFIG_WRITEQAPAGES))
generateQAPage();
- if (!generating()) {
+ if (!config->generating()) {
QString fileBase =
project.toLower().simplified().replace(QLatin1Char(' '), QLatin1Char('-'));
qdb_->generateIndex(outputDir() + QLatin1Char('/') + fileBase + ".index", projectUrl,
projectDescription, this);
}
- if (!preparing()) {
+ if (!config->preparing()) {
helpProjectWriter->generate();
generateManifestFiles();
/*
@@ -502,7 +502,8 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark
if (link.isEmpty()) {
out() << protectEnc(atom->string());
} else {
- if (Generator::writeQaPages() && node && (atom->type() != Atom::NavAutoLink)) {
+ if (config->getBool(CONFIG_WRITEQAPAGES)
+ && node && (atom->type() != Atom::NavAutoLink)) {
QString text = atom->string();
QString target = qdb_->getNewLinkTarget(relative, node, outFileName(), text);
out() << "<a id=\"" << Doc::canonicalTitle(target)
@@ -846,13 +847,13 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark
QString link = getLink(atom, relative, &node);
if (link.isEmpty() && (node != relative) && !noLinkErrors()) {
relative->doc().location().warning(tr("Can't link to '%1'").arg(atom->string()));
- if (Generator::writeQaPages() && (atom->type() != Atom::NavAutoLink)) {
+ if (config->getBool(CONFIG_WRITEQAPAGES) && (atom->type() != Atom::NavAutoLink)) {
QString text = atom->next()->next()->string();
QString target = qdb_->getNewLinkTarget(relative, node, outFileName(), text, true);
out() << "<a id=\"" << Doc::canonicalTitle(target) << "\" class=\"qa-mark\"></a>";
}
} else {
- if (Generator::writeQaPages() && node && (atom->type() != Atom::NavLink)) {
+ if (config->getBool(CONFIG_WRITEQAPAGES) && node && (atom->type() != Atom::NavLink)) {
QString text = atom->next()->next()->string();
QString target = qdb_->getNewLinkTarget(relative, node, outFileName(), text);
out() << "<a id=\"" << Doc::canonicalTitle(target) << "\" class=\"qa-mark\"></a>";
diff --git a/src/qdoc/location.cpp b/src/qdoc/location.cpp
index a77537f56..a63b1780e 100644
--- a/src/qdoc/location.cpp
+++ b/src/qdoc/location.cpp
@@ -48,7 +48,6 @@ int Location::warningLimit = -1;
QString Location::programName;
QString Location::project;
QRegExp *Location::spuriousRegExp = nullptr;
-bool Location::logProgress_ = false;
/*!
\class Location
@@ -256,7 +255,8 @@ QString Location::canonicalRelativePath(const QString &path)
*/
void Location::warning(const QString &message, const QString &details) const
{
- if (!Generator::preparing() || Generator::singleExec())
+ const auto &config = Config::instance();
+ if (!config.preparing() || config.singleExec())
emitMessage(Warning, message, details);
}
@@ -267,7 +267,8 @@ void Location::warning(const QString &message, const QString &details) const
*/
void Location::error(const QString &message, const QString &details) const
{
- if (!Generator::preparing() || Generator::singleExec())
+ const auto &config = Config::instance();
+ if (!config.preparing() || config.singleExec())
emitMessage(Error, message, details);
}
@@ -358,34 +359,6 @@ void Location::information(const QString &message)
}
/*!
- Prints \a message to \c stderr followed by a \c{'\n'},
- but only if the -log-progress option is set.
- */
-void Location::logToStdErr(const QString &message)
-{
- if (logProgress_) {
- fprintf(stderr, "LOG: %s\n", message.toLatin1().data());
- fflush(stderr);
- }
-}
-
-/*!
- Always prints the current time and \a message to \c stderr
- followed by a \c{'\n'}.
- */
-void Location::logToStdErrAlways(const QString &message)
-{
- if (Generator::useTimestamps()) {
- QTime t = QTime::currentTime();
- fprintf(stderr, "%s LOG: %s\n", t.toString().toLatin1().constData(),
- message.toLatin1().data());
- } else {
- fprintf(stderr, "LOG: %s\n", message.toLatin1().constData());
- }
- fflush(stderr);
-}
-
-/*!
Report a program bug, including the \a hint.
*/
void Location::internalError(const QString &hint)
diff --git a/src/qdoc/location.h b/src/qdoc/location.h
index f6704ca87..68ab28845 100644
--- a/src/qdoc/location.h
+++ b/src/qdoc/location.h
@@ -84,10 +84,6 @@ public:
static void terminate();
static void information(const QString &message);
static void internalError(const QString &hint);
- static void logToStdErr(const QString &message);
- static void logToStdErrAlways(const QString &message);
- static void startLoggingProgress() { logProgress_ = true; }
- static void stopLoggingProgress() { logProgress_ = false; }
static QString canonicalRelativePath(const QString &path);
static int exitCode();
@@ -119,7 +115,6 @@ private:
static QString programName;
static QString project;
static QRegExp *spuriousRegExp;
- static bool logProgress_;
};
Q_DECLARE_TYPEINFO(Location::StackEntry, Q_MOVABLE_TYPE);
Q_DECLARE_TYPEINFO(Location, Q_COMPLEX_TYPE); // stkTop = &stkBottom
diff --git a/src/qdoc/main.cpp b/src/qdoc/main.cpp
index 87a1b4b2d..96e93c015 100644
--- a/src/qdoc/main.cpp
+++ b/src/qdoc/main.cpp
@@ -160,9 +160,9 @@ static void loadIndexFiles(const QSet<QString> &formats)
// Remove self-dependencies and possible duplicates
config.dependModules().removeAll(config.getString(CONFIG_PROJECT).toLower());
config.dependModules().removeDuplicates();
- Location::logToStdErrAlways(QString("qdocconf file has depends = *;"
- " loading all %1 index files found")
- .arg(config.dependModules().count()));
+ qCCritical(lcQdoc) << "qdocconf file has depends = *; loading all "
+ << config.dependModules().count()
+ << " index files found";
}
for (const auto &module : config.dependModules()) {
QVector<QFileInfo> foundIndices;
@@ -237,13 +237,13 @@ void logStartEndMessage(const QLatin1String &startStop, const Config &config)
const QString runName = " qdoc for "
+ config.getString(CONFIG_PROJECT)
+ QLatin1String(" in ")
- + QLatin1String(Generator::singleExec() ? "single" : "dual")
+ + QLatin1String(config.singleExec() ? "single" : "dual")
+ QLatin1String(" process mode, (")
- + QLatin1String(Generator::preparing() ? "prepare" : "generate")
+ + QLatin1String(config.preparing() ? "prepare" : "generate")
+ QLatin1String(" phase)");
const QString msg = startStop + runName;
- Location::logToStdErrAlways(msg);
+ qCInfo(lcQdoc) << msg.data();
}
/*!
@@ -269,8 +269,7 @@ static void processQdocconfFile(const QString &fileName)
config.load(fileName);
QString project = config.getString(CONFIG_PROJECT);
if (project.isEmpty()) {
- Location::logToStdErrAlways(
- QLatin1String("qdoc can't run; no project set in qdocconf file"));
+ qCCritical(lcQdoc) << QLatin1String("qdoc can't run; no project set in qdocconf file");
exit(1);
}
Location::terminate();
@@ -359,14 +358,14 @@ static void processQdocconfFile(const QString &fileName)
Location outputFormatsLocation = config.lastLocation();
qdb->clearSearchOrder();
- if (!Generator::singleExec()) {
- if (!Generator::preparing()) {
+ if (!config.singleExec()) {
+ if (!config.preparing()) {
qCDebug(lcQdoc, " loading index files");
loadIndexFiles(outputFormats);
qCDebug(lcQdoc, " done loading index files");
}
qdb->newPrimaryTree(project);
- } else if (Generator::preparing())
+ } else if (config.preparing())
qdb->newPrimaryTree(project);
else
qdb->setPrimaryTree(project);
@@ -410,7 +409,7 @@ static void processQdocconfFile(const QString &fileName)
}
Generator::augmentImageDirs(exampleImageDirs);
- if (Generator::dualExec() || Generator::preparing()) {
+ if (config.dualExec() || config.preparing()) {
QStringList headerList;
QStringList sourceList;
@@ -479,7 +478,7 @@ static void processQdocconfFile(const QString &fileName)
add it to the big tree.
*/
parsed = 0;
- Location::logToStdErrAlways("Parse source files for " + project);
+ qCInfo(lcQdoc) << "Parse source files for " << project;
for (const auto &key : sources.keys()) {
auto *codeParser = CodeParser::parserForSourceFile(key);
if (codeParser) {
@@ -488,7 +487,7 @@ static void processQdocconfFile(const QString &fileName)
codeParser->parseSourceFile(config.location(), key);
}
}
- Location::logToStdErrAlways("Source files parsed for " + project);
+ qCInfo(lcQdoc) << "Source files parsed for " << project;
}
/*
Now the primary tree has been built from all the header and
@@ -586,14 +585,14 @@ int main(int argc, char **argv)
if (config.singleExec())
qdocFiles = Config::loadMaster(qdocFiles.at(0));
- if (Generator::singleExec()) {
+ if (config.singleExec()) {
// single qdoc process for prepare and generate phases
- Generator::setQDocPass(Generator::Prepare);
+ config.setQDocPass(Config::Prepare);
for (const auto &file : qAsConst(qdocFiles)) {
config.dependModules().clear();
processQdocconfFile(file);
}
- Generator::setQDocPass(Generator::Generate);
+ config.setQDocPass(Config::Generate);
QDocDatabase::qdocDB()->processForest();
for (const auto &file : qAsConst(qdocFiles)) {
config.dependModules().clear();
diff --git a/src/qdoc/qdocdatabase.cpp b/src/qdoc/qdocdatabase.cpp
index 2297c237d..966fb8aaa 100644
--- a/src/qdoc/qdocdatabase.cpp
+++ b/src/qdoc/qdocdatabase.cpp
@@ -1102,7 +1102,8 @@ const NodeMap &QDocDatabase::getSinceMap(const QString &key)
*/
void QDocDatabase::resolveStuff()
{
- if (Generator::dualExec() || Generator::preparing()) {
+ const auto &config = Config::instance();
+ if (config.dualExec() || config.preparing()) {
// order matters
primaryTree()->resolveBaseClasses(primaryTreeRoot());
primaryTree()->resolvePropertyOverriddenFromPtrs(primaryTreeRoot());
@@ -1116,19 +1117,19 @@ void QDocDatabase::resolveStuff()
primaryTree()->resolveCppToQmlLinks();
primaryTree()->resolveUsingClauses();
}
- if (Generator::singleExec() && Generator::generating()) {
+ if (config.singleExec() && config.generating()) {
primaryTree()->resolveBaseClasses(primaryTreeRoot());
primaryTree()->resolvePropertyOverriddenFromPtrs(primaryTreeRoot());
primaryTreeRoot()->resolveQmlInheritance();
primaryTree()->resolveCppToQmlLinks();
primaryTree()->resolveUsingClauses();
}
- if (Generator::generating()) {
+ if (config.generating()) {
resolveNamespaces();
resolveProxies();
resolveBaseClasses();
}
- if (Generator::dualExec())
+ if (config.dualExec())
QDocIndexFiles::destroyQDocIndexFiles();
}
diff --git a/src/qdoc/qdocindexfiles.cpp b/src/qdoc/qdocindexfiles.cpp
index 6a09571dd..f51526ab1 100644
--- a/src/qdoc/qdocindexfiles.cpp
+++ b/src/qdoc/qdocindexfiles.cpp
@@ -32,6 +32,7 @@
#include "config.h"
#include "generator.h"
#include "location.h"
+#include "loggingcategory.h"
#include "qdocdatabase.h"
#include "qdoctagfiles.h"
@@ -109,8 +110,7 @@ void QDocIndexFiles::destroyQDocIndexFiles()
void QDocIndexFiles::readIndexes(const QStringList &indexFiles)
{
for (const QString &file : indexFiles) {
- QString msg = "Loading index file: " + file;
- Location::logToStdErr(msg);
+ qCInfo(lcQdoc) << "Loading index file: " << file;
readIndexFile(file);
}
}
@@ -1522,8 +1522,7 @@ void QDocIndexFiles::generateIndex(const QString &fileName, const QString &url,
if (!file.open(QFile::WriteOnly | QFile::Text))
return;
- QString msg = "Writing index file: " + fileName;
- Location::logToStdErr(msg);
+ qCInfo(lcQdoc) << "Writing index file: " << fileName;
gen_ = g;
QXmlStreamWriter writer(&file);
diff --git a/src/qdoc/tree.cpp b/src/qdoc/tree.cpp
index 2cc36736f..f6477b6b1 100644
--- a/src/qdoc/tree.cpp
+++ b/src/qdoc/tree.cpp
@@ -78,9 +78,9 @@ Tree::Tree(const QString &camelCaseModuleName, QDocDatabase *qdb)
{
root_.setPhysicalModuleName(physicalModuleName_);
root_.setTree(this);
- if (Generator::writeQaPages()) {
+ const auto &config = Config::instance();
+ if (config.getBool(CONFIG_WRITEQAPAGES))
targetListMap_ = new TargetListMap;
- }
}
/*!
@@ -104,7 +104,8 @@ Tree::~Tree()
}
nodesByTargetRef_.clear();
nodesByTargetTitle_.clear();
- if (Generator::writeQaPages() && targetListMap_) {
+ const auto &config = Config::instance();
+ if (config.getBool(CONFIG_WRITEQAPAGES) && targetListMap_) {
for (auto target = targetListMap_->begin(); target != targetListMap_->end(); ++target) {
TargetList *tlist = target.value();
if (tlist) {
diff --git a/tests/auto/qdoc/generatedoutput/testdata/configs/testcpp_singleexec.qdocconf b/tests/auto/qdoc/generatedoutput/testdata/configs/testcpp_singleexec.qdocconf
new file mode 100644
index 000000000..2ca75ea0a
--- /dev/null
+++ b/tests/auto/qdoc/generatedoutput/testdata/configs/testcpp_singleexec.qdocconf
@@ -0,0 +1,6 @@
+include(testcpp.qdocconf)
+
+# Config::getOutputDir() forces a subdir in single-exec mode (why?),
+# disable it here explicitly
+HTML.nosubdirs = true
+HTML.outputsubdir = .
diff --git a/tests/auto/qdoc/generatedoutput/testdata/crossmodule/crossmodule_singleexec.qdocconf b/tests/auto/qdoc/generatedoutput/testdata/crossmodule/crossmodule_singleexec.qdocconf
new file mode 100644
index 000000000..d49498ec0
--- /dev/null
+++ b/tests/auto/qdoc/generatedoutput/testdata/crossmodule/crossmodule_singleexec.qdocconf
@@ -0,0 +1,4 @@
+include(crossmodule.qdocconf)
+
+HTML.nosubdirs = true
+HTML.outputsubdir = crossmodule
diff --git a/tests/auto/qdoc/generatedoutput/testdata/singleexec/singleexec.qdocconf b/tests/auto/qdoc/generatedoutput/testdata/singleexec/singleexec.qdocconf
new file mode 100644
index 000000000..eee0253d0
--- /dev/null
+++ b/tests/auto/qdoc/generatedoutput/testdata/singleexec/singleexec.qdocconf
@@ -0,0 +1,2 @@
+./testdata/configs/testcpp_singleexec.qdocconf
+./testdata/crossmodule/crossmodule_singleexec.qdocconf
diff --git a/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp b/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp
index 3c47627b3..b3509dfff 100644
--- a/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp
+++ b/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp
@@ -64,6 +64,7 @@ private slots:
void inheritedQmlPropertyGroups();
void crossModuleLinking();
void includeFromExampleDirs();
+ void singleExec();
private:
QScopedPointer<QTemporaryDir> m_outputDir;
@@ -343,6 +344,20 @@ void tst_generatedOutput::includeFromExampleDirs()
"includefromexampledirs/qml-qdoc-test-abstractparent-members.html");
}
+void tst_generatedOutput::singleExec()
+{
+ // Build both testcpp and crossmodule projects in single-exec mode
+ testAndCompare("testdata/singleexec/singleexec.qdocconf",
+ "testcpp-module.html "
+ "testqdoc-test.html "
+ "testqdoc-test-members.html "
+ "testqdoc.html "
+ "crossmodule/testtype.html "
+ "crossmodule/testtype-members.html",
+ "-single-exec");
+}
+
+
QTEST_APPLESS_MAIN(tst_generatedOutput)
#include "tst_generatedoutput.moc"