ReSharper 7: релиз в деталях

в 7:56, , рубрики: .net, css, html, jetbrains, JS, ReSharper, vb.net, winjs, WinRT, Блог компании JetBrains, Программирование, метки: , , , , , , ,

ReSharper7Две недели назад мы объявили о выходе ReSharper 7.0, лишь кратко перечислив те новинки, которые были реализованы в этом мажорном релизе.
Сегодня же подписчики MSDN и TechNet получат возможность скачать Visual Studio 2012, и это прекрасный повод, чтобы рассказать про новые возможности ReSharper 7.0 максимально подробно и обстоятельно.

Краткое содержание статьи (которое заодно поможет вам в навигации по этому объемному материалу):

Visual Studio 2012

Windows Runtime

Кодогенерация

INotifyPropertyChanged

Новые рефакторинги

Юнит-тестирование

Поддержка новых языков в ReSharper SDK

Visual Studio 2012

Одна из основных задач нового Решарпера – обеспечить полную и прозрачную поддержку VIsual Studio 2012. Эта поддержка касается как новых аспектов интерфейса, так и новых технологий. Давайте начнем с интерфейса, который претерпел весьма существенные изменения.

Поддержка тем

Visual Studio 2012 поддерживает парадигму «тем» и поставляется с двумя темами – светлой (Light) и темной (Dark). Мы добавили в Решарпер поддержку обеих тем для всех наших меню, иконок, и т.п., дабы полностью гармонировать со Студией.

ReSharper 7: релиз в деталях

В новой Студии также появились монохромные иконки, но мы в свою очередь получили много фидбека от пользователей, которые просили нас не конвертировать наши иконки в этом стиле. Поскольку визуальные предпочтения – вещь субъективная, мы решили дать пользователям право выбора:

ReSharper 7: релиз в деталях

Тем самым, вы можете сами выбрать иконки, которые будут отражены в различных меню, окошках, и т.п., а также в качестве иконок для разных элементов проекта – типов, свойств, и т.д. Настроить иконки можно через ReSharper | Options | General. Да, и свои оригинальные иконки мы тоже немного улучшили.

Асинхронная загрузка проектов

В VS2012, Microsoft добавил поддержку асинхронной загрузки проектов (ASL), которая позволяет проектам в решении загружаться независимо при открытии. Это фактически позволяет пользователю начинать работу до того, как загрузится все решение.

В 7-м Решарпере, несмотря на ряд сложностей, с которыми мы столкнулись в работе с ASL и соответствующим API, у нас получилось реализовать полноценную поддержку этой фичи – так что теперь вы можете сразу получить более быструю загрузку проектов и все работающие возможности Решарпера.

В качестве примера увеличения производительности, решение содержащее более 300 проектов при открытии с Visual Studio 2010 & ReSharper 6 занимает 5 мин. 12 сек., а с Visual Studio & ReSharper 7 – всего 1 мин. 17 сек.

Quick Launch

В VS2012, если вы точно не знаете, где находится тот или иной элемент или команда, можно использовать панель быстрого запуска (Quick Launch) для моментального поиска. Будучи Студийным плагином, мы смогли добавить наши собственные команды в это меню. Теперь, если напечатать Go to в панель, QuickLaunch выдаст вам все соответствующие команды Решарпера:

ReSharper 7: релиз в деталях

Preview Tab

Еще одна новая фича VS2012 – это «вкладка предпросмотра» (preview tab). Суть ее в том, что в отличии от обычного тэба для документа, этот тэб открывается в правой части окна, но как только вы начинаете его редактировать – перемещается в левую часть. Смысл этого тэба – показывать фиксированный обозреватель по которому можно навигировать, не порождая новые открытые тэбы.

ReSharper 7: релиз в деталях

Решарпер поддерживает использование этого специального тэба в таких фичах как Go To Type/Member/File/Declaration а также в Find Usages и связанных с ним окнах.

Solution Explorer

В новом обозревателе решений можно раскрыть конкретный файл и увидеть его структуру – классы, методы, и так далее. Решарпер в свою очередь предоставляет контекстное меню для этих элементов, так что на них можно выполнять рефакторинги, find usages, и другие привычные команды – как через использование всплывающих меню, так и через комбинации клавиш.

ReSharper 7: релиз в деталях

Architecture Explorer

В редакции Ultimate, VS2012 поставляется с обозревателем архитектуры (Architecture Explorer), которые позволяет прогрессивно углубляться а решение начиная с пространств имен и заканчивая конкретными полями или методами. И здесь Решарпер предоставляет ту же поддержку контекстных действий на элементах кода с использованием всплывающих меню Navigate To или Refactor This.

