Skip to content

Commit 8460b4e

Browse files
committed
qdoc: Clean up \keyword and \target processing
Extract recurring code in HelpProjectWriter::generateSection() into a reusable lambda. Move the warning about a 'bad keyword' to happen already during parsing, to docparser.cpp. The only bad keyword is an empty one, so modify the warning message accordingly. Extend the same warning to apply to both \keyword and \target commands. Pick-to: 6.8 Change-Id: Iec033e98517a959f0ed96dbdf859799347334874 Reviewed-by: Paul Wicking <[email protected]>
1 parent c95c68a commit 8460b4e

File tree

2 files changed

+32
-54
lines changed

2 files changed

+32
-54
lines changed

src/qdoc/qdoc/src/qdoc/docparser.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,15 +1329,21 @@ QString DocParser::detailsUnknownCommand(const QSet<QString> &metaCommandSet, co
13291329
/*!
13301330
\internal
13311331
1332-
Issues a warning about the duplicate definition of a target or keyword in
1333-
at \a location. \a duplicateDefinition is the target being processed; the
1334-
already registered definition is \a previousDefinition.
1332+
Issues a warning about an empty or duplicate definition of either a
1333+
\\target or \\keyword command (determined by \a cmdString) at
1334+
\a location. \a duplicateDefinition is the target being processed;
1335+
the already registered definition is \a previousDefinition.
13351336
*/
1336-
static void warnAboutPreexistingTarget(const Location &location, const QString &duplicateDefinition, const QString &previousDefinition)
1337+
static void warnAboutEmptyOrPreexistingTarget(const Location &location, const QString &duplicateDefinition,
1338+
const QString &cmdString, const QString &previousDefinition)
13371339
{
1338-
location.warning(
1339-
QStringLiteral("Duplicate target name '%1'. The previous occurrence is here: %2")
1340-
.arg(duplicateDefinition, previousDefinition));
1340+
if (duplicateDefinition.isEmpty()) {
1341+
location.warning("Expected an argument for \\%1"_L1.arg(cmdString));
1342+
} else {
1343+
location.warning(
1344+
"Duplicate %3 name '%1'. The previous occurrence is here: %2"_L1
1345+
.arg(duplicateDefinition, previousDefinition, cmdString));
1346+
}
13411347
}
13421348

13431349
/*!
@@ -1356,8 +1362,9 @@ static void warnAboutPreexistingTarget(const Location &location, const QString &
13561362
*/
13571363
void DocParser::insertTarget(const QString &target)
13581364
{
1359-
if (m_targetMap.contains(target))
1360-
return warnAboutPreexistingTarget(location(), target, m_targetMap[target].toString());
1365+
if (target.isEmpty() || m_targetMap.contains(target))
1366+
return warnAboutEmptyOrPreexistingTarget(location(), target,
1367+
s_utilities.cmdHash.key(CMD_TARGET), m_targetMap[target].toString());
13611368

13621369
m_targetMap.insert(target, location());
13631370
m_private->constructExtra();
@@ -1382,8 +1389,9 @@ void DocParser::insertTarget(const QString &target)
13821389
*/
13831390
void DocParser::insertKeyword(const QString &keyword)
13841391
{
1385-
if (m_targetMap.contains(keyword))
1386-
return warnAboutPreexistingTarget(location(), keyword, m_targetMap[keyword].toString());
1392+
if (keyword.isEmpty() || m_targetMap.contains(keyword))
1393+
return warnAboutEmptyOrPreexistingTarget(location(), keyword,
1394+
s_utilities.cmdHash.key(CMD_KEYWORD), m_targetMap[keyword].toString());
13871395

13881396
m_targetMap.insert(keyword, location());
13891397
m_private->constructExtra();

src/qdoc/qdoc/src/qdoc/helpprojectwriter.cpp

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,14 @@ bool HelpProjectWriter::generateSection(HelpProject &project, QXmlStreamWriter &
250250
}
251251
}
252252

253+
auto appendDocKeywords = [&](const Node *n) {
254+
for (const auto *kw : n->doc().keywords()) {
255+
if (!kw->string().isEmpty()) {
256+
project.m_keywords.append(Keyword(kw->string(), kw->string(),
257+
m_gen->fullDocumentLocation(n)));
258+
}
259+
}
260+
};
253261
// Unseen group nodes require no further processing as they have no documentation
254262
if (unseenGroup)
255263
return false;
@@ -263,19 +271,7 @@ bool HelpProjectWriter::generateSection(HelpProject &project, QXmlStreamWriter &
263271
break;
264272
case Node::QmlType:
265273
case Node::QmlValueType:
266-
if (node->doc().hasKeywords()) {
267-
const auto keywords = node->doc().keywords();
268-
for (const Atom *keyword : keywords) {
269-
if (!keyword->string().isEmpty()) {
270-
project.m_keywords.append(Keyword(keyword->string(), keyword->string(),
271-
m_gen->fullDocumentLocation(node)));
272-
}
273-
else
274-
node->doc().location().warning(
275-
QStringLiteral("Bad keyword in %1")
276-
.arg(m_gen->fullDocumentLocation(node)));
277-
}
278-
}
274+
appendDocKeywords(node);
279275
project.m_keywords.append(keywordDetails(node));
280276
break;
281277

@@ -308,21 +304,8 @@ bool HelpProjectWriter::generateSection(HelpProject &project, QXmlStreamWriter &
308304
case Node::Group:
309305
case Node::Module:
310306
case Node::QmlModule: {
311-
const auto *cn = static_cast<const CollectionNode *>(node);
312-
if (!cn->fullTitle().isEmpty()) {
313-
if (cn->doc().hasKeywords()) {
314-
const auto keywords = cn->doc().keywords();
315-
for (const Atom *keyword : keywords) {
316-
if (!keyword->string().isEmpty()) {
317-
project.m_keywords.append(
318-
Keyword(keyword->string(), keyword->string(),
319-
m_gen->fullDocumentLocation(node)));
320-
} else
321-
cn->doc().location().warning(
322-
QStringLiteral("Bad keyword in %1")
323-
.arg(m_gen->fullDocumentLocation(node)));
324-
}
325-
}
307+
if (!node->fullTitle().isEmpty()) {
308+
appendDocKeywords(node);
326309
project.m_keywords.append(keywordDetails(node));
327310
}
328311
} break;
@@ -379,21 +362,8 @@ bool HelpProjectWriter::generateSection(HelpProject &project, QXmlStreamWriter &
379362
// Page nodes (such as manual pages) contain subtypes, titles and other
380363
// attributes.
381364
case Node::Page: {
382-
const auto *pn = static_cast<const PageNode *>(node);
383-
if (!pn->fullTitle().isEmpty()) {
384-
if (pn->doc().hasKeywords()) {
385-
const auto keywords = pn->doc().keywords();
386-
for (const Atom *keyword : keywords) {
387-
if (!keyword->string().isEmpty()) {
388-
project.m_keywords.append(
389-
Keyword(keyword->string(), keyword->string(),
390-
m_gen->fullDocumentLocation(node)));
391-
} else {
392-
QString loc = m_gen->fullDocumentLocation(node);
393-
pn->doc().location().warning(QStringLiteral("Bad keyword in %1").arg(loc));
394-
}
395-
}
396-
}
365+
if (!node->fullTitle().isEmpty()) {
366+
appendDocKeywords(node);
397367
project.m_keywords.append(keywordDetails(node));
398368
}
399369
break;

0 commit comments

Comments
 (0)