Подтвердить что ты не робот

Создание Doxygen для чтения с двумя комментариями С++ в качестве разметки

Я пытаюсь настроить автоматическое Doxygen на нашей массивной 78 000 файловой кодовой базе С++. Это хорошо справляется с извлечением информации о базовом типе и иерархии, но я хотел бы сделать умнее собирать комментарии к документации, которые уже существуют.

Большинство комментариев, накопленных за эти годы, следуют общей схеме, хотя и не та, которую ожидал Doxygen. В основном они выглядят как

// class description
class foo
{
   // returns ascii art of a fruit
   const char* apples( void ); 

   // does something to some other thing
   customtype_t baz( foo &other );

   enum
   {
      kBADGER, // an omnivorous mustelid
      kMUSHROOM, // tasty on pizza
      kSNAKE,  // oh no!
   };
}

Которые являются двойными, а не комментариями стиля /// или //!, которые ожидает Doxygen.

Слишком много файлов для поиска и замены всех таких комментариев, и многие из моих программистов сильно страдают аллергией на просмотр тройных слэшей в своем коде, поэтому я хотел бы найти способ сделать Doxygen чистым как комментарии JavaDoc, когда они находятся в правильном месте. Есть ли способ сделать Doxygen прочитанным // как ///?

Я не смог найти такой параметр конфигурации, поэтому, полагаю, мне нужно каким-то образом преобразовать вход. В общем правило я бы использовал:

  • если есть строка, содержащая только комментарий, непосредственно предшествующий функция/класс/тип/переменная декларации, предположим, что это /// комментарий.
  • если есть декларация затем в той же строке с помощью // комментарий, рассматривайте его как ///<

Но я не знаю, как идти о преподавании Doxygen это правило. Двумя способами, о которых я могу думать, являются следующие:

  • Напишите программу как INPUT_FILTER, которая анализирует вход С++ и преобразует // в ///, как указано выше. Но этот вид преобразования слишком сложный, чтобы делать это как регулярное выражение, и я действительно не хочу писать полномасштабный синтаксический анализатор С++ только для подачи ввода на другой парсер С++! Кроме того, разворачивание программы INPUT_FILTER для каждого файла замедляет Doxygen неприемлемо: для работы над нашим источником уже требуется более 30 минут, а добавление INPUT_FILTER заставляет его принимать более шести часов.
  • Измените исходный код Doxygen, чтобы включить приведенные выше правила комментариев. Это похоже на страшный объем работы в незнакомом коде.

Любые другие идеи?

4b9b3361

Ответ 1

Ответ прост: вы не можете.

Следует использовать специальный стиль doxygen, чтобы отметить комментарий как документацию.

Doxygen не только принимает комментарии, предшествующие декларации. Вы также можете использовать их везде в коде.

Если вы хотите использовать функции doxygen, вам нужно будет обновить комментарии вручную или написать инструмент script/, который ищет объявления и предыдущие комментарии для их изменения.

Вам нужно решить, выбрать один из трех решений (ваши два и script, добавленные в качестве ответа) или не использовать doxygen.

Ответ 2

Вы можете использовать script для изменения комментария к стилю Doxygen, вот простой python script, просто попробуйте:


#!/usr/bin/env python

import os
import sys
import re

def main(input_file, output_file):
    fin = open(input_file, 'r')
    fout = open(output_file, 'w')
    pattern1 = '^\s*//\s.*'
    pattern2 = '^\s*\w.*\s//\s.*'
    for line in fin.readlines():
        if re.match(pattern1, line) != None:
            line = line.replace('//', '///', 1)
        if re.match(pattern2, line) != None:
            line = line.replace('//', '///<', 1)
        fout.write(line)
    fin.close()
    fout.close()

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print 'usage: %s input output' % sys.argv[0]
        sys.exit(1)
    main(sys.argv[1], sys.argv[2])