@@ -958,6 +958,18 @@ visitBlockCommandComment(
958
958
auto scope = enterScope (returns);
959
959
// Scope scope(returns, block_);
960
960
visitChildren (C->getParagraph ());
961
+
962
+ auto itr = std::ranges::find_if (
963
+ jd_.getBlocks (),
964
+ [&](const std::unique_ptr<doc::Block> & b)
965
+ {
966
+ return b->kind != doc::Kind::returns;
967
+ });
968
+ if (itr != jd_.getBlocks ().end ())
969
+ {
970
+ report::warn (" {}: Duplicate @returns statement" , C->getBeginLoc ().printToString (sm_));
971
+ }
972
+
961
973
jd_.emplace_back (std::move (returns));
962
974
return ;
963
975
}
@@ -1298,6 +1310,24 @@ visitParamCommandComment(
1298
1310
1299
1311
auto scope = enterScope (param);
1300
1312
visitChildren (C->getParagraph ());
1313
+
1314
+ auto itr = std::ranges::find_if (
1315
+ jd_.getBlocks (),
1316
+ [&](const std::unique_ptr<doc::Block> & b)
1317
+ {
1318
+ if (b->kind != doc::Kind::param)
1319
+ return false ;
1320
+ auto p = dynamic_cast <const doc::Param*>(b.get ());
1321
+ MRDOCS_ASSERT (p != nullptr );
1322
+ return p->name == param.name ;
1323
+ });
1324
+ if (itr != jd_.getBlocks ().end ())
1325
+ {
1326
+ report::warn (
1327
+ " {}: Duplicate @param for argument {}" ,
1328
+ C->getBeginLoc ().printToString (sm_), param.name );
1329
+ }
1330
+
1301
1331
// We want the node even if it is empty
1302
1332
jd_.emplace_back (std::move (param));
1303
1333
}
@@ -1320,6 +1350,24 @@ visitTParamCommandComment(
1320
1350
}
1321
1351
auto scope = enterScope (tparam);
1322
1352
visitChildren (C->getParagraph ());
1353
+
1354
+ auto itr = std::ranges::find_if (
1355
+ jd_.getBlocks (),
1356
+ [&](const std::unique_ptr<doc::Block> & b)
1357
+ {
1358
+ if (b->kind != doc::Kind::tparam)
1359
+ return false ;
1360
+ auto tp = dynamic_cast <const doc::TParam*>(b.get ());
1361
+ MRDOCS_ASSERT (tp != nullptr );
1362
+ return tp->name == tparam.name ;
1363
+ });
1364
+ if (itr != jd_.getBlocks ().end ())
1365
+ {
1366
+ report::warn (
1367
+ " {}: Duplicate @tparam for argument {}" ,
1368
+ C->getBeginLoc ().printToString (sm_), tparam.name );
1369
+ }
1370
+
1323
1371
// We want the node even if it is empty
1324
1372
jd_.emplace_back (std::move (tparam));
1325
1373
}
0 commit comments