diff options
| -rw-r--r-- | sources/shiboken6/ApiExtractor/documentation.cpp | 8 | ||||
| -rw-r--r-- | sources/shiboken6/ApiExtractor/documentation.h | 8 | ||||
| -rw-r--r-- | sources/shiboken6/ApiExtractor/doxygenparser.cpp | 7 | ||||
| -rw-r--r-- | sources/shiboken6/ApiExtractor/qtdocparser.cpp | 17 | ||||
| -rw-r--r-- | sources/shiboken6/ApiExtractor/qtdocparser.h | 1 | ||||
| -rw-r--r-- | sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp | 18 |
6 files changed, 45 insertions, 14 deletions
diff --git a/sources/shiboken6/ApiExtractor/documentation.cpp b/sources/shiboken6/ApiExtractor/documentation.cpp index 33cf0e9fb..0f1bb389b 100644 --- a/sources/shiboken6/ApiExtractor/documentation.cpp +++ b/sources/shiboken6/ApiExtractor/documentation.cpp @@ -7,8 +7,12 @@ Documentation::Documentation(const QString &detailed, const QString &brief, + const QString &sourceFile, Format fmt) : - m_detailed(detailed.trimmed()), m_brief(brief.trimmed()), m_format(fmt) + m_detailed(detailed.trimmed()), + m_brief(brief.trimmed()), + m_sourceFile(sourceFile), + m_format(fmt) { } @@ -54,6 +58,8 @@ QDebug operator<<(QDebug debug, const Documentation &d) debug << "Documentation("; if (!d.isEmpty()) { debug << "format=" << d.format(); + if (d.hasSourceFile()) + debug << ", file=\"" << d.sourceFile() << '"'; if (!d.brief().isEmpty()) debug << ", brief=\"" << d.brief() << '"'; if (!d.detailed().isEmpty()) diff --git a/sources/shiboken6/ApiExtractor/documentation.h b/sources/shiboken6/ApiExtractor/documentation.h index df9d5d614..1f8796e30 100644 --- a/sources/shiboken6/ApiExtractor/documentation.h +++ b/sources/shiboken6/ApiExtractor/documentation.h @@ -26,6 +26,7 @@ public: Documentation() = default; explicit Documentation(const QString &detailed, const QString &brief, + const QString &sourceFile, Format fmt = Documentation::Native); bool isEmpty() const; @@ -44,17 +45,22 @@ public: const QString &brief() const { return m_brief; } void setBrief(const QString &brief); + bool hasSourceFile() const { return !m_sourceFile.isEmpty(); } + const QString &sourceFile() const { return m_sourceFile; } + void setSourceFile(const QString &newSourceFile) { m_sourceFile = newSourceFile; } + private: friend bool comparesEqual(const Documentation &lhs, const Documentation &rhs) noexcept { return lhs.m_format == rhs.m_format && lhs.m_detailed == rhs.m_detailed - && lhs.m_brief == rhs.m_brief; + && lhs.m_brief == rhs.m_brief && lhs.m_sourceFile == rhs.m_sourceFile; } Q_DECLARE_EQUALITY_COMPARABLE(Documentation) QString m_detailed; QString m_brief; + QString m_sourceFile; Format m_format = Documentation::Native; }; diff --git a/sources/shiboken6/ApiExtractor/doxygenparser.cpp b/sources/shiboken6/ApiExtractor/doxygenparser.cpp index c8cae38a5..62fa119b0 100644 --- a/sources/shiboken6/ApiExtractor/doxygenparser.cpp +++ b/sources/shiboken6/ApiExtractor/doxygenparser.cpp @@ -86,6 +86,7 @@ QString DoxygenParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) }; // Get class documentation Documentation classDoc; + classDoc.setSourceFile(doxyFilePath); for (const auto &tag : docTags) { const QString classQuery = u"/doxygen/compounddef/"_s + tag.second; @@ -140,6 +141,7 @@ QString DoxygenParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) } } Documentation funcDoc; + funcDoc.setSourceFile(doxyFilePath); for (const auto &tag : docTags) { QString funcQuery(query); if (!isProperty) { @@ -169,6 +171,7 @@ QString DoxygenParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) continue; Documentation fieldDoc; + fieldDoc.setSourceFile(doxyFilePath); for (const auto &tag : docTags) { QString query = u"/doxygen/compounddef/sectiondef/memberdef/name[text()=\""_s + field.name() + u"\"]/../"_s + tag.second; @@ -193,7 +196,7 @@ QString DoxygenParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) qCWarning(lcShibokenDoc, "%s", qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, meta_enum, query))); } - meta_enum.setDocumentation(Documentation(doc, {})); + meta_enum.setDocumentation(Documentation(doc, {}, doxyFilePath)); } return doxyFilePath; @@ -220,6 +223,6 @@ Documentation DoxygenParser::retrieveModuleDocumentation(const QString& name){ // Module documentation QString query = u"/doxygen/compounddef/detaileddescription"_s; const QString doc = getDocumentation(xquery, query, DocModificationList()); - return Documentation(doc, {}); + return Documentation(doc, {}, sourceFile); } diff --git a/sources/shiboken6/ApiExtractor/qtdocparser.cpp b/sources/shiboken6/ApiExtractor/qtdocparser.cpp index c1377b5b8..e10242d86 100644 --- a/sources/shiboken6/ApiExtractor/qtdocparser.cpp +++ b/sources/shiboken6/ApiExtractor/qtdocparser.cpp @@ -275,7 +275,7 @@ void QtDocParser::fillGlobalFunctionDocumentation(const AbstractMetaFunctionPtr {}, f, &errorMessage); if (!errorMessage.isEmpty()) qCWarning(lcShibokenDoc, "%s", qPrintable(errorMessage)); - const Documentation documentation(detailed, {}); + Documentation documentation(detailed, {}, sourceFileName); f->setDocumentation(documentation); } @@ -293,7 +293,7 @@ void QtDocParser::fillGlobalEnumDocumentation(AbstractMetaEnum &e) qCWarning(lcShibokenDoc, "%s", qPrintable(errorMessage)); return; } - if (!extractEnumDocumentation(classDocumentationO.value(), e)) { + if (!extractEnumDocumentation(classDocumentationO.value(), sourceFileName, e)) { qCWarning(lcShibokenDoc, "%s", qPrintable(msgCannotFindDocumentation(sourceFileName, {}, e, {}))); } @@ -334,7 +334,7 @@ QString QtDocParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) const auto &classDocumentation = classDocumentationO.value(); for (const auto &p : classDocumentation.properties) { - Documentation doc(p.description, p.brief); + Documentation doc(p.description, p.brief, sourceFileName); metaClass->setPropertyDocumentation(p.name, doc); } @@ -349,6 +349,7 @@ QString QtDocParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) const QString brief = extractBrief(&docString); Documentation doc; + doc.setSourceFile(sourceFileName); if (!brief.isEmpty()) doc.setValue(brief, Documentation::Brief); doc.setValue(docString); @@ -362,7 +363,7 @@ QString QtDocParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) metaClass, func, &errorMessage); if (!errorMessage.isEmpty()) qCWarning(lcShibokenDoc, "%s", qPrintable(errorMessage)); - const Documentation documentation(detailed, {}); + const Documentation documentation(detailed, {}, sourceFileName); std::const_pointer_cast<AbstractMetaFunction>(func)->setDocumentation(documentation); } #if 0 @@ -379,7 +380,7 @@ QString QtDocParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) #endif // Enums for (AbstractMetaEnum &meta_enum : metaClass->enums()) { - if (!extractEnumDocumentation(classDocumentation, meta_enum)) { + if (!extractEnumDocumentation(classDocumentation, sourceFileName, meta_enum)) { qCWarning(lcShibokenDoc, "%s", qPrintable(msgCannotFindDocumentation(sourceFileName, metaClass, meta_enum, {}))); } @@ -389,9 +390,9 @@ QString QtDocParser::fillDocumentation(const AbstractMetaClassPtr &metaClass) } bool QtDocParser::extractEnumDocumentation(const ClassDocumentation &classDocumentation, + const QString &sourceFileName, AbstractMetaEnum &meta_enum) { - Documentation enumDoc; const auto index = classDocumentation.indexOfEnum(meta_enum.name()); if (index == -1) return false; @@ -405,7 +406,7 @@ bool QtDocParser::extractEnumDocumentation(const ClassDocumentation &classDocume doc.insert(firstPara + 6, note); } } - enumDoc.setValue(doc); + Documentation enumDoc(doc, {}, sourceFileName); meta_enum.setDocumentation(enumDoc); return true; } @@ -446,7 +447,7 @@ Documentation QtDocParser::retrieveModuleDocumentation(const QString& name) return {}; } - Documentation doc(docString, {}); + Documentation doc(docString, {}, sourceFile); if (doc.isEmpty()) { qCWarning(lcShibokenDoc, "%s", qPrintable(msgCannotFindDocumentation(sourceFile, "module", name))); diff --git a/sources/shiboken6/ApiExtractor/qtdocparser.h b/sources/shiboken6/ApiExtractor/qtdocparser.h index afab43944..fb58d7961 100644 --- a/sources/shiboken6/ApiExtractor/qtdocparser.h +++ b/sources/shiboken6/ApiExtractor/qtdocparser.h @@ -34,6 +34,7 @@ private: const AbstractMetaFunctionCPtr &func, QString *errorMessage); static bool extractEnumDocumentation(const ClassDocumentation &classDocumentation, + const QString &sourceFileName, AbstractMetaEnum &meta_enum); }; diff --git a/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp index 33e3b4b78..48252f29f 100644 --- a/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp +++ b/sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp @@ -1179,12 +1179,15 @@ void QtDocGenerator::writeModuleDocumentation() // module doc is always wrong and C++istic, so go straight to the extra directory! QFile moduleDoc(m_options.extraSectionDir + u'/' + moduleName + u".rst"_s); + QStringList sourceFileNames; if (moduleDoc.open(QIODevice::ReadOnly | QIODevice::Text)) { s << moduleDoc.readAll(); moduleDoc.close(); } else { // try the normal way Documentation moduleDoc = m_docParser->retrieveModuleDocumentation(it.key()); + if (moduleDoc.hasSourceFile()) + sourceFileNames.append(moduleDoc.sourceFile()); if (moduleDoc.format() == Documentation::Native) { QString context = it.key(); QtXmlToSphinx::stripPythonQualifiers(&context); @@ -1206,7 +1209,7 @@ void QtDocGenerator::writeModuleDocumentation() "any"_L1); output.done(); - copyParsedImages(parsedImages, {}, outputDir); + copyParsedImages(parsedImages, sourceFileNames, outputDir); if (hasGlobals) writeGlobals(it.key(), outputDir + u'/' + globalsPage, docPackage); @@ -1218,22 +1221,33 @@ void QtDocGenerator::writeGlobals(const QString &package, const DocPackage &docPackage) { FileOut output(fileName); + QStringList docFiles; QtXmlToSphinxImages parsedImages; TextStream &s = output.stream; // Write out functions with injected documentation if (!docPackage.globalFunctions.isEmpty()) { + for (const auto &func : docPackage.globalFunctions) { + const Documentation &doc = func->documentation(); + if (doc.hasSourceFile() && !docFiles.contains(doc.sourceFile())) + docFiles.append(doc.sourceFile()); + } s << currentModule(package) << headline("Functions"); writeFunctions(s, docPackage.globalFunctions, {}, {}, &parsedImages); } if (!docPackage.globalEnums.isEmpty()) { s << headline("Enumerations"); + for (const auto &globalEnum : docPackage.globalEnums) { + const Documentation &doc = globalEnum.documentation(); + if (doc.hasSourceFile() && !docFiles.contains(doc.sourceFile())) + docFiles.append(doc.sourceFile()); + } writeEnums(s, docPackage.globalEnums, package, &parsedImages); } output.done(); - copyParsedImages(parsedImages, {}, QFileInfo(fileName).absolutePath()); + copyParsedImages(parsedImages, docFiles, QFileInfo(fileName).absolutePath()); } static inline QString msgNonExistentAdditionalDocFile(const QString &dir, |
