diff options
author | Paul Wicking <paul.wicking@qt.io> | 2020-09-28 09:42:08 +0200 |
---|---|---|
committer | Paul Wicking <paul.wicking@qt.io> | 2020-09-28 10:15:37 +0200 |
commit | 39618f3a9766ad273fdb4c6036255e0a1b0d42e6 (patch) | |
tree | 973cc7ec9602c1f58f7e39c70777b55ef01e6177 | |
parent | c3c5db7788a918b1136a473850486d8c4fa7b978 (diff) |
QDoc: Turn QdocTagFiles into TagFileWriter to unify design
Remove the generateTagFile wrapper from QDocDatabase.
Let the HtmlGenerator accesses the TagFileWriter directly.
Drop being a singleton for the sake of being a singleton, as
it is clearly not needed.
Add test case to expected output test as part of refactoring.
Task-number: QTBUG-71176
Fixes: QTBUG-86999
Change-Id: I0f7b3caa1249679c9676327417d675ca164e7a40
Reviewed-by: Topi Reiniƶ <topi.reinio@qt.io>
-rw-r--r-- | src/qdoc/.prev_CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/qdoc/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/qdoc/htmlgenerator.cpp | 6 | ||||
-rw-r--r-- | src/qdoc/qdoc.pro | 4 | ||||
-rw-r--r-- | src/qdoc/qdocdatabase.cpp | 12 | ||||
-rw-r--r-- | src/qdoc/qdocdatabase.h | 1 | ||||
-rw-r--r-- | src/qdoc/tagfilewriter.cpp (renamed from src/qdoc/qdoctagfiles.cpp) | 53 | ||||
-rw-r--r-- | src/qdoc/tagfilewriter.h (renamed from src/qdoc/qdoctagfiles.h) | 27 | ||||
-rw-r--r-- | tests/auto/qdoc/generatedoutput/expected_output/testtagfile.tags | 257 | ||||
-rw-r--r-- | tests/auto/qdoc/generatedoutput/testdata/configs/tagfiles.qdocconf | 2 | ||||
-rw-r--r-- | tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp | 8 |
11 files changed, 294 insertions, 80 deletions
diff --git a/src/qdoc/.prev_CMakeLists.txt b/src/qdoc/.prev_CMakeLists.txt index 262ce6864..a551b9be8 100644 --- a/src/qdoc/.prev_CMakeLists.txt +++ b/src/qdoc/.prev_CMakeLists.txt @@ -52,7 +52,6 @@ qt_add_tool(${target_name} qdoccommandlineparser.cpp qdoccommandlineparser.h qdocdatabase.cpp qdocdatabase.h qdocindexfiles.cpp qdocindexfiles.h - qdoctagfiles.cpp qdoctagfiles.h qmlcodemarker.cpp qmlcodemarker.h qmlcodeparser.cpp qmlcodeparser.h qmlmarkupvisitor.cpp qmlmarkupvisitor.h @@ -65,6 +64,7 @@ qt_add_tool(${target_name} separator.cpp separator.h sharedcommentnode.cpp sharedcommentnode.h singleton.h + tagfilewriter.cpp tagfilewriter.h text.cpp text.h tokenizer.cpp tokenizer.h topic.h diff --git a/src/qdoc/CMakeLists.txt b/src/qdoc/CMakeLists.txt index cbc486d1a..f1828503e 100644 --- a/src/qdoc/CMakeLists.txt +++ b/src/qdoc/CMakeLists.txt @@ -60,7 +60,6 @@ qt_add_tool(${target_name} qdoccommandlineparser.cpp qdoccommandlineparser.h qdocdatabase.cpp qdocdatabase.h qdocindexfiles.cpp qdocindexfiles.h - qdoctagfiles.cpp qdoctagfiles.h qmlcodemarker.cpp qmlcodemarker.h qmlcodeparser.cpp qmlcodeparser.h qmlmarkupvisitor.cpp qmlmarkupvisitor.h @@ -73,6 +72,7 @@ qt_add_tool(${target_name} separator.cpp separator.h sharedcommentnode.cpp sharedcommentnode.h singleton.h + tagfilewriter.cpp tagfilewriter.h text.cpp text.h tokenizer.cpp tokenizer.h topic.h diff --git a/src/qdoc/htmlgenerator.cpp b/src/qdoc/htmlgenerator.cpp index dcf5a6d3c..5c2f1c0bf 100644 --- a/src/qdoc/htmlgenerator.cpp +++ b/src/qdoc/htmlgenerator.cpp @@ -46,6 +46,7 @@ #include "qmlpropertynode.h" #include "separator.h" #include "sharedcommentnode.h" +#include "tagfilewriter.h" #include "tree.h" #include "quoter.h" @@ -262,7 +263,10 @@ void HtmlGenerator::generateDocs() /* Generate the XML tag file, if it was requested. */ - m_qdb->generateTagFile(tagFile_, this); + if (!tagFile_.isEmpty()) { + TagFileWriter tagFileWriter; + tagFileWriter.generateTagFile(tagFile_, this); + } } } diff --git a/src/qdoc/qdoc.pro b/src/qdoc/qdoc.pro index 784a29319..6bfbb29e0 100644 --- a/src/qdoc/qdoc.pro +++ b/src/qdoc/qdoc.pro @@ -72,7 +72,6 @@ HEADERS += access.h \ qdoccommandlineparser.h \ qdocdatabase.h \ qdocindexfiles.h \ - qdoctagfiles.h \ qmltypenode.h \ qmlpropertynode.h \ quoter.h \ @@ -81,6 +80,7 @@ HEADERS += access.h \ separator.h \ sharedcommentnode.h \ singleton.h \ + tagfilewriter.h \ text.h \ tokenizer.h \ topic.h \ @@ -129,7 +129,6 @@ SOURCES += aggregate.cpp \ qdoccommandlineparser.cpp \ qdocdatabase.cpp \ qdocindexfiles.cpp \ - qdoctagfiles.cpp \ qmltypenode.cpp \ qmlpropertynode.cpp \ quoter.cpp \ @@ -137,6 +136,7 @@ SOURCES += aggregate.cpp \ sections.cpp \ separator.cpp \ sharedcommentnode.cpp \ + tagfilewriter.cpp \ text.cpp \ tokenizer.cpp \ tree.cpp \ diff --git a/src/qdoc/qdocdatabase.cpp b/src/qdoc/qdocdatabase.cpp index 6504f3973..d95232bc4 100644 --- a/src/qdoc/qdocdatabase.cpp +++ b/src/qdoc/qdocdatabase.cpp @@ -33,7 +33,6 @@ #include "functionnode.h" #include "generator.h" #include "qdocindexfiles.h" -#include "qdoctagfiles.h" #include "tree.h" #include <QtCore/qregularexpression.h> @@ -1350,17 +1349,6 @@ const Node *QDocDatabase::findNodeForTarget(const QString &target, const Node *r } /*! - Generates a tag file and writes it to \a name. - */ -void QDocDatabase::generateTagFile(const QString &name, Generator *g) -{ - if (!name.isEmpty()) { - QDocTagFiles::qdocTagFiles()->generateTagFile(name, g); - QDocTagFiles::destroyQDocTagFiles(); - } -} - -/*! Reads and parses the qdoc index files listed in \a indexFiles. */ void QDocDatabase::readIndexes(const QStringList &indexFiles) diff --git a/src/qdoc/qdocdatabase.h b/src/qdoc/qdocdatabase.h index 90dc2e966..fea2373eb 100644 --- a/src/qdoc/qdocdatabase.h +++ b/src/qdoc/qdocdatabase.h @@ -363,7 +363,6 @@ public: void setVersion(const QString &v) { version_ = v; } QString version() const { return version_; } - void generateTagFile(const QString &name, Generator *g); void readIndexes(const QStringList &indexFiles); void generateIndex(const QString &fileName, const QString &url, const QString &title, Generator *g); diff --git a/src/qdoc/qdoctagfiles.cpp b/src/qdoc/tagfilewriter.cpp index aab5405c7..2685db50f 100644 --- a/src/qdoc/qdoctagfiles.cpp +++ b/src/qdoc/tagfilewriter.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -26,7 +26,7 @@ ** ****************************************************************************/ -#include "qdoctagfiles.h" +#include "tagfilewriter.h" #include "access.h" #include "aggregate.h" @@ -43,58 +43,23 @@ QT_BEGIN_NAMESPACE /*! - \class QDocTagFiles + \class TagFileWriter - This class handles the generation of the qdoc tag file. + This class handles the generation of the QDoc tag files. */ -QDocTagFiles *QDocTagFiles::s_qdocTagFiles = nullptr; - /*! - Constructs the singleton. \a qdb is the pointer to the + Default constructor. \a qdb is the pointer to the qdoc database that is used when reading and writing the index files. */ -QDocTagFiles::QDocTagFiles() -{ - m_qdb = QDocDatabase::qdocDB(); -} - -/*! - Destroys the singleton QDocTagFiles. - */ -QDocTagFiles::~QDocTagFiles() -{ - m_qdb = nullptr; -} - -/*! - Creates the singleton. Allows only one instance of the class - to be created. Returns a pointer to the singleton. - */ -QDocTagFiles *QDocTagFiles::qdocTagFiles() -{ - if (s_qdocTagFiles == nullptr) - s_qdocTagFiles = new QDocTagFiles; - return s_qdocTagFiles; -} - -/*! - Destroys the singleton. - */ -void QDocTagFiles::destroyQDocTagFiles() -{ - if (s_qdocTagFiles != nullptr) { - delete s_qdocTagFiles; - s_qdocTagFiles = nullptr; - } -} +TagFileWriter::TagFileWriter() : m_qdb(QDocDatabase::qdocDB()) { } /*! Generate the tag file section with the given \a writer for the \a parent node. */ -void QDocTagFiles::generateTagFileCompounds(QXmlStreamWriter &writer, const Aggregate *parent) +void TagFileWriter::generateTagFileCompounds(QXmlStreamWriter &writer, const Aggregate *parent) { const auto &nonFunctionList = const_cast<Aggregate *>(parent)->nonfunctionList(); for (const auto *node : nonFunctionList) { @@ -169,7 +134,7 @@ void QDocTagFiles::generateTagFileCompounds(QXmlStreamWriter &writer, const Aggr Writes all the members of the \a parent node with the \a writer. The node represents a C++ class, namespace, etc. */ -void QDocTagFiles::generateTagFileMembers(QXmlStreamWriter &writer, const Aggregate *parent) +void TagFileWriter::generateTagFileMembers(QXmlStreamWriter &writer, const Aggregate *parent) { const auto &childNodes = parent->childNodes(); for (const auto *node : childNodes) { @@ -337,7 +302,7 @@ void QDocTagFiles::generateTagFileMembers(QXmlStreamWriter &writer, const Aggreg /*! Writes a tag file named \a fileName. */ -void QDocTagFiles::generateTagFile(const QString &fileName, Generator *g) +void TagFileWriter::generateTagFile(const QString &fileName, Generator *g) { QFile file(fileName); QFileInfo fileInfo(fileName); diff --git a/src/qdoc/qdoctagfiles.h b/src/qdoc/tagfilewriter.h index 3b2c2dd0b..2c6cc4b6a 100644 --- a/src/qdoc/qdoctagfiles.h +++ b/src/qdoc/tagfilewriter.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -26,38 +26,33 @@ ** ****************************************************************************/ -#ifndef QDOCTAGFILES_H -#define QDOCTAGFILES_H +#ifndef TAGFILEWRITER_H +#define TAGFILEWRITER_H #include <QtCore/qxmlstream.h> QT_BEGIN_NAMESPACE class Aggregate; -class QDocDatabase; class Generator; +class QDocDatabase; -class QDocTagFiles +class TagFileWriter { - friend class QDocDatabase; - -private: - static QDocTagFiles *qdocTagFiles(); - static void destroyQDocTagFiles(); +public: + TagFileWriter(); + ~TagFileWriter() = default; - QDocTagFiles(); - ~QDocTagFiles(); + void generateTagFile(const QString &fileName, Generator *generator); +private: void generateTagFileCompounds(QXmlStreamWriter &writer, const Aggregate *inner); void generateTagFileMembers(QXmlStreamWriter &writer, const Aggregate *inner); - void generateTagFile(const QString &fileName, Generator *g); -private: - static QDocTagFiles *s_qdocTagFiles; QDocDatabase *m_qdb { nullptr }; Generator *m_generator { nullptr }; }; QT_END_NAMESPACE -#endif +#endif // TAGFILEWRITER_H diff --git a/tests/auto/qdoc/generatedoutput/expected_output/testtagfile.tags b/tests/auto/qdoc/generatedoutput/expected_output/testtagfile.tags new file mode 100644 index 000000000..893b6aba1 --- /dev/null +++ b/tests/auto/qdoc/generatedoutput/expected_output/testtagfile.tags @@ -0,0 +1,257 @@ +<?xml version="1.0" encoding="UTF-8"?> +<tagfile> + <compound kind="class"> + <name>QDoc.Test.AbstractParent</name> + <filename>qml-qdoc-test-abstractparent.html</filename> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>void</type> + <name>rear</name> + <anchorfile>qml-qdoc-test-abstractparent.html</anchorfile> + <anchor>rear-method</anchor> + <arglist>(Child child, var method)</arglist> + </member> + </compound> + <compound kind="class"> + <name>QDoc.Test.Child</name> + <filename>qml-qdoc-test-child.html</filename> + </compound> + <compound kind="class"> + <name>QDoc.Test.DocTest</name> + <filename>qml-qdoc-test-doctest.html</filename> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>completed</name> + <anchorfile>qml-qdoc-test-doctest.html</anchorfile> + <anchor>completed-signal</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>foo</name> + <anchorfile>qml-qdoc-test-doctest.html</anchorfile> + <anchor>foo-signal</anchor> + <arglist>(var bar)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>fail</name> + <anchorfile>qml-qdoc-test-doctest.html</anchorfile> + <anchor>fail-method</anchor> + <arglist>( message)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>doctest_fail</name> + <anchorfile>qml-qdoc-test-doctest.html</anchorfile> + <anchor>doctest_fail-method</anchor> + <arglist>( msg)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>fail_hard</name> + <anchorfile>qml-qdoc-test-doctest.html</anchorfile> + <anchor>fail_hard-method</anchor> + <arglist>( msg, option)</arglist> + </member> + </compound> + <compound kind="class"> + <name>UIComponents.ProgressBar</name> + <filename>qml-uicomponents-progressbar.html</filename> + </compound> + <compound kind="class"> + <name>UIComponents.Switch</name> + <filename>qml-uicomponents-switch.html</filename> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>toggle</name> + <anchorfile>qml-uicomponents-switch.html</anchorfile> + <anchor>toggle-method</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>releaseSwitch</name> + <anchorfile>qml-uicomponents-switch.html</anchorfile> + <anchor>releaseSwitch-method</anchor> + <arglist>()</arglist> + </member> + </compound> + <compound kind="class"> + <name>UIComponents.TabWidget</name> + <filename>qml-uicomponents-tabwidget.html</filename> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>setOpacities</name> + <anchorfile>qml-uicomponents-tabwidget.html</anchorfile> + <anchor>setOpacities-method</anchor> + <arglist>()</arglist> + </member> + </compound> + <compound kind="namespace"> + <name>TestQDoc</name> + <filename>testqdoc.html</filename> + <class>TestQDoc::Test</class> + <class>TestQDoc::TestDerived</class> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>QDOCTEST_MACRO</name> + <anchorfile>testqdoc.html</anchorfile> + <anchor>QDOCTEST_MACRO</anchor> + <arglist>QDOCTEST_MACRO</arglist> + </member> + </compound> + <compound kind="class"> + <name>TestQDoc::Test</name> + <filename>testqdoc-test.html</filename> + <member kind="typedef" type=""> + <name>SomeType</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>SomeType-typedef</anchor> + <arglist></arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>int</type> + <name>someFunction</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>someFunction</anchor> + <arglist>(int v)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>void</type> + <name>someFunctionDefaultArg</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>someFunctionDefaultArg</anchor> + <arglist>(int i, bool b)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>void</type> + <name>obsoleteMember</name> + <anchorfile>testqdoc-test-obsolete.html</anchorfile> + <anchor>obsoleteMember</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>void</type> + <name>anotherObsoleteMember</name> + <anchorfile>testqdoc-test-obsolete.html</anchorfile> + <anchor>anotherObsoleteMember</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>void</type> + <name>deprecatedMember</name> + <anchorfile>testqdoc-test-obsolete.html</anchorfile> + <anchor>deprecatedMember</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>void (*)(bool)</type> + <name>funcPtr</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>funcPtr</anchor> + <arglist>(*)(bool) funcPtr(bool b, const char *s)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>void</type> + <name>inlineFunction</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>inlineFunction</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="public" virtualness="virtual" static="no"> + <type>virtual void</type> + <name>virtualFun</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>virtualFun</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="protected" virtualness="non" static="no"> + <type>void</type> + <name>overload</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>overload</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="protected" virtualness="non" static="no"> + <type>void</type> + <name>overload</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>overload-1</anchor> + <arglist>(bool b)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>QDOCTEST_MACRO2</name> + <anchorfile>testqdoc-test.html</anchorfile> + <anchor>QDOCTEST_MACRO2</anchor> + <arglist>(int &x)</arglist> + </member> + </compound> + <compound kind="class"> + <name>TestQDoc::TestDerived</name> + <filename>testqdoc-testderived.html</filename> + <base>Test</base> + <member kind="typedef" type=""> + <name>DerivedType</name> + <anchorfile>testqdoc-testderived.html</anchorfile> + <anchor>DerivedType-alias</anchor> + <arglist></arglist> + </member> + <member kind="typedef" type=""> + <name>NotTypedef</name> + <anchorfile>testqdoc-testderived.html</anchorfile> + <anchor>NotTypedef-alias</anchor> + <arglist></arglist> + </member> + <member kind="function" protection="public" virtualness="virtual" static="no"> + <type>virtual void</type> + <name>virtualFun</name> + <anchorfile>testqdoc-testderived.html</anchorfile> + <anchor>virtualFun</anchor> + <arglist>() override</arglist> + </member> + </compound> + <compound kind="class"> + <name>QDoc.Test.Type</name> + <filename>qml-qdoc-test-type.html</filename> + <member kind="function" protection="public" virtualness="non" static="no"> + <type>Type</type> + <name>copy</name> + <anchorfile>qml-qdoc-test-type.html</anchorfile> + <anchor>copy-method</anchor> + <arglist>( a)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>enable</name> + <anchorfile>qml-qdoc-test-type.html</anchorfile> + <anchor>enable-method</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>disable</name> + <anchorfile>qml-qdoc-test-type.html</anchorfile> + <anchor>disable-method</anchor> + <arglist>()</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>completed</name> + <anchorfile>qml-qdoc-test-type.html</anchorfile> + <anchor>completed-signal</anchor> + <arglist>(int status)</arglist> + </member> + <member kind="function" protection="public" virtualness="non" static="no"> + <type></type> + <name>configured</name> + <anchorfile>qml-qdoc-test-type.html</anchorfile> + <anchor>configured-signal</anchor> + <arglist>()</arglist> + </member> + </compound> + <compound kind="class"> + <name>QDoc.Test.YetAnotherChild</name> + <filename>qml-qdoc-test-yetanotherchild.html</filename> + </compound> +</tagfile> diff --git a/tests/auto/qdoc/generatedoutput/testdata/configs/tagfiles.qdocconf b/tests/auto/qdoc/generatedoutput/testdata/configs/tagfiles.qdocconf new file mode 100644 index 000000000..5e1382588 --- /dev/null +++ b/tests/auto/qdoc/generatedoutput/testdata/configs/tagfiles.qdocconf @@ -0,0 +1,2 @@ +include(testqml.qdocconf) +tagfile = testtagfile.tags diff --git a/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp b/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp index 3891111e3..896144049 100644 --- a/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp +++ b/tests/auto/qdoc/generatedoutput/tst_generatedoutput.cpp @@ -76,6 +76,7 @@ private slots: void headerFile(); void usingDirective(); void properties(); + void testTagFile(); private: QScopedPointer<QTemporaryDir> m_outputDir; @@ -199,7 +200,6 @@ void tst_generatedOutput::testAndCompare(const char *input, const char *outNames fileInfo.filePath())); } QSKIP("Regenerated expected output only."); - return; } compareLineByLine(expectedOuts); @@ -475,7 +475,6 @@ void tst_generatedOutput::properties() { if (m_extraParams.isEmpty() && !m_regen) { QSKIP("Required include paths not available"); - return; } testAndCompare("testdata/configs/properties.qdocconf", @@ -486,6 +485,11 @@ void tst_generatedOutput::properties() m_extraParams.toLatin1().data()); } +void tst_generatedOutput::testTagFile() +{ + testAndCompare("testdata/configs/tagfiles.qdocconf", "testtagfile.tags"); +} + int main(int argc, char *argv[]) { tst_generatedOutput tc; |