aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken6/ApiExtractor/documentation.cpp8
-rw-r--r--sources/shiboken6/ApiExtractor/documentation.h8
-rw-r--r--sources/shiboken6/ApiExtractor/doxygenparser.cpp7
-rw-r--r--sources/shiboken6/ApiExtractor/qtdocparser.cpp17
-rw-r--r--sources/shiboken6/ApiExtractor/qtdocparser.h1
-rw-r--r--sources/shiboken6/generator/qtdoc/qtdocgenerator.cpp18
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,