Номера линий Doxygen @code

Есть ли способ отобразить номера строк кода внутри блока @code... @endcode? Из скриншотов в руководстве doxygen кажется, что есть, но я не смог найти вариант для самого doxygen или синтаксис тега, чтобы выполнить это.

Мне нужно это, чтобы написать что-то вроде "В приведенном выше коде, строка 3" после кода.

Протестировано также для защищенных блоков кода, все еще не получая никаких номеров.

Ответ 1

Короткий ответ

Кажется, что по крайней мере в текущей версии (1.8.9) добавлены номера строк:

  • для кода C только при использовании \includelineno тега
  • для любого кода Python

Подробнее

Форматировщик кода Python

Форматировщик кода Python включает номера строк, если g_sourceFileDef оценивается как TRUE:

/*! start a new line of code, inserting a line number if g_sourceFileDef
 * is TRUE. If a definition starts at the current line, then the line
 * number is linked to the documentation of that definition.
 */
static void startCodeLine()
{
  //if (g_currentFontClass) { g_code->endFontClass(); }
  if (g_sourceFileDef)

(https://github.com/doxygen/doxygen/blob/Release_1_8_9/src/pycode.l#L356  )

Инициализирован из FileDef *fd, переданный в parseCode/parsePythonCode, если он был предоставлен (ненулевой) или из new FileDef(<...>) иначе:

g_sourceFileDef = fd;
<...>
if (fd==0)
{
  // create a dummy filedef for the example
  g_sourceFileDef = new FileDef("",(exName?exName:"generated"));
  cleanupSourceDef = TRUE;
}

(https://github.com/doxygen/doxygen/blob/Release_1_8_9/src/pycode.l#L1458) поэтому кажется, что все коды Python содержат номера строк

Форматирование кода C

Форматирующий код кода C имеет дополнительную переменную g_lineNumbers и включает номера строк, если оба g_sourceFileDef и g_lineNumbers оцениваются как TRUE:

/*! start a new line of code, inserting a line number if g_sourceFileDef
 * is TRUE. If a definition starts at the current line, then the line
 * number is linked to the documentation of that definition.
 */
static void startCodeLine()
{
  //if (g_currentFontClass) { g_code->endFontClass(); }
  if (g_sourceFileDef && g_lineNumbers)

(https://github.com/doxygen/doxygen/blob/Release_1_8_9/src/code.l#L486)

Они инициализируются следующим образом:

g_sourceFileDef = fd;
g_lineNumbers = fd!=0 && showLineNumbers;
<...>
if (fd==0)
{
  // create a dummy filedef for the example
  g_sourceFileDef = new FileDef("",(exName?exName:"generated"));
  cleanupSourceDef = TRUE;
}

(https://github.com/doxygen/doxygen/blob/Release_1_8_9/src/code.l#L3623)

Обратите внимание, что g_lineNumbers остается FALSE, если при условии, что значение fd равно 0

HtmlDocVisitor

Среди вызовов parseCode в HtmlDocVisitor::visit есть только один (для DocInclude::IncWithLines, что соответствует \includelineno), который передает ненулевое значение fd: https://github.com/doxygen/doxygen/blob/Release_1_8_9/src/htmldocvisitor.cpp#L540 так что это, кажется, единственная команда, которая приведет к тому, что номера строк будут включены в список кодов C