@@ -958,6 +958,18 @@ visitBlockCommandComment(
958958 auto scope = enterScope (returns);
959959 // Scope scope(returns, block_);
960960 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+
961973 jd_.emplace_back (std::move (returns));
962974 return ;
963975 }
@@ -1298,6 +1310,24 @@ visitParamCommandComment(
12981310
12991311 auto scope = enterScope (param);
13001312 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+
13011331 // We want the node even if it is empty
13021332 jd_.emplace_back (std::move (param));
13031333}
@@ -1320,6 +1350,24 @@ visitTParamCommandComment(
13201350 }
13211351 auto scope = enterScope (tparam);
13221352 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+
13231371 // We want the node even if it is empty
13241372 jd_.emplace_back (std::move (tparam));
13251373}
0 commit comments