summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTopi Reinio <topi.reinio@qt.io>2020-02-14 11:14:27 +0100
committerTopi Reinio <topi.reinio@qt.io>2020-03-06 10:40:11 +0100
commitfffed819ca8efeee79698aae07b27741f004f7e2 (patch)
tree4ef0dc1840dc3e18bb0f2f969dfefbc77c5ae6cf
parentdc8598ab1e441d9b49a3aac1e3812bf93f8a3211 (diff)
qdoc: Refactor automatic note generation for function nodes
Function nodes may have a number of automatically generated notes added to the documentation; as they share the same formatting, collect them into a single virtual function in Generator, and override it in DocBookGenerator. Call the virtual function in Generator::generateBody() after generating the text for the Doc instance. As we append the notes to the body, the order in which the notes appear may change slightly (if a function comment generates multiple notes). Add \note commands in the tests in preparation for a follow-up commit that utilizes the refactored code. Task-number: QTBUG-37355 Change-Id: Id92926e53b61e03a2d2feceda70987191b708975 Reviewed-by: Topi Reiniƶ <topi.reinio@qt.io>
-rw-r--r--src/qdoc/docbookgenerator.cpp141
-rw-r--r--src/qdoc/docbookgenerator.h4
-rw-r--r--src/qdoc/generator.cpp119
-rw-r--r--src/qdoc/generator.h4
-rw-r--r--src/qdoc/htmlgenerator.cpp55
-rw-r--r--src/qdoc/htmlgenerator.h1
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/docbook/qml-qdoc-test-type.xml6
-rw-r--r--tests/auto/qdoc/generatedoutput/expected_output/qml-qdoc-test-type.html2
-rw-r--r--tests/auto/qdoc/generatedoutput/testdata/qml/type.cpp4
9 files changed, 167 insertions, 169 deletions
diff --git a/src/qdoc/docbookgenerator.cpp b/src/qdoc/docbookgenerator.cpp
index 5f8d961f8..e8cc2c859 100644
--- a/src/qdoc/docbookgenerator.cpp
+++ b/src/qdoc/docbookgenerator.cpp
@@ -2076,27 +2076,28 @@ bool DocBookGenerator::generateThreadSafeness(const Node *node)
void DocBookGenerator::generateBody(const Node *node)
{
// From Generator::generateBody, without warnings.
+ const FunctionNode *fn = node->isFunction() ? static_cast<const FunctionNode *>(node) : nullptr;
+
if (!node->hasDoc() && !node->hasSharedDoc()) {
/*
Test for special function, like a destructor or copy constructor,
that has no documentation.
*/
- if (node->nodeType() == Node::Function) {
- const auto func = static_cast<const FunctionNode *>(node);
+ if (fn) {
QString t;
- if (func->isDtor()) {
- t = "Destroys the instance of " + func->parent()->name() + ".";
- if (func->isVirtual())
+ if (fn->isDtor()) {
+ t = "Destroys the instance of " + fn->parent()->name() + ".";
+ if (fn->isVirtual())
t += " The destructor is virtual.";
- } else if (func->isCtor()) {
- t = "Default constructs an instance of " + func->parent()->name() + ".";
- } else if (func->isCCtor()) {
+ } else if (fn->isCtor()) {
+ t = "Default constructs an instance of " + fn->parent()->name() + ".";
+ } else if (fn->isCCtor()) {
t = "Copy constructor.";
- } else if (func->isMCtor()) {
+ } else if (fn->isMCtor()) {
t = "Move-copy constructor.";
- } else if (func->isCAssign()) {
+ } else if (fn->isCAssign()) {
t = "Copy-assignment constructor.";
- } else if (func->isMAssign()) {
+ } else if (fn->isMAssign()) {
t = "Move-assignment constructor.";
}
@@ -2104,10 +2105,9 @@ void DocBookGenerator::generateBody(const Node *node)
writer->writeTextElement(dbNamespace, "para", t);
}
} else if (!node->isSharingComment()) {
- if (node->nodeType() == Node::Function) {
- const auto func = static_cast<const FunctionNode *>(node);
- if (!func->overridesThis().isEmpty())
- generateReimplementsClause(func);
+ if (fn) {
+ if (!fn->overridesThis().isEmpty())
+ generateReimplementsClause(fn);
}
if (!generateText(node->doc().body(), node)) {
@@ -2115,6 +2115,15 @@ void DocBookGenerator::generateBody(const Node *node)
return;
}
+ if (fn) {
+ if (fn->isPrivateSignal())
+ generateAddendum(node, PrivateSignal);
+ if (fn->isInvokable())
+ generateAddendum(node, Invokable);
+ if (fn->hasAssociatedProperties())
+ generateAddendum(node, AssociatedProperties);
+ }
+
// Warning generation skipped with respect to Generator::generateBody.
}
@@ -3393,83 +3402,70 @@ void DocBookGenerator::generateOverloadedSignal(const Node *node)
}
/*!
- Generates a bold line that explains that this is a private signal,
- only made public to let users pass it to connect().
- */
-void DocBookGenerator::generatePrivateSignalNote()
-{
- // From Generator::generatePrivateSignalNote.
- writer->writeStartElement(dbNamespace, "note");
- newLine();
- writer->writeTextElement(dbNamespace, "para",
- "This is a private signal. It can be used in signal connections but "
- "cannot be emitted by the user.");
- writer->writeEndElement(); // note
- newLine();
-}
-
-/*!
- Generates a bold line that says:
- "This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE."
- */
-void DocBookGenerator::generateInvokableNote(const Node *node)
+ Generates an addendum note of type \a type for \a node. \a marker
+ is unused in this generator.
+*/
+void DocBookGenerator::generateAddendum(const Node *node, Addendum type, CodeMarker *marker)
{
- // From Generator::generateInvokableNote.
+ Q_UNUSED(marker);
+ Q_ASSERT(node && !node->name().isEmpty());
writer->writeStartElement(dbNamespace, "note");
newLine();
- writer->writeStartElement(dbNamespace, "para");
- writer->writeCharacters(
+ switch (type) {
+ case Invokable:
+ writer->writeStartElement(dbNamespace, "para");
+ writer->writeCharacters(
"This function can be invoked via the meta-object system and from QML. See ");
- generateSimpleLink(node->url(), "Q_INVOKABLE");
- writer->writeCharacters(".");
- writer->writeEndElement(); // para
- newLine();
- writer->writeEndElement(); // note
- newLine();
-}
-
-/*!
- Generates bold Note lines that explain how function \a fn
- is associated with each of its associated properties.
- */
-void DocBookGenerator::generateAssociatedPropertyNotes(const FunctionNode *fn)
-{
- // From HtmlGenerator::generateAssociatedPropertyNotes.
- if (fn->hasAssociatedProperties()) {
- writer->writeStartElement(dbNamespace, "note");
+ generateSimpleLink(node->url(), "Q_INVOKABLE");
+ writer->writeCharacters(".");
+ writer->writeEndElement(); // para
newLine();
- writer->writeStartElement(dbNamespace, "para");
-
+ break;
+ case PrivateSignal:
+ writer->writeTextElement(dbNamespace, "para",
+ "This is a private signal. It can be used in signal connections but "
+ "cannot be emitted by the user.");
+ break;
+ case AssociatedProperties:
+ {
+ if (!node->isFunction())
+ return;
+ const FunctionNode *fn = static_cast<const FunctionNode *>(node);
NodeList nodes = fn->associatedProperties();
+ if (nodes.isEmpty())
+ return;
std::sort(nodes.begin(), nodes.end(), Node::nodeNameLessThan);
for (const auto node : qAsConst(nodes)) {
QString msg;
const auto pn = static_cast<const PropertyNode *>(node);
switch (pn->role(fn)) {
case PropertyNode::Getter:
- msg = QStringLiteral("Getter function ");
+ msg = QStringLiteral("Getter function");
break;
case PropertyNode::Setter:
- msg = QStringLiteral("Setter function ");
+ msg = QStringLiteral("Setter function");
break;
case PropertyNode::Resetter:
- msg = QStringLiteral("Resetter function ");
+ msg = QStringLiteral("Resetter function");
break;
case PropertyNode::Notifier:
- msg = QStringLiteral("Notifier signal ");
+ msg = QStringLiteral("Notifier signal");
break;
default:
- break;
+ continue;
}
- writer->writeCharacters(msg + "for property ");
+ writer->writeCharacters(msg + " for property ");
generateSimpleLink(linkForNode(pn, nullptr), pn->name());
writer->writeCharacters(". ");
}
- writer->writeEndElement(); // para
- newLine();
- writer->writeEndElement(); // note
- newLine();
+ break;
}
+ default:
+ break;
+ }
+
+ writer->writeEndElement(); // note
+ newLine();
}
void DocBookGenerator::generateDetailedMember(const Node *node, const PageNode *relative)
@@ -3568,13 +3564,6 @@ void DocBookGenerator::generateDetailedMember(const Node *node, const PageNode *
newLine();
generateSectionList(notifiers, node);
}
- } else if (node->isFunction()) {
- const auto fn = static_cast<const FunctionNode *>(node);
- if (fn->isPrivateSignal())
- generatePrivateSignalNote();
- if (fn->isInvokable())
- generateInvokableNote(node);
- generateAssociatedPropertyNotes(fn);
} else if (node->isEnumType()) {
const auto en = static_cast<const EnumNode *>(node);
@@ -3646,9 +3635,9 @@ void DocBookGenerator::generateSectionList(const Section &section, const Node *r
newLine();
if (hasPrivateSignals)
- generatePrivateSignalNote();
+ generateAddendum(relative, Generator::PrivateSignal);
if (isInvokable)
- generateInvokableNote(relative);
+ generateAddendum(relative, Generator::Invokable);
}
if (status != Section::Obsolete && section.style() == Section::Summary
diff --git a/src/qdoc/docbookgenerator.h b/src/qdoc/docbookgenerator.h
index 9a223f4af..5eea595f7 100644
--- a/src/qdoc/docbookgenerator.h
+++ b/src/qdoc/docbookgenerator.h
@@ -81,6 +81,7 @@ protected:
bool generateStatus(const Node *node);
bool generateThreadSafeness(const Node *node);
bool generateSince(const Node *node);
+ void generateAddendum(const Node *node, Generator::Addendum type, CodeMarker *marker = nullptr) override;
using Generator::generateBody;
void generateBody(const Node *node);
@@ -133,9 +134,6 @@ private:
void generateExampleFilePage(const Node *en, const QString &file,
CodeMarker *marker = nullptr) override;
void generateOverloadedSignal(const Node *node);
- void generatePrivateSignalNote();
- void generateInvokableNote(const Node *node);
- void generateAssociatedPropertyNotes(const FunctionNode *fn);
bool generateQmlText(const Text &text, const Node *relative, CodeMarker *marker = nullptr,
const QString &qmlName = QString()) override;
void generateRequiredLinks(const Node *node);
diff --git a/src/qdoc/generator.cpp b/src/qdoc/generator.cpp
index 3e689c4b5..f8fb9ad02 100644
--- a/src/qdoc/generator.cpp
+++ b/src/qdoc/generator.cpp
@@ -759,55 +759,55 @@ const Atom *Generator::generateAtomList(const Atom *atom, const Node *relative,
*/
void Generator::generateBody(const Node *node, CodeMarker *marker)
{
+ const FunctionNode *fn = node->isFunction() ? static_cast<const FunctionNode *>(node) : nullptr;
if (!node->hasDoc() && !node->hasSharedDoc()) {
/*
Test for special function, like a destructor or copy constructor,
that has no documentation.
*/
- if (node->isFunction()) {
- const FunctionNode *func = static_cast<const FunctionNode *>(node);
- if (func->isDtor()) {
+ if (fn) {
+ if (fn->isDtor()) {
Text text;
text << "Destroys the instance of ";
- text << func->parent()->name() << ".";
- if (func->isVirtual())
+ text << fn->parent()->name() << ".";
+ if (fn->isVirtual())
text << " The destructor is virtual.";
out() << "<p>";
generateText(text, node, marker);
out() << "</p>";
- } else if (func->isCtor()) {
+ } else if (fn->isCtor()) {
Text text;
text << "Default constructs an instance of ";
- text << func->parent()->name() << ".";
+ text << fn->parent()->name() << ".";
out() << "<p>";
generateText(text, node, marker);
out() << "</p>";
- } else if (func->isCCtor()) {
+ } else if (fn->isCCtor()) {
Text text;
text << "Copy constructor.";
out() << "<p>";
generateText(text, node, marker);
out() << "</p>";
- } else if (func->isMCtor()) {
+ } else if (fn->isMCtor()) {
Text text;
text << "Move-copy constructor.";
out() << "<p>";
generateText(text, node, marker);
out() << "</p>";
- } else if (func->isCAssign()) {
+ } else if (fn->isCAssign()) {
Text text;
text << "Copy-assignment operator.";
out() << "<p>";
generateText(text, node, marker);
out() << "</p>";
- } else if (func->isMAssign()) {
+ } else if (fn->isMAssign()) {
Text text;
text << "Move-assignment operator.";
out() << "<p>";
generateText(text, node, marker);
out() << "</p>";
} else if (!node->isWrapper() && !node->isMarkedReimp()) {
- if (!func->isIgnored()) // undocumented functions added by Q_OBJECT
+ if (!fn->isIgnored()) // undocumented functions added by Q_OBJECT
node->location().warning(
tr("No documentation for '%1'").arg(node->plainSignature()));
}
@@ -818,8 +818,7 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
tr("No documentation for '%1'").arg(node->plainSignature()));
}
} else if (!node->isSharingComment()) {
- if (node->isFunction()) {
- const FunctionNode *fn = static_cast<const FunctionNode *>(node);
+ if (fn) {
if (!fn->overridesThis().isEmpty())
generateReimplementsClause(fn, marker);
}
@@ -829,6 +828,16 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
return;
}
+ if (fn) {
+ if (fn->isPrivateSignal())
+ generateAddendum(node, PrivateSignal, marker);
+ if (fn->isInvokable())
+ generateAddendum(node, Invokable, marker);
+ if (fn->hasAssociatedProperties())
+ generateAddendum(node, AssociatedProperties, marker);
+ }
+
+ // Generate warnings
if (node->isEnumType()) {
const EnumNode *enume = static_cast<const EnumNode *>(node);
@@ -860,8 +869,7 @@ void Generator::generateBody(const Node *node, CodeMarker *marker)
}
}
}
- } else if (node->isFunction()) {
- const FunctionNode *fn = static_cast<const FunctionNode *>(node);
+ } else if (fn) {
const QSet<QString> declaredNames = fn->parameters().getNames();
const QSet<QString> documentedNames = fn->doc().parameterNames();
if (declaredNames != documentedNames) {
@@ -1344,33 +1352,66 @@ void Generator::generateStatus(const Node *node, CodeMarker *marker)
}
/*!
- Generates a bold line that explains that this is a private signal,
- only made public to let users pass it to connect().
- */
-void Generator::generatePrivateSignalNote(const Node *node, CodeMarker *marker)
+ Generates an addendum note of type \a type for \a node, using \a marker
+ as the code marker.
+*/
+void Generator::generateAddendum(const Node *node, Addendum type, CodeMarker *marker)
{
+ Q_ASSERT(node && !node->name().isEmpty());
Text text;
text << Atom::ParaLeft << Atom(Atom::FormattingLeft, ATOM_FORMATTING_BOLD)
- << "Note: " << Atom(Atom::FormattingRight, ATOM_FORMATTING_BOLD)
- << "This is a private signal. It can be used in signal connections but cannot be emitted "
- "by the user."
- << Atom::ParaRight;
- generateText(text, node, marker);
-}
+ << "Note: " << Atom(Atom::FormattingRight, ATOM_FORMATTING_BOLD);
+
+ switch (type) {
+ case Invokable:
+ text << "This function can be invoked via the meta-object system and from QML. See "
+ << Atom(Atom::Link, "Q_INVOKABLE")
+ << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) << "Q_INVOKABLE"
+ << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) << ".";
+ break;
+ case PrivateSignal:
+ text << "This is a private signal. It can be used in signal connections "
+ "but cannot be emitted by the user.";
+ break;
+ case AssociatedProperties:
+ {
+ if (!node->isFunction())
+ return;
+ const FunctionNode *fn = static_cast<const FunctionNode *>(node);
+ NodeList nodes = fn->associatedProperties();
+ if (nodes.isEmpty())
+ return;
+ std::sort(nodes.begin(), nodes.end(), Node::nodeNameLessThan);
+ for (const auto *n : qAsConst(nodes)) {
+ QString msg;
+ const PropertyNode *pn = static_cast<const PropertyNode *>(n);
+ switch (pn->role(fn)) {
+ case PropertyNode::Getter:
+ msg = QStringLiteral("Getter function");
+ break;
+ case PropertyNode::Setter:
+ msg = QStringLiteral("Setter function");
+ break;
+ case PropertyNode::Resetter:
+ msg = QStringLiteral("Resetter function");
+ break;
+ case PropertyNode::Notifier:
+ msg = QStringLiteral("Notifier signal");
+ break;
+ default:
+ continue;
+ }
+ text << msg << " for property " << Atom(Atom::Link, pn->name())
+ << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK) << pn->name()
+ << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) << ". ";
+ }
+ break;
+ }
+ default:
+ return;
+ }
-/*!
- Generates a bold line that says:
- "This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE."
- */
-void Generator::generateInvokableNote(const Node *node, CodeMarker *marker)
-{
- Text text;
- text << Atom::ParaLeft << Atom(Atom::FormattingLeft, ATOM_FORMATTING_BOLD)
- << "Note: " << Atom(Atom::FormattingRight, ATOM_FORMATTING_BOLD)
- << "This function can be invoked via the meta-object system and from QML. See "
- << Atom(Atom::Link, "Q_INVOKABLE") << Atom(Atom::FormattingLeft, ATOM_FORMATTING_LINK)
- << "Q_INVOKABLE" << Atom(Atom::FormattingRight, ATOM_FORMATTING_LINK) << "."
- << Atom::ParaRight;
+ text << Atom::ParaRight;
generateText(text, node, marker);
}
diff --git a/src/qdoc/generator.h b/src/qdoc/generator.h
index f28432bd2..d72a77bd1 100644
--- a/src/qdoc/generator.h
+++ b/src/qdoc/generator.h
@@ -53,6 +53,7 @@ class Generator
public:
enum ListType { Generic, Obsolete };
+ enum Addendum { Invokable, PrivateSignal, AssociatedProperties };
Generator();
virtual ~Generator();
@@ -140,8 +141,7 @@ protected:
static QString formatSince(const Node *node);
void generateSince(const Node *node, CodeMarker *marker);
void generateStatus(const Node *node, CodeMarker *marker);
- void generatePrivateSignalNote(const Node *node, CodeMarker *marker);
- void generateInvokableNote(const Node *node, CodeMarker *marker);
+ virtual void generateAddendum(const Node *node, Addendum type, CodeMarker *marker);
void generateThreadSafeness(const Node *node, CodeMarker *marker);
QString getMetadataElement(const Aggregate *inner, const QString &t);
QStringList getMetadataElements(const Aggregate *inner, const QString &t);
diff --git a/src/qdoc/htmlgenerator.cpp b/src/qdoc/htmlgenerator.cpp
index e7f4dc1cb..c440b31c3 100644
--- a/src/qdoc/htmlgenerator.cpp
+++ b/src/qdoc/htmlgenerator.cpp
@@ -829,7 +829,7 @@ int HtmlGenerator::generateAtom(const Atom *atom, const Node *relative, CodeMark
out() << formattingRightMap()[ATOM_FORMATTING_BOLD];
break;
case Atom::NoteRight:
- out() << "</p>";
+ out() << "</p>\n";
break;
case Atom::LegaleseLeft:
out() << "<div class=\"LegaleseLeft\">";
@@ -3114,10 +3114,12 @@ void HtmlGenerator::generateSectionList(const Section &section, const Node *rela
if (twoColumn)
out() << "</td></tr>\n</table></div>\n";
}
- if (hasPrivateSignals && alignNames)
- generatePrivateSignalNote(relative, marker);
- if (isInvokable && alignNames)
- generateInvokableNote(relative, marker);
+ if (alignNames) {
+ if (hasPrivateSignals)
+ generateAddendum(relative, Generator::PrivateSignal, marker);
+ if (isInvokable)
+ generateAddendum(relative, Generator::Invokable, marker);
+ }
}
if (status != Section::Obsolete && section.style() == Section::Summary
@@ -3502,13 +3504,6 @@ void HtmlGenerator::generateDetailedMember(const Node *node, const PageNode *rel
out() << "<p><b>Notifier signal:</b></p>\n";
generateSectionList(notifiers, node, marker);
}
- } else if (node->isFunction()) {
- const FunctionNode *fn = static_cast<const FunctionNode *>(node);
- if (fn->isPrivateSignal())
- generatePrivateSignalNote(node, marker);
- if (fn->isInvokable())
- generateInvokableNote(node, marker);
- generateAssociatedPropertyNotes(const_cast<FunctionNode *>(fn));
} else if (node->isEnumType()) {
const EnumNode *etn = static_cast<const EnumNode *>(node);
if (etn->flagsType()) {
@@ -4211,40 +4206,4 @@ QXmlStreamWriter &HtmlGenerator::xmlWriter()
return *xmlWriterStack.top();
}
-/*!
- Generates bold Note lines that explain how function \a fn
- is associated with each of its associated properties.
- */
-void HtmlGenerator::generateAssociatedPropertyNotes(const FunctionNode *fn)
-{
- if (fn->hasAssociatedProperties()) {
- out() << "<p><b>Note:</b> ";
- NodeList nodes = fn->associatedProperties();
- std::sort(nodes.begin(), nodes.end(), Node::nodeNameLessThan);
- for (const auto *node : qAsConst(nodes)) {
- QString msg;
- const PropertyNode *pn = static_cast<const PropertyNode *>(node);
- switch (pn->role(fn)) {
- case PropertyNode::Getter:
- msg = QStringLiteral("Getter function ");
- break;
- case PropertyNode::Setter:
- msg = QStringLiteral("Setter function ");
- break;
- case PropertyNode::Resetter:
- msg = QStringLiteral("Resetter function ");
- break;
- case PropertyNode::Notifier:
- msg = QStringLiteral("Notifier signal ");
- break;
- default:
- break;
- }
- QString link = linkForNode(pn, nullptr);
- out() << msg << "for property <a href=\"" << link << "\">" << pn->name() << "</a>. ";
- }
- out() << "</p>";
- }
-}
-
QT_END_NAMESPACE
diff --git a/src/qdoc/htmlgenerator.h b/src/qdoc/htmlgenerator.h
index ea50e4baf..c1a47ba33 100644
--- a/src/qdoc/htmlgenerator.h
+++ b/src/qdoc/htmlgenerator.h
@@ -81,7 +81,6 @@ protected:
void generateManifestFile(const QString &manifest, const QString &element);
void readManifestMetaContent();
void generateKeywordAnchors(const Node *node);
- void generateAssociatedPropertyNotes(const FunctionNode *fn);
private:
enum SubTitleSize { SmallSubTitle, LargeSubTitle };
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/docbook/qml-qdoc-test-type.xml b/tests/auto/qdoc/generatedoutput/expected_output/docbook/qml-qdoc-test-type.xml
index 1ab15056a..59ed97a01 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/docbook/qml-qdoc-test-type.xml
+++ b/tests/auto/qdoc/generatedoutput/expected_output/docbook/qml-qdoc-test-type.xml
@@ -135,6 +135,9 @@
<db:section xml:id="completed-signal">
<db:title>completed(<db:emphasis>status</db:emphasis>)</db:title>
<db:para>This signal is emitted when the operation completed with <db:code role="parameter">status</db:code>.</db:para>
+<db:note>
+<db:para>The corresponding handler is <db:code>onCompleted</db:code>.</db:para>
+</db:note>
</db:section>
</db:section>
<db:section xml:id="attached-signal-documentation">
@@ -142,6 +145,9 @@
<db:section xml:id="configured-signal">
<db:title>configured()</db:title>
<db:para>This attached signal is emitted when the type was configured.</db:para>
+<db:note>
+<db:para>The corresponding handler is <db:code>onConfigured</db:code>.</db:para>
+</db:note>
</db:section>
</db:section>
<db:section xml:id="method-documentation">
diff --git a/tests/auto/qdoc/generatedoutput/expected_output/qml-qdoc-test-type.html b/tests/auto/qdoc/generatedoutput/expected_output/qml-qdoc-test-type.html
index 166cbee81..f18e97082 100644
--- a/tests/auto/qdoc/generatedoutput/expected_output/qml-qdoc-test-type.html
+++ b/tests/auto/qdoc/generatedoutput/expected_output/qml-qdoc-test-type.html
@@ -143,6 +143,7 @@
<a name="completed-signal"></a><span class="name">completed</span>(<i>status</i>)</p></td></tr>
</table></div></div>
<div class="qmldoc"><p>This signal is emitted when the operation completed with <i>status</i>.</p>
+<p><b>Note: </b>The corresponding handler is <code>onCompleted</code>.</p>
</div></div><!-- @@@completed -->
<br/>
<h2>Attached Signal Documentation</h2>
@@ -154,6 +155,7 @@
<a name="configured-signal"></a><span class="name">configured</span>()</p></td></tr>
</table></div></div>
<div class="qmldoc"><p>This attached signal is emitted when the type was configured.</p>
+<p><b>Note: </b>The corresponding handler is <code>onConfigured</code>.</p>
</div></div><!-- @@@configured -->
<br/>
<h2>Method Documentation</h2>
diff --git a/tests/auto/qdoc/generatedoutput/testdata/qml/type.cpp b/tests/auto/qdoc/generatedoutput/testdata/qml/type.cpp
index bf04bdb43..10a310a87 100644
--- a/tests/auto/qdoc/generatedoutput/testdata/qml/type.cpp
+++ b/tests/auto/qdoc/generatedoutput/testdata/qml/type.cpp
@@ -92,10 +92,14 @@
\qmlsignal Type::completed(int status)
This signal is emitted when the operation completed with \a status.
+
+ \note The corresponding handler is \c onCompleted.
*/
/*!
\qmlattachedsignal Type::configured()
This attached signal is emitted when the type was configured.
+
+ \note The corresponding handler is \c onConfigured.
*/