Skip to content

Commit 21524c7

Browse files
toreinioQt Cherry-pick Bot
authored andcommitted
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. Change-Id: Iec033e98517a959f0ed96dbdf859799347334874 Reviewed-by: Paul Wicking <[email protected]> (cherry picked from commit 8460b4e) Reviewed-by: Qt Cherry-pick Bot <[email protected]>
1 parent 55fed89 commit 21524c7

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
@@ -1319,15 +1319,21 @@ QString DocParser::detailsUnknownCommand(const QSet<QString> &metaCommandSet, co
13191319
/*!
13201320
\internal
13211321
1322-
Issues a warning about the duplicate definition of a target or keyword in
1323-
at \a location. \a duplicateDefinition is the target being processed; the
1324-
already registered definition is \a previousDefinition.
1322+
Issues a warning about an empty or duplicate definition of either a
1323+
\\target or \\keyword command (determined by \a cmdString) at
1324+
\a location. \a duplicateDefinition is the target being processed;
1325+
the already registered definition is \a previousDefinition.
13251326
*/
1326-
static void warnAboutPreexistingTarget(const Location &location, const QString &duplicateDefinition, const QString &previousDefinition)
1327+
static void warnAboutEmptyOrPreexistingTarget(const Location &location, const QString &duplicateDefinition,
1328+
const QString &cmdString, const QString &previousDefinition)
13271329
{
1328-
location.warning(
1329-
QStringLiteral("Duplicate target name '%1'. The previous occurrence is here: %2")
1330-
.arg(duplicateDefinition, previousDefinition));
1330+
if (duplicateDefinition.isEmpty()) {
1331+
location.warning("Expected an argument for \\%1"_L1.arg(cmdString));
1332+
} else {
1333+
location.warning(
1334+
"Duplicate %3 name '%1'. The previous occurrence is here: %2"_L1
1335+
.arg(duplicateDefinition, previousDefinition, cmdString));
1336+
}
13311337
}
13321338

13331339
/*!
@@ -1346,8 +1352,9 @@ static void warnAboutPreexistingTarget(const Location &location, const QString &
13461352
*/
13471353
void DocParser::insertTarget(const QString &target)
13481354
{
1349-
if (m_targetMap.contains(target))
1350-
return warnAboutPreexistingTarget(location(), target, m_targetMap[target].toString());
1355+
if (target.isEmpty() || m_targetMap.contains(target))
1356+
return warnAboutEmptyOrPreexistingTarget(location(), target,
1357+
s_utilities.cmdHash.key(CMD_TARGET), m_targetMap[target].toString());
13511358

13521359
m_targetMap.insert(target, location());
13531360
m_private->constructExtra();
@@ -1372,8 +1379,9 @@ void DocParser::insertTarget(const QString &target)
13721379
*/
13731380
void DocParser::insertKeyword(const QString &keyword)
13741381
{
1375-
if (m_targetMap.contains(keyword))
1376-
return warnAboutPreexistingTarget(location(), keyword, m_targetMap[keyword].toString());
1382+
if (keyword.isEmpty() || m_targetMap.contains(keyword))
1383+
return warnAboutEmptyOrPreexistingTarget(location(), keyword,
1384+
s_utilities.cmdHash.key(CMD_KEYWORD), m_targetMap[keyword].toString());
13771385

13781386
m_targetMap.insert(keyword, location());
13791387
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)