summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTopi Reinio <[email protected]>2025-04-07 12:10:18 +0000
committerTopi Reinio <[email protected]>2025-05-23 06:55:12 +0000
commit4d9ce3d7151e1993e2cb5c72a8e549abb872f3e2 (patch)
tree3f0492a148e70c57021e68491145966319869c1c
parent334b7bc2ab29475553da6941844b0504c63200ba (diff)
qdoc: Add support for generating links to source code in C++ referenceHEADdev
Define a set of new configuration variables, `url.examples` and its sub-variables, that allow for automatic linking to a service for browsing the projects source code, such as code.qt.io. Restrict the feature to C++ API as QDoc receives accurate location information for C++ entities from Clang. Majority of QML APIs in Qt are implemented in C++; often the only direct connection between QML declarations and the source code (that is visible to QDoc) is the source of the documentation comment itself, making this feature less reliable for QML. In order to generate a valid URL that includes the path relative to the project (repository) root directory, add a `url.sources.rootdir` variable that is explicitly interpreted as a path in the file system and validated. Allow injecting the path and line number components into the URL at select locations, using \1 and \2 as placeholders, respectively. Add `url.sources.linktext` to control the user-visible link text for the generated source links. Add `url.sources.enabled` for explicitly enabling the new feature. In a multi-module documentation project such as Qt, each module can maintain a source URL configuration, and it can be selectively enabled for specific types of builds (online vs. offline documentation) in the global configuration. [ChangeLog][QDoc] QDoc can now automatically generate links to the source code in C++ reference pages. Fixes: QTBUG-134268 Change-Id: I5bec0925e5cf2be48e0dc65bf9cbe3609b22c77a Reviewed-by: Topi Reiniƶ <[email protected]>
-rw-r--r--src/qdoc/qdoc/doc/qdoc-manual-qdocconf.qdoc41
-rw-r--r--src/qdoc/qdoc/src/qdoc/config.cpp26
-rw-r--r--src/qdoc/qdoc/src/qdoc/config.h11
-rw-r--r--src/qdoc/qdoc/src/qdoc/htmlgenerator.cpp37
-rw-r--r--src/qdoc/qdoc/src/qdoc/htmlgenerator.h1
-rw-r--r--src/qdoc/qdoc/tests/config/testdata/configs/sourcelink.qdocconf5
-rw-r--r--src/qdoc/qdoc/tests/config/tst_config.cpp15
-rw-r--r--src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/comprehensiveproject.qdocconf4
-rw-r--r--src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/crossmoduleref.html2
-rw-r--r--src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test-obsolete.html8
-rw-r--r--src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test.html24
-rw-r--r--src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived-obsolete.html2
-rw-r--r--src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived.html28
13 files changed, 172 insertions, 32 deletions
diff --git a/src/qdoc/qdoc/doc/qdoc-manual-qdocconf.qdoc b/src/qdoc/qdoc/doc/qdoc-manual-qdocconf.qdoc
index 1fab20b02..bd7ec2268 100644
--- a/src/qdoc/qdoc/doc/qdoc-manual-qdocconf.qdoc
+++ b/src/qdoc/qdoc/doc/qdoc-manual-qdocconf.qdoc
@@ -183,6 +183,7 @@
\li \l {tabsize-variable} {tabsize}
\li \l {url-variable} {url}
\li \l {url.examples-variable} {url.examples}
+ \li \l {url.sources-variable} {url.sources}
\li \l {usealttextastitle-variable} {usealttextastitle}
\li \l {version-variable} {version}
\li \l {versionsym-variable} {versionsym}
@@ -1936,6 +1937,46 @@
See also \l url, \l examplesinstallpath, and \l {example-command}{\\example}.
+ \target url.sources-variable
+ \section1 url.sources
+
+ The \c {url.sources} variable holds the base URL for the C++ source
+ code associated with the current project. This is a URL for viewing
+ the project's sources in a repository, for example, on \e {github.com}.
+
+ Enable the source links by setting \c {url.sources.enabled} to
+ \c true. When enabled, QDoc generates a link to a declaration
+ in the \e synopsis (signature) of each documented C++ entity in its
+ \e {Detailed description} section.
+
+ In addition, define the root directory of the sources with
+ \c {url.sources.rootdir}. The generated link is composed of the
+ base URL (\c {url.sources}) and the path of the source file, relative
+ to \c {url.sources.rootdir}.
+
+ If the URL contains more components after the path (for example, a query
+ string specifying a branch), \\1 acts as a placeholder for
+ the path. Similarly, \\2 acts as a placeholder for the line number.
+
+ \c {url.sources.linktext} sets the user-visible link text for source
+ links. By default, the link text is an empty string; use the \c {a.srclink}
+ CSS selector to style the links in the HTML output.
+
+ For example, with the following configuration in
+ \c {qtbase/src/gui/doc/qtgui.qdocconf}:
+
+ \badcode
+ url.sources = "https://code.qt.io/cgit/qt/qtbase.git/tree//1?h=$QT_VER#n\2"
+ url.sources.rootdir = ../../.. # root of the `qtbase` repository
+ url.sources.linktext = "(source)"
+ url.sources.enabled = true
+ \endcode
+
+ QDoc will generate links to \e code.qt.io for each documented C++
+ entity, specific to the branch defined with the \c QT_VER environment
+ variable.
+
+ The \c {url.sources} variable was introduced to QDoc with Qt 6.10.
\target usealttextastitle-variable
\section1 usealttextastitle
diff --git a/src/qdoc/qdoc/src/qdoc/config.cpp b/src/qdoc/qdoc/src/qdoc/config.cpp
index 5a327809d..0f5ce4ed8 100644
--- a/src/qdoc/qdoc/src/qdoc/config.cpp
+++ b/src/qdoc/qdoc/src/qdoc/config.cpp
@@ -71,6 +71,7 @@ QString ConfigStrings::REPORTMISSINGALTTEXTFORIMAGES =
QStringLiteral("reportmissingalttextforimages");
QString ConfigStrings::QHP = QStringLiteral("qhp");
QString ConfigStrings::QUOTINGINFORMATION = QStringLiteral("quotinginformation");
+QString ConfigStrings::ROOTDIR = QStringLiteral("rootdir");
QString ConfigStrings::SCRIPTS = QStringLiteral("scripts");
QString ConfigStrings::SHOWINTERNAL = QStringLiteral("showinternal");
QString ConfigStrings::SINGLEEXEC = QStringLiteral("singleexec");
@@ -358,6 +359,7 @@ void Config::clear()
m_configVars.clear();
m_includeFilesMap.clear();
m_excludedPaths.reset();
+ m_sourceLink.reset();
}
/*!
@@ -416,6 +418,10 @@ void Config::load(const QString &fileName)
else
m_location.setEtc(true);
+ // Resolve variables that are interpreted as paths
+ QString varName{CONFIG_URL + dot + CONFIG_SOURCES + dot + CONFIG_ROOTDIR};
+ setStringList(varName, getCanonicalPathList(varName, Validate));
+
expandVariables();
// Add defines and includepaths from command line to their
@@ -1423,6 +1429,26 @@ const Config::ExcludedPaths& Config::getExcludedPaths() {
return *m_excludedPaths;
}
+/*!
+ Returns a SourceLink struct with settings required to
+ construct source links to API entities.
+*/
+const Config::SourceLink &Config::getSourceLink()
+{
+ if (m_sourceLink)
+ return *m_sourceLink;
+
+ const auto srcUrl{CONFIG_URL + Config::dot + CONFIG_SOURCES};
+
+ const auto baseUrl = m_configVars.value(srcUrl).asString();
+ const auto rootPath = m_configVars.value(srcUrl + dot + CONFIG_ROOTDIR).asString();
+ const auto linkText = m_configVars.value(srcUrl + dot + "linktext").asString();
+ const auto enabled = m_configVars.value(srcUrl + dot + "enabled").asBool();
+
+ m_sourceLink.emplace(SourceLink{baseUrl, rootPath, linkText, enabled});
+ return *m_sourceLink;
+}
+
std::set<Config::HeaderFilePath> Config::getHeaderFiles() {
static QStringList accepted_header_file_extensions{
"ch", "h", "h++", "hh", "hpp", "hxx"
diff --git a/src/qdoc/qdoc/src/qdoc/config.h b/src/qdoc/qdoc/src/qdoc/config.h
index 413ca7685..12506ed00 100644
--- a/src/qdoc/qdoc/src/qdoc/config.h
+++ b/src/qdoc/qdoc/src/qdoc/config.h
@@ -188,6 +188,14 @@ public:
};
const ExcludedPaths& getExcludedPaths();
+ struct SourceLink {
+ QString baseUrl;
+ QString rootPath;
+ QString linkText;
+ bool enabled;
+ };
+ const SourceLink &getSourceLink();
+
struct HeaderFilePath {
QString path;
QString filename;
@@ -213,6 +221,7 @@ private:
QString m_currentDir {};
QString m_previousCurrentDir {};
std::optional<ExcludedPaths> m_excludedPaths{};
+ std::optional<SourceLink> m_sourceLink{};
bool m_showInternal { false };
static bool m_debug;
@@ -299,6 +308,7 @@ struct ConfigStrings
static QString REPORTMISSINGALTTEXTFORIMAGES;
static QString QHP;
static QString QUOTINGINFORMATION;
+ static QString ROOTDIR;
static QString SCRIPTS;
static QString SHOWINTERNAL;
static QString SINGLEEXEC;
@@ -382,6 +392,7 @@ struct ConfigStrings
#define CONFIG_REPORTMISSINGALTTEXTFORIMAGES ConfigStrings::REPORTMISSINGALTTEXTFORIMAGES
#define CONFIG_QHP ConfigStrings::QHP
#define CONFIG_QUOTINGINFORMATION ConfigStrings::QUOTINGINFORMATION
+#define CONFIG_ROOTDIR ConfigStrings::ROOTDIR
#define CONFIG_SCRIPTS ConfigStrings::SCRIPTS
#define CONFIG_SHOWINTERNAL ConfigStrings::SHOWINTERNAL
#define CONFIG_SINGLEEXEC ConfigStrings::SINGLEEXEC
diff --git a/src/qdoc/qdoc/src/qdoc/htmlgenerator.cpp b/src/qdoc/qdoc/src/qdoc/htmlgenerator.cpp
index 09d911190..6c1ade6db 100644
--- a/src/qdoc/qdoc/src/qdoc/htmlgenerator.cpp
+++ b/src/qdoc/qdoc/src/qdoc/htmlgenerator.cpp
@@ -3421,6 +3421,40 @@ void HtmlGenerator::generateFullName(const Node *apparentNode, const Node *relat
out() << "</a>";
}
+/*!
+ Generates a link to the declaration of the C++ API entity
+ represented by \a node.
+*/
+void HtmlGenerator::generateSourceLink(const Node *node)
+{
+ Q_ASSERT(node);
+ if (node->genus() != Genus::CPP)
+ return;
+
+ const auto srcLink = Config::instance().getSourceLink();
+ if (!srcLink.enabled)
+ return;
+
+ // With no valid configuration or location, do nothing
+ const auto &loc{node->declLocation()};
+ if (loc.isEmpty() || srcLink.baseUrl.isEmpty() || srcLink.rootPath.isEmpty())
+ return;
+
+ QString srcUrl{srcLink.baseUrl};
+ if (!srcUrl.contains('\1'_L1)) {
+ if (!srcUrl.endsWith('/'_L1))
+ srcUrl += '/'_L1;
+ srcUrl += '\1'_L1;
+ }
+
+ QDir rootDir{srcLink.rootPath};
+ srcUrl.replace('\1'_L1, rootDir.relativeFilePath(loc.filePath()));
+ srcUrl.replace('\2'_L1, QString::number(loc.lineNo()));
+ const auto &description{"View declaration of this %1"_L1.arg(node->nodeTypeString())};
+ out() << "<a class=\"srclink\" href=\"%1\" title=\"%2\">%3</a>"_L1
+ .arg(srcUrl, description, srcLink.linkText);
+}
+
void HtmlGenerator::generateDetailedMember(const Node *node, const PageNode *relative,
CodeMarker *marker)
{
@@ -3436,6 +3470,7 @@ void HtmlGenerator::generateDetailedMember(const Node *node, const PageNode *rel
nodeRef = refForNode(sharedNode);
out() << R"(<h3 class="fn fngroupitem" translate="no" id=")" << nodeRef << "\">";
generateSynopsis(sharedNode, relative, marker, Section::Details);
+ generateSourceLink(sharedNode);
out() << "</h3>";
}
if (collective.size() > 1)
@@ -3448,10 +3483,12 @@ void HtmlGenerator::generateDetailedMember(const Node *node, const PageNode *rel
generateSynopsis(etn, relative, marker, Section::Details);
out() << "<br/>";
generateSynopsis(etn->flagsType(), relative, marker, Section::Details);
+ generateSourceLink(node);
out() << "</h3>\n";
} else {
out() << R"(<h3 class="fn" translate="no" id=")" << nodeRef << "\">";
generateSynopsis(node, relative, marker, Section::Details);
+ generateSourceLink(node);
out() << "</h3>" << '\n';
}
}
diff --git a/src/qdoc/qdoc/src/qdoc/htmlgenerator.h b/src/qdoc/qdoc/src/qdoc/htmlgenerator.h
index 35319f3eb..7c72c38da 100644
--- a/src/qdoc/qdoc/src/qdoc/htmlgenerator.h
+++ b/src/qdoc/qdoc/src/qdoc/htmlgenerator.h
@@ -94,6 +94,7 @@ private:
void generateFullName(const Node *apparentNode, const Node *relative,
const Node *actualNode = nullptr);
+ void generateSourceLink(const Node *node);
void generateDetailedMember(const Node *node, const PageNode *relative, CodeMarker *marker);
void generateLink(const Atom *atom);
diff --git a/src/qdoc/qdoc/tests/config/testdata/configs/sourcelink.qdocconf b/src/qdoc/qdoc/tests/config/testdata/configs/sourcelink.qdocconf
new file mode 100644
index 000000000..1dbc35e8c
--- /dev/null
+++ b/src/qdoc/qdoc/tests/config/testdata/configs/sourcelink.qdocconf
@@ -0,0 +1,5 @@
+project = SourceLink
+
+url.sources = "http://localhost/"
+url.sources.rootdir = .
+url.sources.linktext = link
diff --git a/src/qdoc/qdoc/tests/config/tst_config.cpp b/src/qdoc/qdoc/tests/config/tst_config.cpp
index 0e73130b8..90cfd6f90 100644
--- a/src/qdoc/qdoc/tests/config/tst_config.cpp
+++ b/src/qdoc/qdoc/tests/config/tst_config.cpp
@@ -21,6 +21,7 @@ private slots:
void includepaths();
void getExampleProjectFile();
void expandVars();
+ void sourceLink();
private:
Config &initConfig(const QStringList &args = QStringList(),
@@ -175,6 +176,20 @@ void::tst_Config::expandVars()
QCOMPARE(config.get("csvlist").asString(), "a,b,c");
}
+void::tst_Config::sourceLink()
+{
+ auto &config = initConfig();
+ const auto docConfig = QFINDTESTDATA("/testdata/configs/sourcelink.qdocconf");
+ if (!docConfig.isEmpty())
+ config.load(docConfig);
+
+ auto dir = QFileInfo(docConfig).dir();
+ QCOMPARE(config.getSourceLink().rootPath, dir.absolutePath());
+ QCOMPARE(config.getSourceLink().baseUrl, "http://localhost/");
+ QCOMPARE(config.getSourceLink().linkText, "link");
+ QCOMPARE(config.getSourceLink().enabled, false);
+}
+
QTEST_APPLESS_MAIN(tst_Config)
#include "tst_config.moc"
diff --git a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/comprehensiveproject.qdocconf b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/comprehensiveproject.qdocconf
index 873c94dc2..f4ce00766 100644
--- a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/comprehensiveproject.qdocconf
+++ b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/comprehensiveproject.qdocconf
@@ -1,6 +1,10 @@
project = Test
productname = Qt
description = "A test project for QDoc build artifacts"
+url.sources = "http://localhost//1?v\=1.0#L\2"
+url.sources.rootdir = ../../../../../../.. # root of qttools repository
+url.sources.linktext = (source)
+url.sources.enabled = true
sources.fileextensions = "*.qml *.cpp *.qdoc"
headers.fileextensions = "*.h"
diff --git a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/crossmoduleref.html b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/crossmoduleref.html
index d1def84e8..e1da268d3 100644
--- a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/crossmoduleref.html
+++ b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/crossmoduleref.html
@@ -39,7 +39,7 @@
<div class="func">
<h2>Function Documentation</h2>
<!-- $$$documentMe[overload1]$$$documentMe -->
-<h3 class="fn" translate="no" id="documentMe"><span class="type">void</span> CrossModuleRef::<span class="name">documentMe</span>()</h3>
+<h3 class="fn" translate="no" id="documentMe"><span class="type">void</span> CrossModuleRef::<span class="name">documentMe</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L142" title="View declaration of this function">(source)</a></h3>
<p>Document me!</p>
<!-- @@@documentMe -->
</div>
diff --git a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test-obsolete.html b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test-obsolete.html
index e006f2570..72e37caa1 100644
--- a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test-obsolete.html
+++ b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test-obsolete.html
@@ -23,21 +23,21 @@
<h2>Member Function Documentation</h2>
<!-- $$$ -->
<div class="fngroup">
-<h3 class="fn fngroupitem" translate="no" id="operator-2b-2b"><code class="details extra" translate="no">[deprecated]</code> <span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;Test::<span class="name">operator++</span>()</h3><h3 class="fn fngroupitem" translate="no" id="operator--"><code class="details extra" translate="no">[deprecated]</code> <span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;Test::<span class="name">operator--</span>()</h3></div>
+<h3 class="fn fngroupitem" translate="no" id="operator-2b-2b"><code class="details extra" translate="no">[deprecated]</code> <span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;Test::<span class="name">operator++</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L61" title="View declaration of this function">(source)</a></h3><h3 class="fn fngroupitem" translate="no" id="operator--"><code class="details extra" translate="no">[deprecated]</code> <span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;Test::<span class="name">operator--</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L63" title="View declaration of this function">(source)</a></h3></div>
<p>This function is deprecated. We strongly advise against using it in new code.</p>
<!-- @@@ -->
<!-- $$$anotherObsoleteMember[overload1]$$$anotherObsoleteMember -->
-<h3 class="fn" translate="no" id="anotherObsoleteMember"><code class="details extra" translate="no">[deprecated]</code> <span class="type">void</span> Test::<span class="name">anotherObsoleteMember</span>()</h3>
+<h3 class="fn" translate="no" id="anotherObsoleteMember"><code class="details extra" translate="no">[deprecated]</code> <span class="type">void</span> Test::<span class="name">anotherObsoleteMember</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L51" title="View declaration of this function">(source)</a></h3>
<p>This function is deprecated. We strongly advise against using it in new code.</p>
<p>Use <a href="http://code.qt.io/testqdoc-test-obsolete.html#obsoleteMember" translate="no">obsoleteMember</a>() instead.</p>
<!-- @@@anotherObsoleteMember -->
<!-- $$$deprecatedMember[overload1]$$$deprecatedMember -->
-<h3 class="fn" translate="no" id="deprecatedMember"><code class="details extra" translate="no">[deprecated in 6.0]</code> <span class="type">void</span> Test::<span class="name">deprecatedMember</span>()</h3>
+<h3 class="fn" translate="no" id="deprecatedMember"><code class="details extra" translate="no">[deprecated in 6.0]</code> <span class="type">void</span> Test::<span class="name">deprecatedMember</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L52" title="View declaration of this function">(source)</a></h3>
<p>This function is deprecated since 6.0. We strongly advise against using it in new code.</p>
<p>Use <a href="http://code.qt.io/testqdoc-test.html#someFunction" translate="no">someFunction</a>() instead.</p>
<!-- @@@deprecatedMember -->
<!-- $$$obsoleteMember[overload1]$$$obsoleteMember -->
-<h3 class="fn" translate="no" id="obsoleteMember"><code class="details extra" translate="no">[deprecated]</code> <span class="type">void</span> Test::<span class="name">obsoleteMember</span>()</h3>
+<h3 class="fn" translate="no" id="obsoleteMember"><code class="details extra" translate="no">[deprecated]</code> <span class="type">void</span> Test::<span class="name">obsoleteMember</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L50" title="View declaration of this function">(source)</a></h3>
<p>This function is deprecated. We strongly advise against using it in new code.</p>
<p>Use <a href="http://code.qt.io/testqdoc-test.html#someFunction" translate="no">someFunction</a>() instead.</p>
<!-- @@@obsoleteMember -->
diff --git a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test.html b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test.html
index e2cd76116..95d148cac 100644
--- a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test.html
+++ b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-test.html
@@ -83,7 +83,7 @@
<div class="types">
<h2>Member Type Documentation</h2>
<!-- $$$SomeType -->
-<h3 class="fn" translate="no" id="SomeType-typedef">Test::<span class="name">SomeType</span></h3>
+<h3 class="fn" translate="no" id="SomeType-typedef">Test::<span class="name">SomeType</span><a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L47" title="View declaration of this typedef">(source)</a></h3>
<p>A typedef.</p>
<!-- @@@SomeType -->
</div>
@@ -91,23 +91,23 @@
<h2>Member Function Documentation</h2>
<!-- $$$ -->
<div class="fngroup">
-<h3 class="fn fngroupitem" translate="no" id="overload"><code class="details extra" translate="no">[protected]</code> <span class="type">void</span> Test::<span class="name">overload</span>()</h3><h3 class="fn fngroupitem" translate="no" id="overload-1"><code class="details extra" translate="no">[protected, since Test 1.2]</code> <span class="type">void</span> Test::<span class="name">overload</span>(<span class="type">bool</span> <i>b</i>)</h3></div>
+<h3 class="fn fngroupitem" translate="no" id="overload"><code class="details extra" translate="no">[protected]</code> <span class="type">void</span> Test::<span class="name">overload</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L75" title="View declaration of this function">(source)</a></h3><h3 class="fn fngroupitem" translate="no" id="overload-1"><code class="details extra" translate="no">[protected, since Test 1.2]</code> <span class="type">void</span> Test::<span class="name">overload</span>(<span class="type">bool</span> <i>b</i>)<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L76" title="View declaration of this function">(source)</a></h3></div>
<p>Overloads that share a documentation comment, optionally taking a parameter <i translate="no">b</i>.</p>
<!-- @@@ -->
<!-- $$$Test[overload1]$$$Test -->
-<h3 class="fn" translate="no" id="Test">Test::<span class="name">Test</span>()</h3>
+<h3 class="fn" translate="no" id="Test">Test::<span class="name">Test</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L71" title="View declaration of this function">(source)</a></h3>
<p>The constructor is deleted.</p>
<!-- @@@Test -->
<!-- $$$funcPtr[overload1]$$$funcPtrboolconstchar* -->
-<h3 class="fn" translate="no" id="funcPtr"><span class="type">void</span> (*)(<span class="type">bool</span>) Test::<span class="name">funcPtr</span>(<span class="type">bool</span> <i>b</i>, const <span class="type">char</span> *<i>s</i>)</h3>
+<h3 class="fn" translate="no" id="funcPtr"><span class="type">void</span> (*)(<span class="type">bool</span>) Test::<span class="name">funcPtr</span>(<span class="type">bool</span> <i>b</i>, const <span class="type">char</span> *<i>s</i>)<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L57" title="View declaration of this function">(source)</a></h3>
<p>Returns a pointer to a function that takes a boolean. Uses <i translate="no">b</i> and <i translate="no">s</i>.</p>
<!-- @@@funcPtr -->
<!-- $$$inlineFunction[overload1]$$$inlineFunction -->
-<h3 class="fn" translate="no" id="inlineFunction"><span class="type">void</span> Test::<span class="name">inlineFunction</span>()</h3>
+<h3 class="fn" translate="no" id="inlineFunction"><span class="type">void</span> Test::<span class="name">inlineFunction</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L66" title="View declaration of this function">(source)</a></h3>
<p>An inline function, documented using the \fn QDoc command.</p>
<!-- @@@inlineFunction -->
<!-- $$$methodWithEmDashInItsDocs[overload1]$$$methodWithEmDashInItsDocs -->
-<h3 class="fn" translate="no" id="methodWithEmDashInItsDocs"><span class="type">void</span> Test::<span class="name">methodWithEmDashInItsDocs</span>()</h3>
+<h3 class="fn" translate="no" id="methodWithEmDashInItsDocs"><span class="type">void</span> Test::<span class="name">methodWithEmDashInItsDocs</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L54" title="View declaration of this function">(source)</a></h3>
<p>This method has em dashes in its documentation&mdash;as you'll find represented by <code translate="no">---</code> in the sources&mdash;here and there. The important bit to note is that when passed e.g. to the \c command, the three hyphens are processed as input to the command and not replaced by an em dash.</p>
<p>-----------------------------------------------------------------------</p>
<p>People can still add a bunch of dashes, though, without QDoc replacing them all with a series of em dashes.</p>
@@ -115,7 +115,7 @@
<p><b>See also </b><a href="http://code.qt.io/testqdoc-test.html#methodWithEnDashInItsDocs" translate="no">methodWithEnDashInItsDocs</a>.</p>
<!-- @@@methodWithEmDashInItsDocs -->
<!-- $$$methodWithEnDashInItsDocs[overload1]$$$methodWithEnDashInItsDocs -->
-<h3 class="fn" translate="no" id="methodWithEnDashInItsDocs"><span class="type">void</span> Test::<span class="name">methodWithEnDashInItsDocs</span>()</h3>
+<h3 class="fn" translate="no" id="methodWithEnDashInItsDocs"><span class="type">void</span> Test::<span class="name">methodWithEnDashInItsDocs</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L53" title="View declaration of this function">(source)</a></h3>
<p>This method has en dashes in its documentation &ndash; as you'll find represented by <code translate="no">--</code> in the sources &ndash; here and there. The important bit to note is that when passed e.g. to the \c command, the two hyphens are processed as input to the command and not replaced by an en dash. This also applies to code blocks, where otherwise, the decrement operator would get completely borked:</p>
<pre class="cpp" translate="no"><span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">42</span>; i <span class="operator">&gt;</span> <span class="number">0</span>; <span class="operator">-</span><span class="operator">-</span>i)
<span class="comment">// Do something cool during countdown.</span></pre>
@@ -127,29 +127,29 @@
<p><b>See also </b>methodWithEnDashInItsDocs.</p>
<!-- @@@methodWithEnDashInItsDocs -->
<!-- $$$someFunction[overload1]$$$someFunctionintint -->
-<h3 class="fn" translate="no" id="someFunction"><code class="details extra" translate="no">[since Test 1.0]</code> <span class="type">int</span> Test::<span class="name">someFunction</span>(<span class="type">int</span>, <span class="type">int</span> <i>v</i> = 0)</h3>
+<h3 class="fn" translate="no" id="someFunction"><code class="details extra" translate="no">[since Test 1.0]</code> <span class="type">int</span> Test::<span class="name">someFunction</span>(<span class="type">int</span>, <span class="type">int</span> <i>v</i> = 0)<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L48" title="View declaration of this function">(source)</a></h3>
<p>Function that takes a parameter <i translate="no">v</i>. Also returns the value of <i translate="no">v</i>.</p>
<p>This function was introduced in Test 1.0.</p>
<!-- @@@someFunction -->
<!-- $$$someFunctionDefaultArg[overload1]$$$someFunctionDefaultArgintbool -->
-<h3 class="fn" translate="no" id="someFunctionDefaultArg"><code class="details extra" translate="no">[since 2.0]</code> <span class="type">void</span> Test::<span class="name">someFunctionDefaultArg</span>(<span class="type">int</span> <i>i</i>, <span class="type">bool</span> <i>b</i> = false) const</h3>
+<h3 class="fn" translate="no" id="someFunctionDefaultArg"><code class="details extra" translate="no">[since 2.0]</code> <span class="type">void</span> Test::<span class="name">someFunctionDefaultArg</span>(<span class="type">int</span> <i>i</i>, <span class="type">bool</span> <i>b</i> = false) const<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L49" title="View declaration of this function">(source)</a></h3>
<p>Function that takes a parameter <i translate="no">i</i> and <i translate="no">b</i>.</p>
<p><b>Warning:</b> This function is not <a href="https://doc.qt.io/qt/17-qdoc-commands-thread.html#reentrant-command">reentrant</a>.</p>
<p>This function was introduced in Qt 2.0.</p>
<!-- @@@someFunctionDefaultArg -->
<!-- $$$virtualFun[overload1]$$$virtualFun -->
-<h3 class="fn" translate="no" id="virtualFun"><code class="details extra" translate="no">[virtual]</code> <span class="type">void</span> Test::<span class="name">virtualFun</span>()</h3>
+<h3 class="fn" translate="no" id="virtualFun"><code class="details extra" translate="no">[virtual]</code> <span class="type">void</span> Test::<span class="name">virtualFun</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L67" title="View declaration of this function">(source)</a></h3>
<p>Function that must be reimplemented.</p>
<!-- @@@virtualFun -->
<!-- $$$operator=[overload1]$$$operator=TestQDoc::Test&& -->
-<h3 class="fn" translate="no" id="operator-eq"><span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;Test::<span class="name">operator=</span>(<span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;&amp;<i>other</i>)</h3>
+<h3 class="fn" translate="no" id="operator-eq"><span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;Test::<span class="name">operator=</span>(<span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;&amp;<i>other</i>)<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L72" title="View declaration of this function">(source)</a></h3>
<p>The move assignment operator is deleted. <i translate="no">other</i> cannot be moved from.</p>
<!-- @@@operator= -->
</div>
<div class="relnonmem">
<h2>Related Non-Members</h2>
<!-- $$$operator==[overload1]$$$operator==constTestQDoc::Test&constTestQDoc::Test& -->
-<h3 class="fn" translate="no" id="operator-eq-eq"><span class="type">bool</span> <span class="name">operator==</span>(const <span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;<i>lhs</i>, const <span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;<i>rhs</i>)</h3>
+<h3 class="fn" translate="no" id="operator-eq-eq"><span class="type">bool</span> <span class="name">operator==</span>(const <span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;<i>lhs</i>, const <span class="type"><a href="http://code.qt.io/testqdoc-test.html" translate="no">TestQDoc::Test</a></span> &amp;<i>rhs</i>)<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L69" title="View declaration of this function">(source)</a></h3>
<p>Returns true if <i translate="no">lhs</i> and <i translate="no">rhs</i> are equal.</p>
<!-- @@@operator== -->
</div>
diff --git a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived-obsolete.html b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived-obsolete.html
index 60e491123..abaecee9c 100644
--- a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived-obsolete.html
+++ b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived-obsolete.html
@@ -18,7 +18,7 @@
</table></div>
<h2>Member Function Documentation</h2>
<!-- $$$staticObsoleteMember[overload1]$$$staticObsoleteMember -->
-<h3 class="fn" translate="no" id="staticObsoleteMember"><code class="details extra" translate="no">[static, deprecated]</code> <span class="type">void</span> TestDerived::<span class="name">staticObsoleteMember</span>()</h3>
+<h3 class="fn" translate="no" id="staticObsoleteMember"><code class="details extra" translate="no">[static, deprecated]</code> <span class="type">void</span> TestDerived::<span class="name">staticObsoleteMember</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L106" title="View declaration of this function">(source)</a></h3>
<p>This function is deprecated. We strongly advise against using it in new code.</p>
<p>Static obsolete method.</p>
<!-- @@@staticObsoleteMember -->
diff --git a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived.html b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived.html
index 7d3948e81..749eae069 100644
--- a/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived.html
+++ b/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/expected/html/testqdoc-testderived.html
@@ -96,15 +96,15 @@
<div class="types">
<h2>Member Type Documentation</h2>
<!-- $$$DerivedType -->
-<h3 class="fn" translate="no" id="DerivedType-typedef"><code class="details extra" translate="no">[alias]</code> TestDerived::<span class="name">DerivedType</span></h3>
+<h3 class="fn" translate="no" id="DerivedType-typedef"><code class="details extra" translate="no">[alias]</code> TestDerived::<span class="name">DerivedType</span><a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L103" title="View declaration of this typedef">(source)</a></h3>
<p>An aliased typedef.</p>
<!-- @@@DerivedType -->
<!-- $$$NotTypedef -->
-<h3 class="fn" translate="no" id="NotTypedef-typedef"><code class="details extra" translate="no">[alias]</code> TestDerived::<span class="name">NotTypedef</span></h3>
+<h3 class="fn" translate="no" id="NotTypedef-typedef"><code class="details extra" translate="no">[alias]</code> TestDerived::<span class="name">NotTypedef</span><a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L104" title="View declaration of this typedef">(source)</a></h3>
<p>I'm an alias, not a typedef.</p>
<!-- @@@NotTypedef -->
<!-- $$$anonymous$$$Val1$$$Val2$$$Val3$$$Val4 -->
-<h3 class="fn" translate="no" id="anonymous-enum"><code class="details extra" translate="no">[anonymous]</code> enum</h3>
+<h3 class="fn" translate="no" id="anonymous-enum"><code class="details extra" translate="no">[anonymous]</code> enum<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L101" title="View declaration of this enum">(source)</a></h3>
<div class="table"><table class="valuelist"><tr><th class="tblConst">Constant</th><th class="tblVal">Value</th></tr>
<tr><td class="topAlign"><code translate="no">TestQDoc::TestDerived::Val1</code></td><td class="topAlign tblval"><code translate="no">0</code></td></tr>
<tr><td class="topAlign"><code translate="no">TestQDoc::TestDerived::Val2</code></td><td class="topAlign tblval"><code translate="no">1</code></td></tr>
@@ -116,7 +116,7 @@
<div class="prop">
<h2>Property Documentation</h2>
<!-- $$$bindableProp-prop$$$bindableProp$$$setBindablePropconstQString&$$$bindablePropChanged -->
-<h3 class="fn" translate="no" id="bindableProp-prop"><code class="details extra" translate="no">[bindable]</code> <span class="name">bindableProp</span> : <span class="type">QString</span></h3>
+<h3 class="fn" translate="no" id="bindableProp-prop"><code class="details extra" translate="no">[bindable]</code> <span class="name">bindableProp</span> : <span class="type">QString</span><a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L91" title="View declaration of this property">(source)</a></h3>
<div class="admonition note"><p><b>Note: </b>This property supports <a href="https://wiki.qt.io/QProperty">QProperty</a> bindings.</p>
</div><p>Some property.</p>
<p><b>Access functions:</b></p>
@@ -131,7 +131,7 @@
<p><b>See also </b><a href="http://code.qt.io/testqdoc-testderived.html#someProp-prop" translate="no">someProp</a>.</p>
<!-- @@@bindableProp -->
<!-- $$$boolProp-prop$$$boolProp$$$setBoolPropbool$$$resetBoolProp$$$boolPropChanged -->
-<h3 class="fn" translate="no" id="boolProp-prop"><span class="name">boolProp</span> : <span class="type">bool</span></h3>
+<h3 class="fn" translate="no" id="boolProp-prop"><span class="name">boolProp</span> : <span class="type">bool</span><a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L95" title="View declaration of this property">(source)</a></h3>
<p>A boolean property.</p>
<p><b>Access functions:</b></p>
<div class="table"><table class="alignedsummary" translate="no">
@@ -145,7 +145,7 @@
</table></div>
<!-- @@@boolProp -->
<!-- $$$intProp-prop$$$getInt -->
-<h3 class="fn" translate="no" id="intProp-prop"><code class="details extra" translate="no">[read-only]</code> <span class="name">intProp</span> : <span class="type">int</span>* const</h3>
+<h3 class="fn" translate="no" id="intProp-prop"><code class="details extra" translate="no">[read-only]</code> <span class="name">intProp</span> : <span class="type">int</span>* const<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L93" title="View declaration of this property">(source)</a></h3>
<p>An integer property.</p>
<p><b>Access functions:</b></p>
<div class="table"><table class="alignedsummary" translate="no">
@@ -153,7 +153,7 @@
</table></div>
<!-- @@@intProp -->
<!-- $$$name-prop$$$name -->
-<h3 class="fn" translate="no" id="name-prop"><code class="details extra" translate="no">[read-only]</code> <span class="name">name</span> : const <span class="type">QString</span>*</h3>
+<h3 class="fn" translate="no" id="name-prop"><code class="details extra" translate="no">[read-only]</code> <span class="name">name</span> : const <span class="type">QString</span>*<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L94" title="View declaration of this property">(source)</a></h3>
<p>This property holds a name.</p>
<p><b>Access functions:</b></p>
<div class="table"><table class="alignedsummary" translate="no">
@@ -161,7 +161,7 @@
</table></div>
<!-- @@@name -->
<!-- $$$secondBoolProp-prop$$$secondBoolProp$$$boolPropChanged -->
-<h3 class="fn" translate="no" id="secondBoolProp-prop"><code class="details extra" translate="no">[read-only]</code> <span class="name">secondBoolProp</span> : const <span class="type">bool</span></h3>
+<h3 class="fn" translate="no" id="secondBoolProp-prop"><code class="details extra" translate="no">[read-only]</code> <span class="name">secondBoolProp</span> : const <span class="type">bool</span><a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L96" title="View declaration of this property">(source)</a></h3>
<p>A property sharing a notifier signal with <a href="http://code.qt.io/testqdoc-testderived.html#boolProp-prop" translate="no">boolProp</a>.</p>
<p><b>Access functions:</b></p>
<div class="table"><table class="alignedsummary" translate="no">
@@ -173,7 +173,7 @@
</table></div>
<!-- @@@secondBoolProp -->
<!-- $$$someProp-prop$$$someProp -->
-<h3 class="fn" translate="no" id="someProp-prop"><code class="details extra" translate="no">[bindable read-only]</code> <span class="name">someProp</span> : <span class="type">QString</span></h3>
+<h3 class="fn" translate="no" id="someProp-prop"><code class="details extra" translate="no">[bindable read-only]</code> <span class="name">someProp</span> : <span class="type">QString</span><a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L92" title="View declaration of this property">(source)</a></h3>
<div class="admonition note"><p><b>Note: </b>This property supports <a href="https://wiki.qt.io/QProperty">QProperty</a> bindings.</p>
</div><p>Another property.</p>
<p><b>Access functions:</b></p>
@@ -185,24 +185,24 @@
<div class="func">
<h2>Member Function Documentation</h2>
<!-- $$$emitSomething[overload1]$$$emitSomething -->
-<h3 class="fn" translate="no" id="emitSomething"><code class="details extra" translate="no">[private signal]</code> <span class="type">void</span> TestDerived::<span class="name">emitSomething</span>()</h3>
+<h3 class="fn" translate="no" id="emitSomething"><code class="details extra" translate="no">[private signal]</code> <span class="type">void</span> TestDerived::<span class="name">emitSomething</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L121" title="View declaration of this function">(source)</a></h3>
<p>Emitted when things happen.</p>
<div class="admonition note"><p><b>Note: </b>This is a private signal. It can be used in signal connections but cannot be emitted by the user.</p>
</div><!-- @@@emitSomething -->
<!-- $$$id[overload1]$$$id -->
-<h3 class="fn" translate="no" id="id"><code class="details extra" translate="no">[override virtual]</code> <span class="type">int</span> TestDerived::<span class="name">id</span>()</h3>
+<h3 class="fn" translate="no" id="id"><code class="details extra" translate="no">[override virtual]</code> <span class="type">int</span> TestDerived::<span class="name">id</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L118" title="View declaration of this function">(source)</a></h3>
<!-- @@@id -->
<!-- $$$invokeMe[overload1]$$$invokeMe -->
-<h3 class="fn" translate="no" id="invokeMe"><code class="details extra" translate="no">[invokable]</code> <span class="type">void</span> TestDerived::<span class="name">invokeMe</span>() const</h3>
+<h3 class="fn" translate="no" id="invokeMe"><code class="details extra" translate="no">[invokable]</code> <span class="type">void</span> TestDerived::<span class="name">invokeMe</span>() const<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L117" title="View declaration of this function">(source)</a></h3>
<p>Something invokable.</p>
<div class="admonition note"><p><b>Note: </b>This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.</p>
</div><!-- @@@invokeMe -->
<!-- $$$someValue[overload1]$$$someValue -->
-<h3 class="fn" translate="no" id="someValue"><span class="type"><a href="http://code.qt.io/testqdoc-testderived.html#NotTypedef-typedef" translate="no">TestQDoc::TestDerived::NotTypedef</a></span> TestDerived::<span class="name">someValue</span>()</h3>
+<h3 class="fn" translate="no" id="someValue"><span class="type"><a href="http://code.qt.io/testqdoc-testderived.html#NotTypedef-typedef" translate="no">TestQDoc::TestDerived::NotTypedef</a></span> TestDerived::<span class="name">someValue</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L107" title="View declaration of this function">(source)</a></h3>
<p>Returns a value using an aliases type.</p>
<!-- @@@someValue -->
<!-- $$$virtualFun[overload1]$$$virtualFun -->
-<h3 class="fn" translate="no" id="virtualFun"><code class="details extra" translate="no">[override virtual]</code> <span class="type">void</span> TestDerived::<span class="name">virtualFun</span>()</h3>
+<h3 class="fn" translate="no" id="virtualFun"><code class="details extra" translate="no">[override virtual]</code> <span class="type">void</span> TestDerived::<span class="name">virtualFun</span>()<a class="srclink" href="http://localhost/src/qdoc/qdoc/tests/validateqdocoutputfiles/testdata/comprehensiveproject/src/testcpp.h?v=1.0#L105" title="View declaration of this function">(source)</a></h3>
<p>Reimplements: <a href="http://code.qt.io/testqdoc-test.html#virtualFun" translate="no">Test::virtualFun</a>().</p>
<!-- @@@virtualFun -->
</div>