Анализируете структуру кода с помощью CodeDom?

Недавно я написал сообщение здесь, в Stackoverflow, с просьбой о некоторых библиотеках C #, которые вычисляют метрики. , в основном CC ... к сожалению, безуспешно. Так что я напишу это сам. Я поискал в Интернете, что может быть лучшим подходом, но прежде чем начать, я хотел бы спросить вас, как вы бы это сделали.

Я сейчас между двумя подходами

  • Учитывая каталог исходного кода, чтобы проанализировать исходный код с помощью выражений регулярных выражений или аналогичных для идентификации таких конструкций, как методы, условные операторы и т. Д., Чтобы иметь возможность вычислять CC
  • Учитывая сборку, загружаем ее и анализируем (используя CodeDom?)

Я предпочитаю второй подход, так как прямой синтаксический анализ исходного кода мне не кажется хорошим подходом. Я читал о CodeDom, интегрированном в платформу .Net. Я знаю, что он используется для генерации динамического кода. Думаю, я мог бы использовать его также для анализа структуры кода, не так ли? У кого-нибудь из вас есть хорошая отправная точка для использования CodeDom, несколько советов, хорошие учебные пособия, с чего начать?

Спасибо

Изменить: Или, возможно, какая-то другая утилита, которая позволяет легко анализировать исходный код (структура, подобная DOM).


person Juri    schedule 08.07.2009    source источник
comment
Не думаю, что можно загрузить граф CodeDOM из уже скомпилированной сборки ...   -  person driis    schedule 08.07.2009
comment
а из исходного кода? Возможно ли это?   -  person Juri    schedule 09.07.2009
comment
API есть, но ни поставщики C #, ни VB CodeDom не реализуют его часть, которая является источником для графа. Они делают только график от источника к источнику.   -  person Pavel Minaev    schedule 09.07.2009
comment
как отмечает @chyne, mono.cecil выглядит многообещающим. Если вы откроете проект на codeplex или что-то в этом роде, дайте мне знать :)   -  person David Lay    schedule 30.10.2009
comment
Вы можете использовать NRefactory для синтаксического анализатора ›ast.   -  person Jb Evain    schedule 09.11.2009


Ответы (6)


Gendarme выполняет некоторые метрики кода (вроде) с помощью Mono.Cecil, возможно, это поможет в том, чего вы пытаетесь достичь?

person chyne    schedule 08.07.2009

Взгляните на Common Compiler Infrastructure (CCI) от Microsoft Research.

person Bryan Watts    schedule 08.07.2009

Проблема с использованием CodeDom состоит в том, что это односторонний способ - есть API для генерации кода, но нет для синтаксического анализа кода. Кажется, я припоминаю, что слышал о некоторых неподдерживаемых / скрытых API, которые разбирают код в структуры CodeDom, но я не уверен.

Кроме того, как получить код из самой сборки? Отражение не доходит до IL, а только до членов классов.

person Andy    schedule 08.07.2009
comment
Я не могу использовать Reflection, вы правы. Но разве нельзя загрузить код, представленный в виде строки, в CodeDom, а затем пройти по структуре CodeDom? Этот инструмент, похоже, использует такой подход: expectatingminds.com/Content/Products/devMetrics / - person Juri; 08.07.2009
comment
Я давно не заглядывал в CodeDom, но парсеров на тот момент не было. Вы уверены, что devMetrics работает на сборках, а не на самом коде? - person Andy; 09.07.2009

Прочтите эту статью CodeProject. Кажется, это начало того, что вы пытаетесь сделать, но потребуются некоторые дополнения; поскольку пример кода в статье анализирует не члены, а только типы и пространства имен.

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

person driis    schedule 08.07.2009

См. инструмент C # Metrics, который вычисляет CC и множество других показателей.

person Ira Baxter    schedule 08.08.2009

Поскольку вас интересует .NET, попробуйте использовать .Net Reflector

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

Если вы не нашли то, что ищете, почему бы не написать свое собственное. .NET Reflector имеет плагин API, предоставляющий тип модели CodeDom, которую вы можете легко анализировать (см. Также внизу страницы)

person Tom Carter    schedule 09.11.2009