ReSharper 7: релиз в деталях

Граф зависимостей

Помимо поддержки Architecture Explorer, Решарпер также предоставляет те же возможности в графе зависимостей, который умеет генерировать Студия.

ReSharper 7: релиз в деталях

Windows Runtime

Предстоящие выпуски Windows 8 и Visual Studio 2012 дают нам новую программную модель написания приложений под названием Windows Runtime (или коротко WinRT). Поскольку разработку на WinRT можно вести с помощью языков которые Решарпер уже поддерживает (C#, VB.NET, JavaScript), мы добавили поддежку WinRT в Решарпер.

C#, VB.NET и XAML

Решарпер продолжает развивать поддержку C#/VB.NET и XAML. Следующие фичи были сделаны специально для WinRT:

  • Автодополнение кода (code completion) предоставлено как в коде так и в XAML-файлах. В XAML, Решарпер знаком с новыми пространствами имен и форматами, и способен предоставить нужные варианты дополнения в зависимости от контекста редактирования:
    ReSharper 7: релиз в деталях

  • Инспекции продолжают предоставлять релевантную информацию о возможных проблемах с кодом в WinRT-специфичных проектах:
    ReSharper 7: релиз в деталях

  • Коррекция ошибок (quick-fixes) также способствует быстрому устранению проблем:
    ReSharper 7: релиз в деталях

  • Контекстная навигация позволяет быстро передвигаться по решению. Этот механизм осведомлен о специфике WinRT-проектов таких, например как варианты именования ресурсов:
    ReSharper 7: релиз в деталях

  • Оптимизация ссылок (reference optimization) также поддерживается в C#/VB.NET-ориентированных WinRT проектах:
    ReSharper 7: релиз в деталях

JavaScript

В отличии от C#/VB.NET WinRT проектов, которые унаследовали модель разработки у WPF и Silverlight, модель разработки под WinRT с использованием JavaScript (известная также как WinJS) кардинально отличается. Тем не менее, Решарпер предоставляет много различных фич для ее поддержки:

  • Автодополнение кода поддерживается в HTML, CSS и JavaScript, и даже в JSON-атрибутах внутри HTML:
    ReSharper 7: релиз в деталях

  • Автодополнение также доступно для импортированных WinRT-компонент. Например, вот это класс
    ReSharper 7: релиз в деталях
    будучи импортированным в JavaScript позволяет Решарперу выдать следующий список автодополнения:
    ReSharper 7: релиз в деталях

  • Конечно, навигация и поиск прекрасно работают с WinRT-проектами. Если взять пример выше и поискать использование класса Person в проекте C#, то мы получим ссылку и на проект WinJS:
    ReSharper 7: релиз в деталях

  • Механизм create from usage (создание элементов кода из примеров их использования) также работает в кросс-проектных сценариях. Например, если создать новое свойство для импортированной WinRT-компоненты:
    ReSharper 7: релиз в деталях
    то оно будет автоматически создано в определении этой компоненты:
    ReSharper 7: релиз в деталях

  • Рефакторинги (такие как Rename, например) тоже работают в кросс-проектных сценариях. Например, попытка переименовать спроецированное из WinRT-компоненты в WinJS имя свойства откроет диалог переименования оригинального свойства:
    ReSharper 7: релиз в деталях
    Соответственно, после этого изменения, в C# проекте имя свойства станет FullName, а в проецированной компоненте – fullName.

Ну и, как вы догадываетесь, большинство существующих уже фич для поддержки C#, VB.NET, XAML, HTML, CSS и JavaScript остаются доступными для всех, кто планирует работать с проектами на основе WinRT.

Кодогенерация

Если бы между различными подсистемами Решарпера был конкурс насчет того, кто привносит больше изменений и минимум усилий, то механизм Generate был бы бесспорным победителем. И, конечно же, в новом Решарпере мы добавили несколько новых фич и улучшений этого механизма.

Генерация частичных методов

Многие фреймворки кодогенерации производят код, состоящий из partial классов для того, чтобы пользователи могли в последствии изменить или дополнить поведение сгенерированных компонент. Например, Entity Framework делает это, определяя классы сущностей как partial.

Теперь Решарпер поддерживает этот сценарий использования и позволяет генерировать сигнатуры частичных методов. Для этого, нужно всего лишь создать partial тип и вызвать Generate | Partial Methods:

ReSharper 7: релиз в деталях

Теперь нужно лишь выбрать те методы, которые хочется реализовать:

ReSharper 7: релиз в деталях

… и все выбранные методы будут добавлены в выбранный класс:

ReSharper 7: релиз в деталях

Улучшения в Generate Equality Members

При сравнении типов, многие из наших пользователей хотели регулировать механизмы, с помощью которых производится сравнение типов. Поэтому мы добавили в Generate Equality Members три разные опции сравнения типов:

ReSharper 7: релиз в деталях

В зависимости от того, какую опцию вы выберете, условие проверяющее совпадение типов в методе Equals() может быть реализовано одним из следующих путей:

  • Тип должен быть такой же как this:
    ReSharper 7: релиз в деталях

  • Тип должен быть такой же, как тип класса:
    ReSharper 7: релиз в деталях

  • Тип должен быть типом или наследником класса:
    ReSharper 7: релиз в деталях

Generate Equality Comparer

В дополнении к «инлайновой» реализации сравнения для определенного класса, новый Решарпер поставляется с новым генератором под названием Generate Equality Comparer. Цель этого генератора – создать отдельный класс который реализует интерфейс IEqualityComparer<T>. Это бывает нужно для реализации специфичных критериев сравнения, а также в тех случаях когда этот интерфейс требует определенный API, с которым вы работаете.

Вот небольшой пример. Допустим, что у нас есть класс Person в котором два свойства. Мы вызываем экшн:

ReSharper 7: релиз в деталях

…и, выбрав те элементы, по которым мы хотим проводить сравнение, Person получаете следующий сгенерированный приватный вложенный класс:

ReSharper 7: релиз в деталях

В дополнении к этому, есть вариант сгенерировать вложенный статический инстанс этого класса как поле:

ReSharper 7: релиз в деталях

Поддержка INotifyPropertyChanged

Если ваш класс реализует INotifyPropertyChanged или наследует от класса, который использует этот механизм (например, NotificationObject из фреймворка Prism), то действие Generate Properties предложит вам различные варианты реализации свойств с учетом этого интерфейса:

ReSharper 7: релиз в деталях

INotifyPropertyChanged

Еще со времен Windows Forms, интерфейс INotifyPropertyChanged используется для того чтобы давать свойствам сообщить об изменениях всем, кому нужно (обычно это UI). Поддержку оповещения об изменениях, которая сегодня используется во многих платформах (WPF, Silverlight) и фреймворках, нас очень часто просили сделать и в новом релизе, мы ее сделали.

Автоматическая реализация

Как только вы добавите декларацию INotifyPropertyChanged в свой класс, Решарпер предложит вам быструю коррекцию для реализации этого интерфейса:

ReSharper 7: релиз в деталях

Применив этот фикс, вы автоматически получите не только декларацию события, но и метод, способствующий вызову этого события. Теперь вы можете взять любой свойство (будь то автосвойство или свойство с полем) и применить к нему контекстное действие, которое добавит вызов нотификационного метода:

ReSharper 7: релиз в деталях

Если вы используете поля вместо свойств, вы можете также воспользоваться командой Generate Properties и Решарпер предложит вам реализовать нотификации на сгенерированных свойствах:

ReSharper 7: релиз в деталях

Трэкинг идентификаторов

Ссылка на свойство через строку – не самое безопасное решение. Но если вам необходимо это делать, то Решарпер вам поможет. Во-первых, он будет отслеживать имена свойств, так что если вы сделаете ошибку или сошлетесь, например, на приватное свойство, то Решарпер тут час же высветит ошибку:

ReSharper 7: релиз в деталях

Во-вторых, если вы решите где-то вызвать метод нотификации вручную, вам будет представлено автодополнение в строке с названиями возможных свойств:

ReSharper 7: релиз в деталях

Поддержка различных фреймворков

Существует много разных реализаций INotifyPropertyChanged. Сторонние библиотеки часто используют свой собственный метод для нотификаций, и поставляются с базовыми классами, от которых нужно наследовать. Одно из основных отличий в том, что многие фреймворки используют для передачи имени метода лямбда-выражение вместо строкового литерала.

Решарпер поставляется с поддержкой следующих фреймворков:

  • MVVM Light (WPF 3 и 4; Silverlight 3, 4 и 5; Windows Phone 7 и 7.1)
  • Caliburn.Micro (WPF 3 и 4; Silverlight 4 и 5; Windows Phone 7.1)
  • Prism (WPF 4; Silverlight 4)
  • Catel (WPF 3 и 4)
  • MVVMHelpers (WPF 3 и 4, поддерживаются только лямбда-выражения)

На практике это означает что если вы, например, отнаследуетесь от типа NotificationObject из фреймворка Prism, то когда вы будете создавать свойства, вам будет предложен выбор метода RaisePropertyChanged, который вы хотите вызывать:

ReSharper 7: релиз в деталях

Если вы выберете лябмда-ориентированный вариант, то ваши свойства будут выглядеть вот так:

ReSharper 7: релиз в деталях

И, конечно же, эти же варианты реализаций будут представлены в контекстных меню:

ReSharper 7: релиз в деталях

Новые рефакторинги

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

Extract Class

Что вы делаете, если у вас в коде класс разрастается до неуправляемых размеров? Скорее всего, вы пытаетесь разбить класс не несколько классов поменьше. Дабы упростить эту операцию мы добавили рефакторинг под названием Extract Class. Суть этого рефакторинга простая: вы выбираете, какие члены класса нужно «вытащить», решаете что делать с различными проблемами в доступе (если таковые имеются), и ReSharper делает за вас работу по создании нового класса.

Давайте представим, что у нас есть класс Person у которого слишком много адресных полей, которые хорошо бы вынести в отдельный класс:

ReSharper 7: релиз в деталях

Чтобы предоставить для различных адресных свойств отдельный класс, мы можем вызвать рефакторинг как из контекстного меню, так и например из нового Solution Explorer’a. Все что нужно так это выбрать нужные свойства и использовать меню Refactor This:

ReSharper 7: релиз в деталях

Появится диалоговое окно, в котором можно выбрать те элементы, которые вы хотите экстрактить (неологизм?) а также задать имя новому классу и переменной, которая будет содержать инстанс этого класса в его «прородителе»:

ReSharper 7: релиз в деталях

Рефакторинг также дает несколько опций касательно того, как можно получать доступ к вытащенному свойству:

ReSharper 7: релиз в деталях

Варианты есть такие:

  • None означает что член класса будет доступен только через новую переменную.
  • Create copy создаст в изначальном классе точную копию того члена, который вы вытащили в новый класс. Если какой-то участок кода использует эту переменную, он продолжает использовать оригинал, а не то что вытащили.
  • Create delegating wrapper создает делегирующую обертку вокруг вытащенного элемента. Иначе говоря, все вызовы пробрасываются, например:
    ReSharper 7: релиз в деталях

Помимо этого, диалоговое окно Extract Class наглядно иллюстрирует все возможные проблемы доступности элементов, которые возникнут при вытаскивании нового класса. Для каждого выбранного в списке элемента, Решарпер покажет все другие элементы, которые его используют:

ReSharper 7: релиз в деталях

И в аналогичной манере, когда вы выберете чек-бокс того элемента, который вы хотите вынести в отдельный класс, Решарпер покажет все другие элементы которые тоже будут вынесены дабы сохранить корректность выполнения. Например, при попытке вынести метод PrintCity(), вы увидите следующее:

ReSharper 7: релиз в деталях

…и получите следующий код:

ReSharper 7: релиз в деталях

Ну и наконец, будут ситуации, когда у вас будет полноценный конфликт использования: например, попытка вытащить private свойство которое все еще используется в оригинальном классе. В этом случае, Решарпер покажет вам значек Stop и предложит несколько вариантов разрешения этой проблемы:

ReSharper 7: релиз в деталях

Варианты возможных фиксов такие:

  • Make public просто делает элемент публичным.
  • Create accessor оставляет элемент «как есть» но делает ему публичный прокси-элемент так что оригинальный класс все еще может достучаться до этого элемента.
  • Do not apply fix ничего не делает, тем самым у вас будет некомпилируемый код.

Прошу заметить, что на данный момент рефакторинг поддерживает только язык C#. Поддержка VB.NET возможно появится в одной из будущих версий Решарпера.

Transform Out Parameters

У нас у всех была ситуация, в которой мы начинали работать с методом, у которого было одно возвращаемое значение, а потом хотелось добавить еще одно. Типичное решение этой проблемы заключается в добавлении out параметров, например:

ReSharper 7: релиз в деталях

В качестве альтернативы к подходу выше можно использовать тип возвращаемого значения Tuple<Person,bool> и Transform Out Parameters именно этот подход и реализует. Достаточно просто вызвать этот рефакторинг на out параметре…

ReSharper 7: релиз в деталях

…и вы получите диалоговое окно, которое покажет вам все существующие out параметры, и даст выбрать те, которые вы хотите перевести в кортеж:

ReSharper 7: релиз в деталях

После применения рефакторинга, у нас будет метод в котором больше нет out пареметров, и который возвращает кортеж. Внутреннее использование параметров будет переписано соответственно:

ReSharper 7: релиз в деталях

Этот рефакторинг доступен для языков C# и VB.NET. Поскольку тут используется класс Tuple, рефакторинг применим в основном к проектам на .NET Framework 4 и выше, хотя в случае единственного out параметра в void методе, рефакторинг позволит вам перевести этот параметр в возвращаемое значение.

Ну и напоследок хочется подметить, что если у вы уже возвращаете кортеж в качестве возврашаемого значения, этот рефакторинг позволит вам расширять этот кортеж на основе out параметров.

Юнит-тестирование

Механизм запуска юнит-тестов Решарпера уже стал привычной частью инструментария для многих разработчиков. Возможность запускать и отлаживать тесты из любой точки в коде, в купе с интегрированным механизмом запуска тестов делают процесс запуска тестов удобным и интуитивным, а наличие большого количества сторонних плагинов дает возажность использовать многие популярные тестовые фреймворки.

Вот небольшой обзор новых возможностей тестирования в 7-м Решарпере.

Jasmine

В предыдущей версии Решарпера мы сделали поддержку тестового фреймворка QUnit. В этом же релизе, мы добавили поддержку Jasmine – BDD-фреймворка для тестирования JavaScript.

ReSharper 7: релиз в деталях

Как и везде, результаты тестов Jasmine попадают в окно прогона тестов:

ReSharper 7: релиз в деталях

PhantomJS

Помимо возможности исполнять тесты в браузере, ReSharper 7 предлагает пользователям альтернативный механизм: возможность использования PhantomJS – консольного интерфейса к движку WebKit – для выполнения тестов. Чтобы начать его использовать, нужно всего лишь открыть настройки (вкладку Unit Testing|JavaScript Tests) и указать путь по которому PhantomJS установлен:

ReSharper 7: релиз в деталях

Теперь все выполненные JavaScript тесты будут исполняться через PhantomJS, и не будет появляться окно браузера.

Улучшения в NUnit

В функционал тестирования добавлена поддержка атрибута TestCaseSource в NUnit. Этот атрибут позволяет задавать местоположение тест-кейсов для параметризуемых тестов:

ReSharper 7: релиз в деталях

Поскольку этот атрибут ссылается на переменную по имени, Решарпер также проверяет это имя на валидность:

ReSharper 7: релиз в деталях

…а также предоставляет возможности по автодополнению:

ReSharper 7: релиз в деталях

Поддержка других фреймворков

Если вы хотите использовать тестовый фреймворк который Решарпер не поддерживает «нативно» – это не проблема, т.к. многие плагинописатели поставляют поддержку тех или иных тестовых фреймворков. На сегодняшний день, фреймворки которые поддерживают Решарпер включают в себя AgUnit, Gallio/MbUnit, xUnit и MSpec.

Поддержка новых языков в ReSharper SDK

С самого первого выпуска ReSharper SDK, нас спрашивают про то, как добавлять в Решарпер поддержку новых языков. Возможность добавления такой поддержки была всегда, но это было не так просто, поэтому в этой версии мы решили представить пользователям полный набор инструментов для создания лексеров и парсеров для новых языков.

Инструменты

Поддержка новых языков в Решарпере требует создания лексеров и парсеров для этих языков, а также последующую адаптацию этих сгенерированных структур к API Решарпера. Чтобы упростить этот процесс, мы добавили в SDK папку под названием Tools, в которой можно найти следующие полезные инструменты:

  • CsLex — инструмент для создания лексических анализаторов для различных языков
  • parserGen — инструмент для создания парсеров, совместимых с Решарпером
  • Java — в этой папке находится инфраструра IKVM, которая позволяет запускать генератор парсеров (который сам написан на Java)
  • MSBuild — содержит таски которые позволяют в проекте автоматизировать создание парсеров и лексеров

Примеры

Один из предоставленных инструментов, parserGen, использует специальный формат опеределения парсеров (PSI файлы) которые сами по себе используют специальный язык. Поэтому мы решили убить двух зайцев сразу, поставив вместе с SDK плагин, поддерживающий язык PSI-файлов. Это позволяет нам:

  • Путем предоставления исходников плагина проиллюстрировать процесс создания поддержки нового языка
  • Предоставить через плагин поддержку для создания новых языков

Заключение

Помимо описанных выше фич, Решарпер 7 также поддерживает:

  • Проекты SharePoint и LightSwitch
  • ASP.NET 4.5 и ASP.NET MVC 4
  • Расширенные настройки именования переменных (будут полезны тем, кто использует разные схемы именования для приложений и тестов).
  • …и многое другое!

Попробовать ReSharper 7 можно, скачав дистрибутив c 30-дневным бесплатным периодом.

Разработчики оpen-source проектов могут подать заявки на бесплатные лицензии.

Бесплатные аудиторные лицензии могут также получить и образовательные учреждения.

Автор: mezastel

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


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