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

в 11:05, , рубрики: .net, code contracts, roslyn, прощание

image

Что такое Code Contracts

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

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

Для проектов которые разрабатываются на Windows и .NET инфраструктура 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 пакет

Автор: shai_hulud

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js