Две недели назад мы объявили о выходе ReSharper 7.0, лишь кратко перечислив те новинки, которые были реализованы в этом мажорном релизе.
Сегодня же подписчики MSDN и TechNet получат возможность скачать Visual Studio 2012, и это прекрасный повод, чтобы рассказать про новые возможности ReSharper 7.0 максимально подробно и обстоятельно.
Краткое содержание статьи (которое заодно поможет вам в навигации по этому объемному материалу):
Visual Studio 2012
- Поддержка тем
- Асинхронная загрузка проектов
- Quick Launch
- Preview Tab
- Solution Explorer
- Architecture Explorer
- Граф зависимостей
Windows Runtime
Кодогенерация
- Генерация частичных методов
- Улучшения в Generate Equality Members
- Generate Equality Comparer
- Поддержка INotifyPropertyChanged
INotifyPropertyChanged
Новые рефакторинги
Юнит-тестирование
Поддержка новых языков в ReSharper SDK
Visual Studio 2012
Одна из основных задач нового Решарпера – обеспечить полную и прозрачную поддержку VIsual Studio 2012. Эта поддержка касается как новых аспектов интерфейса, так и новых технологий. Давайте начнем с интерфейса, который претерпел весьма существенные изменения.
Поддержка тем
Visual Studio 2012 поддерживает парадигму «тем» и поставляется с двумя темами – светлой (Light) и темной (Dark). Мы добавили в Решарпер поддержку обеих тем для всех наших меню, иконок, и т.п., дабы полностью гармонировать со Студией.
В новой Студии также появились монохромные иконки, но мы в свою очередь получили много фидбека от пользователей, которые просили нас не конвертировать наши иконки в этом стиле. Поскольку визуальные предпочтения – вещь субъективная, мы решили дать пользователям право выбора:
Тем самым, вы можете сами выбрать иконки, которые будут отражены в различных меню, окошках, и т.п., а также в качестве иконок для разных элементов проекта – типов, свойств, и т.д. Настроить иконки можно через 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 выдаст вам все соответствующие команды Решарпера:
Preview Tab
Еще одна новая фича VS2012 – это «вкладка предпросмотра» (preview tab). Суть ее в том, что в отличии от обычного тэба для документа, этот тэб открывается в правой части окна, но как только вы начинаете его редактировать – перемещается в левую часть. Смысл этого тэба – показывать фиксированный обозреватель по которому можно навигировать, не порождая новые открытые тэбы.
Решарпер поддерживает использование этого специального тэба в таких фичах как Go To Type/Member/File/Declaration а также в Find Usages и связанных с ним окнах.
Solution Explorer
В новом обозревателе решений можно раскрыть конкретный файл и увидеть его структуру – классы, методы, и так далее. Решарпер в свою очередь предоставляет контекстное меню для этих элементов, так что на них можно выполнять рефакторинги, find usages, и другие привычные команды – как через использование всплывающих меню, так и через комбинации клавиш.
Architecture Explorer
В редакции Ultimate, VS2012 поставляется с обозревателем архитектуры (Architecture Explorer), которые позволяет прогрессивно углубляться а решение начиная с пространств имен и заканчивая конкретными полями или методами. И здесь Решарпер предоставляет ту же поддержку контекстных действий на элементах кода с использованием всплывающих меню Navigate To или Refactor This.
Граф зависимостей
Помимо поддержки Architecture Explorer, Решарпер также предоставляет те же возможности в графе зависимостей, который умеет генерировать Студия.
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, Решарпер знаком с новыми пространствами имен и форматами, и способен предоставить нужные варианты дополнения в зависимости от контекста редактирования:
- Инспекции продолжают предоставлять релевантную информацию о возможных проблемах с кодом в WinRT-специфичных проектах:
- Коррекция ошибок (quick-fixes) также способствует быстрому устранению проблем:
- Контекстная навигация позволяет быстро передвигаться по решению. Этот механизм осведомлен о специфике WinRT-проектов таких, например как варианты именования ресурсов:
- Оптимизация ссылок (reference optimization) также поддерживается в C#/VB.NET-ориентированных WinRT проектах:
JavaScript
В отличии от C#/VB.NET WinRT проектов, которые унаследовали модель разработки у WPF и Silverlight, модель разработки под WinRT с использованием JavaScript (известная также как WinJS) кардинально отличается. Тем не менее, Решарпер предоставляет много различных фич для ее поддержки:
- Автодополнение кода поддерживается в HTML, CSS и JavaScript, и даже в JSON-атрибутах внутри HTML:
- Автодополнение также доступно для импортированных WinRT-компонент. Например, вот это класс
будучи импортированным в JavaScript позволяет Решарперу выдать следующий список автодополнения:
- Конечно, навигация и поиск прекрасно работают с WinRT-проектами. Если взять пример выше и поискать использование класса
Person
в проекте C#, то мы получим ссылку и на проект WinJS:
- Механизм create from usage (создание элементов кода из примеров их использования) также работает в кросс-проектных сценариях. Например, если создать новое свойство для импортированной WinRT-компоненты:
то оно будет автоматически создано в определении этой компоненты:
- Рефакторинги (такие как Rename, например) тоже работают в кросс-проектных сценариях. Например, попытка переименовать спроецированное из WinRT-компоненты в WinJS имя свойства откроет диалог переименования оригинального свойства:
Соответственно, после этого изменения, в C# проекте имя свойства станетFullName
, а в проецированной компоненте –fullName
.
Ну и, как вы догадываетесь, большинство существующих уже фич для поддержки C#, VB.NET, XAML, HTML, CSS и JavaScript остаются доступными для всех, кто планирует работать с проектами на основе WinRT.
Кодогенерация
Если бы между различными подсистемами Решарпера был конкурс насчет того, кто привносит больше изменений и минимум усилий, то механизм Generate был бы бесспорным победителем. И, конечно же, в новом Решарпере мы добавили несколько новых фич и улучшений этого механизма.
Генерация частичных методов
Многие фреймворки кодогенерации производят код, состоящий из partial
классов для того, чтобы пользователи могли в последствии изменить или дополнить поведение сгенерированных компонент. Например, Entity Framework делает это, определяя классы сущностей как partial
.
Теперь Решарпер поддерживает этот сценарий использования и позволяет генерировать сигнатуры частичных методов. Для этого, нужно всего лишь создать partial
тип и вызвать Generate | Partial Methods:
Теперь нужно лишь выбрать те методы, которые хочется реализовать:
… и все выбранные методы будут добавлены в выбранный класс:
Улучшения в Generate Equality Members
При сравнении типов, многие из наших пользователей хотели регулировать механизмы, с помощью которых производится сравнение типов. Поэтому мы добавили в Generate Equality Members три разные опции сравнения типов:
В зависимости от того, какую опцию вы выберете, условие проверяющее совпадение типов в методе Equals()
может быть реализовано одним из следующих путей:
- Тип должен быть такой же как
this
:
- Тип должен быть такой же, как тип класса:
- Тип должен быть типом или наследником класса:
Generate Equality Comparer
В дополнении к «инлайновой» реализации сравнения для определенного класса, новый Решарпер поставляется с новым генератором под названием Generate Equality Comparer. Цель этого генератора – создать отдельный класс который реализует интерфейс IEqualityComparer<T>
. Это бывает нужно для реализации специфичных критериев сравнения, а также в тех случаях когда этот интерфейс требует определенный API, с которым вы работаете.
Вот небольшой пример. Допустим, что у нас есть класс Person
в котором два свойства. Мы вызываем экшн:
…и, выбрав те элементы, по которым мы хотим проводить сравнение, Person
получаете следующий сгенерированный приватный вложенный класс:
В дополнении к этому, есть вариант сгенерировать вложенный статический инстанс этого класса как поле:
Поддержка INotifyPropertyChanged
Если ваш класс реализует INotifyPropertyChanged
или наследует от класса, который использует этот механизм (например, NotificationObject
из фреймворка Prism), то действие Generate Properties предложит вам различные варианты реализации свойств с учетом этого интерфейса:
INotifyPropertyChanged
Еще со времен Windows Forms, интерфейс INotifyPropertyChanged
используется для того чтобы давать свойствам сообщить об изменениях всем, кому нужно (обычно это UI). Поддержку оповещения об изменениях, которая сегодня используется во многих платформах (WPF, Silverlight) и фреймворках, нас очень часто просили сделать и в новом релизе, мы ее сделали.
Автоматическая реализация
Как только вы добавите декларацию INotifyPropertyChanged
в свой класс, Решарпер предложит вам быструю коррекцию для реализации этого интерфейса:
Применив этот фикс, вы автоматически получите не только декларацию события, но и метод, способствующий вызову этого события. Теперь вы можете взять любой свойство (будь то автосвойство или свойство с полем) и применить к нему контекстное действие, которое добавит вызов нотификационного метода:
Если вы используете поля вместо свойств, вы можете также воспользоваться командой Generate Properties и Решарпер предложит вам реализовать нотификации на сгенерированных свойствах:
Трэкинг идентификаторов
Ссылка на свойство через строку – не самое безопасное решение. Но если вам необходимо это делать, то Решарпер вам поможет. Во-первых, он будет отслеживать имена свойств, так что если вы сделаете ошибку или сошлетесь, например, на приватное свойство, то Решарпер тут час же высветит ошибку:
Во-вторых, если вы решите где-то вызвать метод нотификации вручную, вам будет представлено автодополнение в строке с названиями возможных свойств:
Поддержка различных фреймворков
Существует много разных реализаций 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
, который вы хотите вызывать:
Если вы выберете лябмда-ориентированный вариант, то ваши свойства будут выглядеть вот так:
И, конечно же, эти же варианты реализаций будут представлены в контекстных меню:
Новые рефакторинги
У Решарпера уже сложилась репутация инструмента, который хорошо помогает управлять сложностью, и в 7-м релизе мы рады представить два новых рефакторинга, созданные с целью упростить задачу управления большими объемами кода.
Extract Class
Что вы делаете, если у вас в коде класс разрастается до неуправляемых размеров? Скорее всего, вы пытаетесь разбить класс не несколько классов поменьше. Дабы упростить эту операцию мы добавили рефакторинг под названием Extract Class. Суть этого рефакторинга простая: вы выбираете, какие члены класса нужно «вытащить», решаете что делать с различными проблемами в доступе (если таковые имеются), и ReSharper делает за вас работу по создании нового класса.
Давайте представим, что у нас есть класс Person
у которого слишком много адресных полей, которые хорошо бы вынести в отдельный класс:
Чтобы предоставить для различных адресных свойств отдельный класс, мы можем вызвать рефакторинг как из контекстного меню, так и например из нового Solution Explorer’a. Все что нужно так это выбрать нужные свойства и использовать меню Refactor This:
Появится диалоговое окно, в котором можно выбрать те элементы, которые вы хотите экстрактить (неологизм?) а также задать имя новому классу и переменной, которая будет содержать инстанс этого класса в его «прородителе»:
Рефакторинг также дает несколько опций касательно того, как можно получать доступ к вытащенному свойству:
Варианты есть такие:
- None означает что член класса будет доступен только через новую переменную.
- Create copy создаст в изначальном классе точную копию того члена, который вы вытащили в новый класс. Если какой-то участок кода использует эту переменную, он продолжает использовать оригинал, а не то что вытащили.
- Create delegating wrapper создает делегирующую обертку вокруг вытащенного элемента. Иначе говоря, все вызовы пробрасываются, например:
Помимо этого, диалоговое окно Extract Class наглядно иллюстрирует все возможные проблемы доступности элементов, которые возникнут при вытаскивании нового класса. Для каждого выбранного в списке элемента, Решарпер покажет все другие элементы, которые его используют:
И в аналогичной манере, когда вы выберете чек-бокс того элемента, который вы хотите вынести в отдельный класс, Решарпер покажет все другие элементы которые тоже будут вынесены дабы сохранить корректность выполнения. Например, при попытке вынести метод PrintCity()
, вы увидите следующее:
…и получите следующий код:
Ну и наконец, будут ситуации, когда у вас будет полноценный конфликт использования: например, попытка вытащить private
свойство которое все еще используется в оригинальном классе. В этом случае, Решарпер покажет вам значек Stop и предложит несколько вариантов разрешения этой проблемы:
Варианты возможных фиксов такие:
- Make public просто делает элемент публичным.
- Create accessor оставляет элемент «как есть» но делает ему публичный прокси-элемент так что оригинальный класс все еще может достучаться до этого элемента.
- Do not apply fix ничего не делает, тем самым у вас будет некомпилируемый код.
Прошу заметить, что на данный момент рефакторинг поддерживает только язык C#. Поддержка VB.NET возможно появится в одной из будущих версий Решарпера.
Transform Out Parameters
У нас у всех была ситуация, в которой мы начинали работать с методом, у которого было одно возвращаемое значение, а потом хотелось добавить еще одно. Типичное решение этой проблемы заключается в добавлении out
параметров, например:
В качестве альтернативы к подходу выше можно использовать тип возвращаемого значения Tuple<Person,bool
> и Transform Out Parameters именно этот подход и реализует. Достаточно просто вызвать этот рефакторинг на out
параметре…
…и вы получите диалоговое окно, которое покажет вам все существующие out
параметры, и даст выбрать те, которые вы хотите перевести в кортеж:
После применения рефакторинга, у нас будет метод в котором больше нет out
пареметров, и который возвращает кортеж. Внутреннее использование параметров будет переписано соответственно:
Этот рефакторинг доступен для языков C# и VB.NET. Поскольку тут используется класс Tuple
, рефакторинг применим в основном к проектам на .NET Framework 4 и выше, хотя в случае единственного out
параметра в void
методе, рефакторинг позволит вам перевести этот параметр в возвращаемое значение.
Ну и напоследок хочется подметить, что если у вы уже возвращаете кортеж в качестве возврашаемого значения, этот рефакторинг позволит вам расширять этот кортеж на основе out
параметров.
Юнит-тестирование
Механизм запуска юнит-тестов Решарпера уже стал привычной частью инструментария для многих разработчиков. Возможность запускать и отлаживать тесты из любой точки в коде, в купе с интегрированным механизмом запуска тестов делают процесс запуска тестов удобным и интуитивным, а наличие большого количества сторонних плагинов дает возажность использовать многие популярные тестовые фреймворки.
Вот небольшой обзор новых возможностей тестирования в 7-м Решарпере.
Jasmine
В предыдущей версии Решарпера мы сделали поддержку тестового фреймворка QUnit. В этом же релизе, мы добавили поддержку Jasmine – BDD-фреймворка для тестирования JavaScript.
Как и везде, результаты тестов Jasmine попадают в окно прогона тестов:
PhantomJS
Помимо возможности исполнять тесты в браузере, ReSharper 7 предлагает пользователям альтернативный механизм: возможность использования PhantomJS – консольного интерфейса к движку WebKit – для выполнения тестов. Чтобы начать его использовать, нужно всего лишь открыть настройки (вкладку Unit Testing|JavaScript Tests) и указать путь по которому PhantomJS установлен:
Теперь все выполненные JavaScript тесты будут исполняться через PhantomJS, и не будет появляться окно браузера.
Улучшения в NUnit
В функционал тестирования добавлена поддержка атрибута TestCaseSource
в NUnit. Этот атрибут позволяет задавать местоположение тест-кейсов для параметризуемых тестов:
Поскольку этот атрибут ссылается на переменную по имени, Решарпер также проверяет это имя на валидность:
…а также предоставляет возможности по автодополнению:
Поддержка других фреймворков
Если вы хотите использовать тестовый фреймворк который Решарпер не поддерживает «нативно» – это не проблема, т.к. многие плагинописатели поставляют поддержку тех или иных тестовых фреймворков. На сегодняшний день, фреймворки которые поддерживают Решарпер включают в себя 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