Анализатор исключения на основе Рослин и

Анализатор исключения на основе Рослин и

695

Тем наиболее, что я уже имел опыт сотворения плагинов для resharper для (Р# редактор договоров расширение) , потому я желал сопоставить разные инфраструктуры и простоты использования. Издавна желала perspirate с анализаторами на базе Roslina. Есть мысль переписать этот плагин с анализатором диапазона Рослин, но я решил начать с чего же-нибудь попроще.

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

Повторная генерация исключения с помощью броска экс;

“Проглотила” все исключения с пустыми блоками Catch {}, так либо изловить(исключение) {}.

“Проглотил” исключения в определенных отраслях блока изловить.

Сохранить как loggo лишь сообщения исх.Сообщение, утратить потенциально важную информацию о месте появления исключения.

Некорректные probrasyvanie новейшие исключения блока изловить.

Приступая к работе
Чтоб приступить к разработке анализатор должен быть установлен VS2015 ОСАГО (проще всего взять vertalka), то вы должны поставить против 2015 пакета SDK .Незапятнанная SDK платформы и компилятора шаблонов .Net платформы компилятора Синтаксис Визуализатор. На главной страничке проекта Рослин постоянно будут надлежащие аннотации по установке. Визуализатор станет неподменным ассистентом для осознания, как смотрятся синтаксических деревьев, как анализировать и как генерировать новейшие деревья в исправлениях. Самое основное, нужно установить правильную версию инструментов (для CTP6 все пакеты vsix должны быть для CTP6).
По умолчанию, проект добавлен эталон-анализатор, который показывает предупреждения о типе имена со строчной буковкы. Команда разрабов сделала гигантскую работу по созданию анализаторов был очень обычным и комфортным. Просто сделайте новейший проект, выберите шаблон расширяемость -> диагностика с исправлением кода (nuget для + vsix-файл), обыграть заглавие анализатора и все. В итоге это дозволит сделать три проекта: анализатор сам проект с модульными тестами и проект с установщиком (vsix-файл).
Потом, вы сможете запустить испытания, либо выбрать проект vsix, как начать, и нажмите кнопку F5. Потом будет запущен иной экземпляр Visual Studio с ustanovlennym анализатор, который будет выдавать предупреждение на всех типах буковкы в строчные:

Как установить analysieren
Существует три метода установки анализатора:
· Вручную установить анализатор для каждого проекта: · С помощью пакета vsix, которые могут быть загружены из зрительной студии Галерея впрямую, либо через “расширения и обновления”.

· Анализаторы также могут распространяться через nuget совместно с библиотекой, либо просто набор управляемых через nuget пакеты:

Ссылка на пакет будет sakimichan в системе управления начальными кодами, что дозволит всем участникам применять один набор анализаторов.
В от jetbrains команда разработали сильную инфраструктуру тестирования, но все испытания интегрированы. Проверить свои бизнес-логики в изоляции нереально! В итоге, в тесте вы сможете проверить анализатор себя, но вы сможете проверить свою бизнес-модель, передавая ему фрагменты синтаксическое дерево: Тестируемость
При разработке плагина для resharper и я почти всем не хватает обычный юнит-испытания. В R# не существует в абстрактном виде тестов, все они принадлежат к одной из категорий: тестирование доступности ярлычек операция, результатом теста «поправить» и др., Когда эта проверка нужна чтоб запихнуть код в CS-файл, который будет запускать анализатор и 2-ой файл, чтоб сопоставить результаты. В Rosline отправь по наиболее обычному пути. Анализаторы работают с синтаксической и семантической деревьев (синтаксическое дерево и семантического дерева), которые просто создавать испытания из файла либо из строчки.
Вы вправду понимаете, что приложение правительство?»,
диагностический.Способа getmessage());

