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

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

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

Собственно то, что есть на данный момент:
1. Классы, структуры, перечисления.
2. Переменные и методы, включая immutable типы и контракты.
3. Наследование.
4. Композиция(агрегирование).
5. version, import, module.
6. alias/typedef.

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



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


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

Комментарии (2)

  • avatar
  • iws
  • 31 января 2011, 17:04
  • #
  • 0
Просто из любопытства: почему на Ruby, а не на самом D?
Я с начала и начал писать на D (на первой картинке как раз видны типы, которые я для этого создал), но все-таки есть языки на которых удобно обрабатывать текст, а есть такие, на которых не очень. D по удобности обработки текста сравним с C#, но на Ruby все-таки проще. Да и кода поменьше.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.