Видалення Code Contracts c допомогою 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 пакет
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.