понедельник, 31 января 2011 г.

Dev : Визуальное отображение исходного кода на D (UML-like diagram)

Во время разработки больших и не очень проектов часто бывает необходимо посмотреть на зависимости существующих объектов. Для таких популярных языков как C++, Java, C# существуют решения в виде Uml-редакторов с поддержкой импорта исходников. Некоторые IDE (например VS) умеют сами создавать нечто подобное. Однако для D я ничего похожего не встретил. Многие писали о частичной поддержке D (например doxygen), однако как мне показалось, они просто использовали один из существующих парсеров (возможно парсер для С++), что давало откровенно говоря крайне плохой результат. Например получалось очень много функций с именем immutable, что уж говорить про методы с контрактами...

Поэтому решил написать свой велосипед. В качестве языка для реализации взял ruby. Для отображения использовал graphviz. Принцип работы прост: скрипт парсит исходники и создает свою базу типов. То что не получается определить - пропускается, при этом о проблеме пишем в консоль. Получившуюся базу типов сохраняем в формате, понимаемом языком DOT, в отдельный файл. На основе этого файла получаем картинку. Такой вариант не позволяет изменять код снаружи, но на мой взгляд это и к лучшему. Не доверяю я кодогенераторам)

В результате имеем картинку с чем-то похожим на UML диаграмму. Именно похожим, потому что там много отсебятины. Например отображение условия наличия типа после компиляции (version keyword) или указание alias/typedef'ов для данного модуля. Это все сделано для упрощения визуального восприятия текущего состояния кода, и многое из этого либо не покрывает всех вариантов, либо вообще не корректно, но пока я готов на это пойти.

Собственно то, что есть на данный момент:
  • Class, struct, enum, union.
  • Переменные и методы, включая immutable типы и контракты.
  • Наследование.
  • Композиция(агрегирование).
  • version, import, module.
  • alias/typedef.
  • TODO lists.
Язык D богатый, поэтому реализовывать еще много чего нужно. На данный момент отрисовать phobos не возможно, и думаю не скоро получится. Но вот более простые вещи уже можно лицезреть. Вот например мой код, на котором тестировались первые версии:

А вот часть кода проекта xomb(я в проекте участия не принимаю, поэтому моего кода там нет, а значит это более живой пример):

Но еще раз напомню, на данный момент DSourceParser больше не парсит, чем парсит. Так что если вам нужен результат здесь и сейчас, то у меня есть 2 предложения: либо подключайтесь к разработке и добавляйте нужные Вам вещи, либо ищите что-то другое:)

Комментариев нет: