diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-12-08 15:00:45 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-12-12 10:26:49 +0100 |
| commit | 9cde3eafa776f1c942db6535fbf4303b35ccc73e (patch) | |
| tree | 5c1c858b7fa62d265d3b5ace7c95ed38169af41c /sources/shiboken6/ApiExtractor/docparser.cpp | |
| parent | d8003770fc55c5bf6c0857797f5a416d01d73d94 (diff) | |
DocGenerator: Further preparations for generating global functions/enums
QtDocGenerator::writeInjectDocumentation() previously had class and
function as parameters and was used for class documentation (function
== 0) as well as function documentation.
Split it into separate functions for both cases such that class can be
0 in the function case for global functions.
Remove the indentation, which appeared to be misguided.
Add separate functions for querying the XPATH modifications.
Task-number: PYSIDE-1106
Task-number: PYSIDE-2543
Change-Id: I78a25f100b810abb542d82be56c4473816bb8c82
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/shiboken6/ApiExtractor/docparser.cpp')
| -rw-r--r-- | sources/shiboken6/ApiExtractor/docparser.cpp | 113 |
1 files changed, 81 insertions, 32 deletions
diff --git a/sources/shiboken6/ApiExtractor/docparser.cpp b/sources/shiboken6/ApiExtractor/docparser.cpp index dbb09842a..2ea764a21 100644 --- a/sources/shiboken6/ApiExtractor/docparser.cpp +++ b/sources/shiboken6/ApiExtractor/docparser.cpp @@ -31,6 +31,26 @@ using namespace Qt::StringLiterals; +static inline bool isXpathDocModification(const DocModification &mod) +{ + return mod.mode() == TypeSystem::DocModificationXPathReplace; +} + +static inline bool isNotXpathDocModification(const DocModification &mod) +{ + return mod.mode() != TypeSystem::DocModificationXPathReplace; +} + +static void removeXpathDocModifications(DocModificationList *l) +{ + l->erase(std::remove_if(l->begin(), l->end(), isXpathDocModification), l->end()); +} + +static void removeNonXpathDocModifications(DocModificationList *l) +{ + l->erase(std::remove_if(l->begin(), l->end(), isNotXpathDocModification), l->end()); +} + DocParser::DocParser() { #ifdef HAVE_LIBXSLT @@ -86,22 +106,59 @@ bool DocParser::skipForQuery(const AbstractMetaFunctionCPtr &func) usesRValueReference); } -DocModificationList DocParser::getDocModifications(const AbstractMetaClassCPtr &cppClass, - const AbstractMetaFunctionCPtr &func) +DocModificationList DocParser::getDocModifications(const AbstractMetaClassCPtr &cppClass) + { - auto te = cppClass->typeEntry(); - if (!func) - return te->docModifications(); + auto result = cppClass->typeEntry()->docModifications(); + removeXpathDocModifications(&result); + return result; +} - if (func->isUserAdded()) - return func->addedFunctionDocModifications(); +static void filterBySignature(const AbstractMetaFunctionCPtr &func, DocModificationList *l) +{ + if (!l->isEmpty()) { + const QString minimalSignature = func->minimalSignature(); + const auto filter = [&minimalSignature](const DocModification &mod) { + return mod.signature() != minimalSignature; + }; + l->erase(std::remove_if(l->begin(), l->end(), filter), l->end()); + } +} + +DocModificationList DocParser::getDocModifications(const AbstractMetaFunctionCPtr &func, + const AbstractMetaClassCPtr &cppClass) +{ + DocModificationList result; + if (func->isUserAdded()) { + result = func->addedFunctionDocModifications(); + removeXpathDocModifications(&result); + } else if (cppClass != nullptr) { + result = cppClass->typeEntry()->functionDocModifications(); + removeXpathDocModifications(&result); + filterBySignature(func, &result); + } + return result; +} + +DocModificationList DocParser::getXpathDocModifications(const AbstractMetaClassCPtr &cppClass) +{ + auto result = cppClass->typeEntry()->docModifications(); + removeNonXpathDocModifications(&result); + return result; +} - DocModificationList result = te->functionDocModifications(); - const QString minimalSignature = func->minimalSignature(); - const auto filter = [&minimalSignature](const DocModification &mod) { - return mod.signature() != minimalSignature; - }; - result.erase(std::remove_if(result.begin(), result.end(), filter), result.end()); +DocModificationList DocParser::getXpathDocModifications(const AbstractMetaFunctionCPtr &func, + const AbstractMetaClassCPtr &cppClass) +{ + DocModificationList result; + if (func->isUserAdded()) { + result = func->addedFunctionDocModifications(); + removeNonXpathDocModifications(&result); + } else if (cppClass != nullptr) { + result = cppClass->typeEntry()->functionDocModifications(); + removeNonXpathDocModifications(&result); + filterBySignature(func, &result); + } return result; } @@ -131,12 +188,8 @@ AbstractMetaFunctionCList DocParser::documentableFunctions(const AbstractMetaCla return result; } -static inline bool isXpathDocModification(const DocModification &mod) -{ - return mod.mode() == TypeSystem::DocModificationXPathReplace; -} - -QString DocParser::applyDocModifications(const DocModificationList& mods, const QString& xml) +QString DocParser::applyDocModifications(const DocModificationList& xpathMods, + const QString& xml) { const char xslPrefix[] = R"(<xsl:template match="/"> @@ -150,32 +203,28 @@ R"(<xsl:template match="/"> </xsl:template> )"; - if (mods.isEmpty() || xml.isEmpty() - || !std::any_of(mods.cbegin(), mods.cend(), isXpathDocModification)) { + if (xpathMods.isEmpty() || xml.isEmpty()) return xml; - } QString xsl = QLatin1StringView(xslPrefix); - for (const DocModification &mod : mods) { - if (isXpathDocModification(mod)) { - QString xpath = mod.xpath(); - xpath.replace(u'"', u"""_s); - xsl += u"<xsl:template match=\""_s - + xpath + u"\">"_s - + mod.code() + u"</xsl:template>\n"_s; - } + for (const DocModification &mod : xpathMods) { + Q_ASSERT(isXpathDocModification(mod)); + QString xpath = mod.xpath(); + xpath.replace(u'"', u"""_s); + xsl += "<xsl:template match=\""_L1 + xpath + "\">"_L1 + + mod.code() + "</xsl:template>\n"_L1; } QString errorMessage; const QString result = xsl_transform(xml, xsl, &errorMessage); if (!errorMessage.isEmpty()) qCWarning(lcShibokenDoc, "%s", - qPrintable(msgXpathDocModificationError(mods, errorMessage))); + qPrintable(msgXpathDocModificationError(xpathMods, errorMessage))); if (result == xml) { const QString message = u"Query did not result in any modifications to \""_s + xml + u'"'; qCWarning(lcShibokenDoc, "%s", - qPrintable(msgXpathDocModificationError(mods, message))); + qPrintable(msgXpathDocModificationError(xpathMods, message))); } return result; } |
