diff options
Diffstat (limited to 'sources/shiboken6/ApiExtractor/doxygenparser.cpp')
-rw-r--r-- | sources/shiboken6/ApiExtractor/doxygenparser.cpp | 130 |
1 files changed, 56 insertions, 74 deletions
diff --git a/sources/shiboken6/ApiExtractor/doxygenparser.cpp b/sources/shiboken6/ApiExtractor/doxygenparser.cpp index a731479c3..da790015f 100644 --- a/sources/shiboken6/ApiExtractor/doxygenparser.cpp +++ b/sources/shiboken6/ApiExtractor/doxygenparser.cpp @@ -1,57 +1,38 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt for Python. -** -** $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$ -** -****************************************************************************/ +// Copyright (C) 2020 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "doxygenparser.h" +#include "abstractmetaargument.h" #include "abstractmetalang.h" #include "abstractmetafield.h" #include "abstractmetafunction.h" #include "abstractmetaenum.h" +#include "abstractmetatype.h" #include "documentation.h" #include "messages.h" #include "modifications.h" #include "propertyspec.h" #include "reporthandler.h" -#include "typesystem.h" +#include "complextypeentry.h" #include "xmlutils.h" +#include "qtcompat.h" + #include <QtCore/QFile> #include <QtCore/QDir> +using namespace Qt::StringLiterals; + static QString getSectionKindAttr(const AbstractMetaFunctionCPtr &func) { if (func->isSignal()) - return QLatin1String("signal"); + return u"signal"_s; QString kind = func->isPublic() - ? QLatin1String("public") : QLatin1String("protected"); + ? u"public"_s : u"protected"_s; if (func->isStatic()) - kind += QLatin1String("-static"); + kind += u"-static"_s; else if (func->isSlot()) - kind += QLatin1String("-slot"); + kind += u"-slot"_s; return kind; } @@ -60,7 +41,7 @@ Documentation DoxygenParser::retrieveModuleDocumentation() return retrieveModuleDocumentation(packageName()); } -void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) +void DoxygenParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) { if (!metaClass) return; @@ -68,18 +49,17 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) QString doxyFileSuffix; if (metaClass->enclosingClass()) { doxyFileSuffix += metaClass->enclosingClass()->name(); - doxyFileSuffix += QLatin1String("_1_1"); // FIXME: Check why _1_1!! + doxyFileSuffix += u"_1_1"_s; // FIXME: Check why _1_1!! } doxyFileSuffix += metaClass->name(); - doxyFileSuffix += QLatin1String(".xml"); + doxyFileSuffix += u".xml"_s; - const char* prefixes[] = { "class", "struct", "namespace" }; + static constexpr QLatin1StringView prefixes[] = { "class"_L1, "struct"_L1, "namespace"_L1 }; bool isProperty = false; QString doxyFilePath; - for (const char *prefix : prefixes) { - doxyFilePath = documentationDataDirectory() + QLatin1Char('/') - + QLatin1String(prefix) + doxyFileSuffix; + for (const auto &prefix : prefixes) { + doxyFilePath = documentationDataDirectory() + u'/' + prefix + doxyFileSuffix; if (QFile::exists(doxyFilePath)) break; doxyFilePath.clear(); @@ -95,20 +75,20 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) QString errorMessage; XQueryPtr xquery = XQuery::create(doxyFilePath, &errorMessage); - if (xquery.isNull()) { + if (!xquery) { qCWarning(lcShibokenDoc, "%s", qPrintable(errorMessage)); return; } - static const QList<QPair<Documentation::Type, QString>> docTags = { - { Documentation::Brief, QLatin1String("briefdescription") }, - { Documentation::Detailed, QLatin1String("detaileddescription") } + static const QList<std::pair<Documentation::Type, QString>> docTags = { + { Documentation::Brief, u"briefdescription"_s }, + { Documentation::Detailed, u"detaileddescription"_s } }; // Get class documentation Documentation classDoc; for (const auto &tag : docTags) { - const QString classQuery = QLatin1String("/doxygen/compounddef/") + tag.second; + const QString classQuery = u"/doxygen/compounddef/"_s + tag.second; QString doc = getDocumentation(xquery, classQuery, metaClass->typeEntry()->docModifications()); if (doc.isEmpty()) @@ -123,37 +103,37 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) //Functions Documentation const auto &funcs = DocParser::documentableFunctions(metaClass); for (const auto &func : funcs) { - QString query = QLatin1String("/doxygen/compounddef/sectiondef"); + QString query = u"/doxygen/compounddef/sectiondef"_s; // properties if (func->isPropertyReader() || func->isPropertyWriter() || func->isPropertyResetter()) { const auto prop = metaClass->propertySpecs().at(func->propertySpecIndex()); - query += QLatin1String("[@kind=\"property\"]/memberdef/name[text()=\"") - + prop.name() + QLatin1String("\"]"); + query += u"[@kind=\"property\"]/memberdef/name[text()=\""_s + + prop.name() + u"\"]"_s; isProperty = true; } else { // normal methods QString kind = getSectionKindAttr(func); - query += QLatin1String("[@kind=\"") + kind - + QLatin1String("-func\"]/memberdef/name[text()=\"") - + func->originalName() + QLatin1String("\"]"); + query += u"[@kind=\""_s + kind + + u"-func\"]/memberdef/name[text()=\""_s + + func->originalName() + u"\"]"_s; if (func->arguments().isEmpty()) { - QString args = func->isConstant() ? QLatin1String("() const ") : QLatin1String("()"); - query += QLatin1String("/../argsstring[text()=\"") + args + QLatin1String("\"]"); + QString args = func->isConstant() ? u"() const"_s : u"()"_s; + query += u"/../argsstring[text()=\""_s + args + u"\"]"_s; } else { int i = 1; const AbstractMetaArgumentList &arguments = func->arguments(); for (const AbstractMetaArgument &arg : arguments) { if (!arg.type().isPrimitive()) { - query += QLatin1String("/../param[") + QString::number(i) - + QLatin1String("]/type/ref[text()=\"") + query += u"/../param["_s + QString::number(i) + + u"]/type/ref[text()=\""_s + arg.type().cppSignature().toHtmlEscaped() - + QLatin1String("\"]/../.."); + + u"\"]/../.."_s; } else { - query += QLatin1String("/../param[") + QString::number(i) - + QLatin1String("]/type[text(), \"") + query += u"/../param["_s + QString::number(i) + + u"]/type[text(), \""_s + arg.type().cppSignature().toHtmlEscaped() - + QLatin1String("\"]/.."); + + u"\"]/.."_s; } ++i; } @@ -163,22 +143,23 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) for (const auto &tag : docTags) { QString funcQuery(query); if (!isProperty) { - funcQuery += QLatin1String("/../") + tag.second; + funcQuery += u"/../"_s + tag.second; } else { - funcQuery = QLatin1Char('(') + funcQuery; - funcQuery += QLatin1String("/../%1)[1]").arg(tag.second); + funcQuery = u'(' + funcQuery; + funcQuery += u"/../"_s + tag.second + u")[1]"_s; } - QString doc = getDocumentation(xquery, funcQuery, DocModificationList()); + QString doc = getDocumentation(xquery, funcQuery, + DocParser::getXpathDocModifications(func, metaClass)); if (doc.isEmpty()) { qCWarning(lcShibokenDoc, "%s", - qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, func.data(), + qPrintable(msgCannotFindDocumentation(doxyFilePath, func.get(), funcQuery))); } else { funcDoc.setValue(doc, tag.first); } } - qSharedPointerConstCast<AbstractMetaFunction>(func)->setDocumentation(funcDoc); + std::const_pointer_cast<AbstractMetaFunction>(func)->setDocumentation(funcDoc); isProperty = false; } @@ -189,8 +170,8 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) Documentation fieldDoc; for (const auto &tag : docTags) { - QString query = QLatin1String("/doxygen/compounddef/sectiondef/memberdef/name[text()=\"") - + field.name() + QLatin1String("\"]/../") + tag.second; + QString query = u"/doxygen/compounddef/sectiondef/memberdef/name[text()=\""_s + + field.name() + u"\"]/../"_s + tag.second; QString doc = getDocumentation(xquery, query, DocModificationList()); if (doc.isEmpty()) { qCWarning(lcShibokenDoc, "%s", @@ -205,38 +186,39 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) //Enums for (AbstractMetaEnum &meta_enum : metaClass->enums()) { - QString query = QLatin1String("/doxygen/compounddef/sectiondef/memberdef[@kind=\"enum\"]/name[text()=\"") - + meta_enum.name() + QLatin1String("\"]/.."); + QString query = u"/doxygen/compounddef/sectiondef/memberdef[@kind=\"enum\"]/name[text()=\""_s + + meta_enum.name() + u"\"]/.."_s; QString doc = getDocumentation(xquery, query, DocModificationList()); if (doc.isEmpty()) { qCWarning(lcShibokenDoc, "%s", qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, meta_enum, query))); } - meta_enum.setDocumentation(doc); + meta_enum.setDocumentation(Documentation(doc, {})); } } Documentation DoxygenParser::retrieveModuleDocumentation(const QString& name){ - QString sourceFile = documentationDataDirectory() + QLatin1String("/indexpage.xml"); + QString sourceFile = documentationDataDirectory() + u"/indexpage.xml"_s; if (!QFile::exists(sourceFile)) { qCWarning(lcShibokenDoc).noquote().nospace() << "Can't find doxygen XML file for module " << name << ", tried: " << QDir::toNativeSeparators(sourceFile); - return Documentation(); + return {}; } QString errorMessage; XQueryPtr xquery = XQuery::create(sourceFile, &errorMessage); - if (xquery.isNull()) { + if (!xquery) { qCWarning(lcShibokenDoc, "%s", qPrintable(errorMessage)); return {}; } // Module documentation - QString query = QLatin1String("/doxygen/compounddef/detaileddescription"); - return Documentation(getDocumentation(xquery, query, DocModificationList())); + QString query = u"/doxygen/compounddef/detaileddescription"_s; + const QString doc = getDocumentation(xquery, query, DocModificationList()); + return Documentation(doc, {}); } |