Во время разработки больших и не очень проектов часто бывает необходимо посмотреть на зависимости существующих объектов. Для таких популярных языков как 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 предложения: либо подключайтесь к разработке и добавляйте нужные Вам вещи, либо ищите что-то другое:)
Я с начала и начал писать на D (на первой картинке как раз видны типы, которые я для этого создал), но все-таки есть языки на которых удобно обрабатывать текст, а есть такие, на которых не очень. D по удобности обработки текста сравним с C#, но на Ruby все-таки проще. Да и кода поменьше.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.