Способ Assert.AreEqual(warningPosition, диагностики.Размещение.SourceSpan.Запуск);
} [TestMethod]
публичного недействительными SimpleTestWarningOnEmptyBlockThatcatchesexception()
{
вар тест = @»
с помощью системы;
месту имен consoleapplication1
{
класс Имя_типа
{
общественный статический аннулировать функцию Foo()
{
испытать { консоли.Способ writeline(); }
{на}поймать(система.Исключение) {}
}
}
}»;

вар warningPosition = тест.Помощи indexof(«{на}»);

вар исследовательских = GetSortedDiagnostics(тесты.Заменить(«{о}», «»)).Одноместный();

Способ Assert.AreEqual(EmptyCatchBlockAnalyzer.Диагностика-ID, диагностики.Идентификатор);
Способ Assert.AreEqual(«‘изловить(система.Исключение)’ блок пустой.
Также чрезвычайно порадовало то, что испытания выполняются быстро, поэтому что невзирая на несколько миллионов строк кода в проекте Рослин, он отлично структурирован и не придется загружать 10-ки доп сборок.
На данный момент он поддерживает 6 главных правил: Приобретенные способности
Так, что приобретенные анализатор?

Некие примеры показаны с помощью анимации, которая далека от эталона. Но сущность понятна. Каждый из их легче всего показать на примере. VS2015 установлены на V-мира и захвата изображений, я также применять слегка при этом.

1. Пустой блок Catch, которые числятся вредными!
Более суровые кодекса запах при работе с исключениями является полное угнетение всех исключений с пустым блоком пойматьили изловить(исключение):

Исправление в данном случае чрезвычайно проста: добавить броска; Глотать исключения, которые числятся вредными
Особенное место на котле должен быть подготовлен для тех, кто ловит все исключения через блок и Catch{}. 2.

Блок Catch ласточки исключение 3.
Еще один анализатор, который предупреждает о угнетении исключения. В данном случае, достаточно трудно придумать правильную починку, в особенности когда подавить исключение возникает лишь в одной из веток блока Catch: Блок Catch не может быть пустым, в то время как он все еще может «проглотить» исключения.

В Rosline имеет встроенную поддержку анализа выполнения потока (потока управления анализа), на базе которых сделать этот анализатор не трудно. Да, попытка сделать таковой анализатор без Roslina приведет к месяцев работы и до сих пор, он был крив на доске.

4. Повторно сгенерировать исключение верно
На всякий вариант, напомню, что в первом случае — трассировке стека в начальное исключение пропадает и будет воспоминание, что блок Catch источник. Это одна из самых всераспространенных ошибок при пересылке исключение с помощью броска экс;и не используя кинуть.

Трассировка экс.Сообщения числятся вредными 5.
Поэтому что исключения чрезвычайно нередко образуют дерево исключений, топ-уровень сообщения не должны содержать что-нибудь полезное! Еще одна обычная ошибка обработки исключений, когда в консоль либо лог сохраняется лишь экс.Сообщения и экс.Этом.
Этот анализ дает предупреждение, раз блок Catch употребляет («часы») — это свойство Сообщения, но не интересуют подробности внутренностей исключение.

Конкретно из-за данной прелестной модели трассировки исключения мне пришлось пойти работать с первого января и залить горячим поправить на прод, молвят, что чтоб осознать что происходит с системой. Никогда! Никогда не logisuite лишь экс.Ошибке!

6. Добавить изловил исключение как внутреннее исключение
Чтоб избежать этого, новое исключение обязано содержать начальное исключение в качестве суб. Блок блок Catch может кинуть исключение, но даже в этом случае, информация о уникальных исключением могут быть потеряны. Анализатор инспектирует код генерировать новейшие исключения и раз начальное исключение не применяется, тогда дает, чтоб добавить его в качестве суб (естественно, для этого сгенерированного исключения должны иметь конструктор, который воспринимает несколько характеристик — строчки и исключения):

Заместо заключения
Так что раз у вас в команде есть некие общие трудности с кодом, и вы желаете оформить обычное кодирование, написание собственного парсера бы быть неплохой идеей. В сети есть чрезвычайно отличные примеры (ссылки в конце статьи), не считая того, я не считаю себя профессионалом в этом вопросце. Я не желаю зацикливаться на развитие анализатора, по последней мере не в этом посте. Смысл этого поста-показать простоту сотворения парсера своими руками, поэтому что всю запятанную работу за вас не сделает Рослин.
Доп ссылки

Исключение анализатора на github

Исключение анализатор на Nuget.org (доступен через добавление пакетов nuget, лишь в качестве корма, который вы желаете применять nuget.org и не api.nuget.org)

Исключение анализатора при зрительном Студия Галерея

Пару вводных статей в MSDN журнальчик о разработке анализаторов:

Применять Рослин написать живые анализатор кода для Вашего API

Добавление кода поправить, чтоб Ваш Рослин анализатора

habrahabr.ru ЗЫ раз у вас есть предложения к анализатору исключения, свисток, от себя добавлю.