diff options
Diffstat (limited to 'src/qdoc/config.cpp')
-rw-r--r-- | src/qdoc/config.cpp | 168 |
1 files changed, 102 insertions, 66 deletions
diff --git a/src/qdoc/config.cpp b/src/qdoc/config.cpp index 934958910..9ff22c8b1 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,7 +56,7 @@ QString ConfigStrings::CPPCLASSESTITLE = QStringLiteral("cppclassestitle"); QString ConfigStrings::DEFINES = QStringLiteral("defines"); QString ConfigStrings::DEPENDS = QStringLiteral("depends"); QString ConfigStrings::DESCRIPTION = QStringLiteral("description"); -QString ConfigStrings::EDITION = QStringLiteral("edition"); +QString ConfigStrings::DOCBOOKEXTENSIONS = QStringLiteral("usedocbookextensions"); QString ConfigStrings::ENDHEADER = QStringLiteral("endheader"); QString ConfigStrings::EXAMPLEDIRS = QStringLiteral("exampledirs"); QString ConfigStrings::EXAMPLES = QStringLiteral("examples"); @@ -73,6 +73,7 @@ QString ConfigStrings::HEADERSTYLES = QStringLiteral("headerstyles"); QString ConfigStrings::HOMEPAGE = QStringLiteral("homepage"); QString ConfigStrings::HOMETITLE = QStringLiteral("hometitle"); QString ConfigStrings::IGNOREDIRECTIVES = QStringLiteral("ignoredirectives"); +QString ConfigStrings::IGNORESINCE = QStringLiteral("ignoresince"); QString ConfigStrings::IGNORETOKENS = QStringLiteral("ignoretokens"); QString ConfigStrings::IGNOREWORDS = QStringLiteral("ignorewords"); QString ConfigStrings::IMAGEDIRS = QStringLiteral("imagedirs"); @@ -82,6 +83,8 @@ QString ConfigStrings::INDEXES = QStringLiteral("indexes"); 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"); @@ -114,6 +117,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"); @@ -235,15 +239,14 @@ QStringList MetaStack::getExpanded(const Location &location) } const QString Config::dot = QLatin1String("."); -bool Config::debug_ = false; +bool Config::m_debug = false; bool Config::generateExamples = true; QString Config::overrideOutputDir; QString Config::installDir; QSet<QString> Config::overrideOutputFormats; -QMap<QString, QString> Config::extractedDirs; -int Config::numInstances; -QStack<QString> Config::workingDirs_; -QMap<QString, QStringList> Config::includeFilesMap_; +QMap<QString, QString> Config::m_extractedDirs; +QStack<QString> Config::m_workingDirs; +QMap<QString, QStringList> Config::m_includeFilesMap; /*! \class Config @@ -254,13 +257,13 @@ QMap<QString, QStringList> Config::includeFilesMap_; */ /*! - The constructor sets the \a programName and initializes all + Initializes the Config with \a programName and sets all internal state variables to either default values or to ones defined in command line arguments \a args. */ -Config::Config(const QString &programName, const QStringList &args) : prog(programName) +void Config::init(const QString &programName, const QStringList &args) { - ++numInstances; + m_prog = programName; processCommandLineOptions(args); reset(); } @@ -275,9 +278,9 @@ Config::~Config() */ void Config::clear() { - loc = lastLocation_ = Location(); - configVars_.clear(); - includeFilesMap_.clear(); + m_location = m_lastLocation = Location(); + m_configVars.clear(); + m_includeFilesMap.clear(); } /*! @@ -294,6 +297,7 @@ void Config::reset() setStringList(CONFIG_LANGUAGE, QStringList("Cpp")); // i.e. C++ setStringList(CONFIG_OUTPUTFORMATS, QStringList("HTML")); setStringList(CONFIG_TABSIZE, QStringList("8")); + setStringList(CONFIG_LOCATIONINFO, QStringList("true")); // Publish options from the command line as config variables const auto setListFlag = [this](const QString &key, bool test) { @@ -324,21 +328,25 @@ void Config::reset() void Config::load(const QString &fileName) { // Reset if a previous project was loaded - if (configVars_.contains(CONFIG_PROJECT)) + if (m_configVars.contains(CONFIG_PROJECT)) reset(); load(Location(), fileName); - if (loc.isEmpty()) - loc = Location(fileName); + if (m_location.isEmpty()) + m_location = Location(fileName); else - loc.setEtc(true); - lastLocation_ = Location(); + m_location.setEtc(true); + m_lastLocation = Location(); // Add defines and includepaths from command line to their // respective configuration variables. Values set here are // always added to what's defined in configuration file. insertStringList(CONFIG_DEFINES, m_defines); insertStringList(CONFIG_INCLUDEPATHS, m_includePaths); + + // Prefetch values that are used internally + m_exampleFiles = getCanonicalPathList(CONFIG_EXAMPLES); + m_exampleDirs = getCanonicalPathList(CONFIG_EXAMPLEDIRS); } /*! @@ -346,7 +354,7 @@ void Config::load(const QString &fileName) */ void Config::setStringList(const QString &var, const QStringList &values) { - configVars_.replace(var, ConfigVar(var, values, QDir::currentPath())); + m_configVars.replace(var, ConfigVar(var, values, QDir::currentPath())); } /*! @@ -355,7 +363,7 @@ void Config::setStringList(const QString &var, const QStringList &values) */ void Config::insertStringList(const QString &var, const QStringList &values) { - configVars_.insert(var, ConfigVar(var, values, QDir::currentPath())); + m_configVars.insert(var, ConfigVar(var, values, QDir::currentPath())); } /*! @@ -380,21 +388,22 @@ void Config::processCommandLineOptions(const QStringList &args) for (const auto &format : outputFormats) overrideOutputFormats.insert(format); - debug_ = m_parser.isSet(m_parser.debugOption); + m_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)) + setStringList(CONFIG_DOCBOOKEXTENSIONS, QStringList("true")); } void Config::setIncludePaths() @@ -422,7 +431,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()); } @@ -467,7 +476,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(); } @@ -512,21 +521,21 @@ QSet<QString> Config::getOutputFormats() const */ QString Config::getString(const QString &var, const QString &defaultString) const { - QList<ConfigVar> configVars = configVars_.values(var); + QList<ConfigVar> configVars = m_configVars.values(var); if (!configVars.empty()) { QString value(""); int i = configVars.size() - 1; while (i >= 0) { const ConfigVar &cv = configVars[i]; - if (!cv.location_.isEmpty()) - const_cast<Config *>(this)->lastLocation_ = cv.location_; - if (!cv.values_.isEmpty()) { - if (!cv.plus_) + if (!cv.m_location.isEmpty()) + const_cast<Config *>(this)->m_lastLocation = cv.m_location; + if (!cv.m_values.isEmpty()) { + if (!cv.m_plus) value.clear(); - for (int j = 0; j < cv.values_.size(); ++j) { + for (int j = 0; j < cv.m_values.size(); ++j) { if (!value.isEmpty() && !value.endsWith(QChar('\n'))) value.append(QChar(' ')); - value.append(cv.values_[j]); + value.append(cv.m_values[j]); } } --i; @@ -562,17 +571,17 @@ QSet<QString> Config::getStringSet(const QString &var) const */ QStringList Config::getStringList(const QString &var) const { - QList<ConfigVar> configVars = configVars_.values(var); + QList<ConfigVar> configVars = m_configVars.values(var); QStringList values; if (!configVars.empty()) { int i = configVars.size() - 1; while (i >= 0) { - if (!configVars[i].location_.isEmpty()) - const_cast<Config *>(this)->lastLocation_ = configVars[i].location_; - if (configVars[i].plus_) - values.append(configVars[i].values_); + if (!configVars[i].m_location.isEmpty()) + const_cast<Config *>(this)->m_lastLocation = configVars[i].m_location; + if (configVars[i].m_plus) + values.append(configVars[i].m_values); else - values = configVars[i].values_; + values = configVars[i].m_values; --i; } } @@ -597,17 +606,17 @@ QStringList Config::getStringList(const QString &var) const QStringList Config::getCanonicalPathList(const QString &var, bool validate) const { QStringList t; - QList<ConfigVar> configVars = configVars_.values(var); + QList<ConfigVar> configVars = m_configVars.values(var); if (!configVars.empty()) { int i = configVars.size() - 1; while (i >= 0) { const ConfigVar &cv = configVars[i]; - if (!cv.location_.isEmpty()) - const_cast<Config *>(this)->lastLocation_ = cv.location_; - if (!cv.plus_) + if (!cv.m_location.isEmpty()) + const_cast<Config *>(this)->m_lastLocation = cv.m_location; + if (!cv.m_plus) t.clear(); - const QString d = cv.currentPath_; - const QStringList &sl = cv.values_; + const QString d = cv.m_currentPath; + const QStringList &sl = cv.m_values; if (!sl.isEmpty()) { t.reserve(t.size() + sl.size()); for (int i = 0; i < sl.size(); ++i) { @@ -616,7 +625,7 @@ QStringList Config::getCanonicalPathList(const QString &var, bool validate) cons if (dir.isRelative()) dir.setPath(d + QLatin1Char('/') + path); if (validate && !QFileInfo::exists(dir.path())) - lastLocation_.warning(tr("Cannot find file or directory: %1").arg(path)); + m_lastLocation.warning(tr("Cannot find file or directory: %1").arg(path)); else { QString canonicalPath = dir.canonicalPath(); if (!canonicalPath.isEmpty()) @@ -681,7 +690,7 @@ QSet<QString> Config::subVars(const QString &var) const { QSet<QString> result; QString varDot = var + QLatin1Char('.'); - for (auto it = configVars_.constBegin(); it != configVars_.constEnd(); ++it) { + for (auto it = m_configVars.constBegin(); it != m_configVars.constEnd(); ++it) { if (it.key().startsWith(varDot)) { QString subVar = it.key().mid(varDot.length()); int dot = subVar.indexOf(QLatin1Char('.')); @@ -702,7 +711,7 @@ QSet<QString> Config::subVars(const QString &var) const void Config::subVarsAndValues(const QString &var, ConfigVarMultimap &t) const { QString varDot = var + QLatin1Char('.'); - for (auto it = configVars_.constBegin(); it != configVars_.constEnd(); ++it) { + for (auto it = m_configVars.constBegin(); it != m_configVars.constEnd(); ++it) { if (it.key().startsWith(varDot)) { QString subVar = it.key().mid(varDot.length()); int dot = subVar.indexOf(QLatin1Char('.')); @@ -721,7 +730,7 @@ QString Config::getIncludeFilePath(const QString &fileName) const QString ext = fileName.mid(fileName.lastIndexOf('.')); ext.prepend('*'); - if (!includeFilesMap_.contains(ext)) { + if (!m_includeFilesMap.contains(ext)) { QSet<QString> t; QStringList result; const auto sourceDirs = getCanonicalPathList(CONFIG_SOURCEDIRS); @@ -731,9 +740,9 @@ QString Config::getIncludeFilePath(const QString &fileName) const const auto exampleDirs = getCanonicalPathList(CONFIG_EXAMPLEDIRS); for (const auto &dir : exampleDirs) result += getFilesHere(dir, ext, location(), t, t); - includeFilesMap_.insert(ext, result); + m_includeFilesMap.insert(ext, result); } - const QStringList &paths = (*includeFilesMap_.find(ext)); + const QStringList &paths = (*m_includeFilesMap.find(ext)); for (const auto &path : paths) { if (path.endsWith(fileName)) return path; @@ -789,6 +798,32 @@ QStringList Config::getExampleImageFiles(const QSet<QString> &excludedDirs, } /*! + Returns the path to the project file for \a examplePath, or an empty string + if no project file was found. + */ +QString Config::getExampleProjectFile(const QString &examplePath) +{ + QFileInfo fileInfo(examplePath); + QStringList validNames; + validNames << fileInfo.fileName() + QLatin1String(".pro") + << fileInfo.fileName() + QLatin1String(".qmlproject") + << fileInfo.fileName() + QLatin1String(".pyproject") + << QLatin1String("CMakeLists.txt") + << QLatin1String("qbuild.pro"); // legacy + + QString projectFile; + + for (const auto &name : qAsConst(validNames)) { + projectFile = Config::findFile(Location(), m_exampleFiles, m_exampleDirs, + examplePath + QLatin1Char('/') + name); + if (!projectFile.isEmpty()) + return projectFile; + } + + return projectFile; +} + +/*! \a fileName is the path of the file to find. \a files and \a dirs are the lists where we must find the @@ -839,7 +874,7 @@ QString Config::findFile(const Location &location, const QStringList &files, userFriendlyFilePath->append(*c); if (isArchive) { - QString extracted = extractedDirs[fileInfo.filePath()]; + QString extracted = m_extractedDirs[fileInfo.filePath()]; ++c; fileInfo.setFile(QDir(extracted), *c); } else { @@ -987,9 +1022,10 @@ QStringList Config::loadMaster(const QString &fileName) stream.setCodec("UTF-8"); #endif QStringList qdocFiles; + QDir configDir(QFileInfo(fileName).canonicalPath()); QString line = stream.readLine(); while (!line.isNull()) { - qdocFiles.append(line); + qdocFiles.append(QFileInfo(configDir, line).filePath()); line = stream.readLine(); } fin.close(); @@ -1214,9 +1250,9 @@ void Config::load(Location location, const QString &fileName) keyLoc.fatal(tr("Invalid key '%1'").arg(key)); ConfigVarMultimap::Iterator i; - i = configVars_.insert(key, + i = m_configVars.insert(key, ConfigVar(key, rhsValues, QDir::currentPath(), keyLoc)); - i.value().plus_ = plus; + i.value().m_plus = plus; } } } else { @@ -1224,8 +1260,8 @@ void Config::load(Location location, const QString &fileName) } } popWorkingDir(); - if (!workingDirs_.isEmpty()) - QDir::setCurrent(workingDirs_.top()); + if (!m_workingDirs.isEmpty()) + QDir::setCurrent(m_workingDirs.top()); } bool Config::isFileExcluded(const QString &fileName, const QSet<QString> &excludedFiles) @@ -1279,7 +1315,7 @@ QStringList Config::getFilesHere(const QString &uncleanDir, const QString &nameF */ void Config::pushWorkingDir(const QString &dir) { - workingDirs_.push(dir); + m_workingDirs.push(dir); } /*! @@ -1288,8 +1324,8 @@ void Config::pushWorkingDir(const QString &dir) */ QString Config::popWorkingDir() { - if (!workingDirs_.isEmpty()) - return workingDirs_.pop(); + if (!m_workingDirs.isEmpty()) + return m_workingDirs.pop(); qDebug() << "RETURNED EMPTY WORKING DIR"; return QString(); |