Как стать автором
Обновить

Удаление Code Contracts c помощью Roslyn

Время на прочтение2 мин
Количество просмотров8.1K
image

Что такое Code Contracts


Code Contracts были созданы командой разработчиков из Microsoft Research в 2008 году. Задача Code Contracts — описывать предположения о состоянии в коде, которые в последующем используются для генерации документации и проверки кода на корректность. Предполагалось, что Code Contracts станут частью платформы .NET и получат поддержку в компиляторе, платформе и Visual Studio. К сожалению, поддержка появилась только на платформе в виде классов пространства имен System.Diagnostics.Contracts. Для остального требуются плагины и дополнительные утилиты.
В данный момент проект поддерживает SergeyT и еще несколько участников.

Поддержка Code Contracts в Mono


Для проектов, которые разрабатываются на Windows, инфраструктура Code Contracts понятна и более развита. Есть Build Steps для MSBuild, можно переписывать/верифицировать сборки с помощью утилит, есть плагины для VS и Resharper. Но с Mono дела обстоят не так хорошо, есть самодельный ccrewrite, который ломается на сложном коде. Поддержки в xbuild и MonoDevelop нет, и простым способом собрать проект нельзя.

Причины для удаления Code Contracts из проекта:


— Внешняя зависимость проекта от утилит Code Contracts, без которых проект не собрать.
— Скорость компиляции ниже из-за дополнительного шага в виде перезаписи сборки.
— Отсутствие поддержки в Mono.
— Неудобств стало больше, чем пользы.

Удаление Code Contracts из исходного кода


Благодаря проекту Roslyn от Microsoft анализ и обработка исходного кода на C#/VB.NET стали довольно тривиальной задачей. И я выбрал этот путь для удаления Code Contracts из исходного кода. Само решение простое и состоит из CSharpSyntaxRewriter, который пробегает по коду и заменяет проверки Code Contracts на их эквивалент вне Code Contracts.

Сам удалитель Code Contract'ов оформлен в виде пакета Nuget, доступен как утилита и работает под Mono.
Install-Package CodeContractsRemover

И команда на перезапись всех исходников в директории проекта:
# code_contracts_remover.exe <Convert|Remove> <directoryPath> [searchPattern=*.cs] [encoding=utf-8]
mono packages/CodeContractsRemover.1.0.2/tools/code_contracts_remover.exe Convert ./


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

Ссылки


Проект на GitHub
Nuget пакет
Теги:
Хабы:
Всего голосов 18: ↑14 и ↓4+10
Комментарии2

Публикации

Истории

Работа

.NET разработчик
76 вакансий

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань