company_banner

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

    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 | 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 проектов могут подать заявки на бесплатные лицензии.

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

    Комментарии 41

      +7
      Традиционно: буду рад поболтать и помочь с ReSharper'ом тут, если не доходили руки написать напрямую 8)
        +1
        Выглядит аппетитно!
        Что интересно смущает, так это какой memory footprint новых наворотов? И так при переходе на 5ю версию обнаружилось, что на масштабных проектах VS 2008 + Resharper через день работы занимают 800-1000Мб памяти, если не клацать постоянно на кнопку Collect… (
          +1
          Перед выпуском 7-ой версии мы очень много внимания уделили работе с памятью, поэтому в этом смысле все должно стать лучше.
          Самый хороший способ проверить — попробовать самому триалку.
            +1
            А что за такая волшебная кнопка Collect?
              0
              Не могу сейчас заскринить, но речь о том, что можно нажать на индикатор в правом нижнем углу и выбрать там пункт для чистки памяти. Может там банальный GC.Collect() вызывается, не знаю, но память чистит хорошо.
                0
                В правом нижнем углу кнопка Solution analisys, нету там коллекта (vs 2008).
                Может это плагин какой?
                  0
                  чуть ниже тов. fergard написал, клацать надо на индикатор занятой памяти, предварительно включеный в опциях.
                +2
                Для вызова 'Collect Garbage' руками, надо включить показ используемой памяти в статус баре (галка в ReSharper | Options | Environment | General), после чего сделать дабл-клик на ней (памяти в статус-баре).

                Если все сделать правильно, покажется тултипчик со словами «Garbage Collected».
                  0
                  'Collect Garbage' только в 7-ой версии? Или в 6-ой версии тоже уже есть?
                    0
                    По-моему, это было еще в 5-ке или даже раньше; так что в 6-ой версии точно есть.
                    0
                    Извините, ступил, надо еще было включить показ в самой Visual Studio 'Status bar'
                0
                А есть какой-то рефакторинг для js?
                  +1
                  Для JS появилось много новых анализов и более 30 новых контекстных действий. Например, появились возможности по разному определять свойства:

                  image

                  image

                  Также появилась поддержка Jasmine и PhantomJS.
                  +2
                  Я всегда удивлялся, как вам удается быть в курсе стольких тонкостей не только Visual Studio и .NET Framework, но и многих сторонних библиотек? У вас есть специальный отдел, который все время занимается исследованиями или у каждого разработчика своя область знаний, за которую он ответственнен?
                    0
                    Вообще сами по себе фреймворк и платформа ничего не значят если под них нет толковых фреймворков на которых можно делать приложения, сайты и так далее. А чтобы делать их эффективно, нужно чтобы Решарпер их поддерживал, поэтому конечно исследования проводятся. Но какого-то особого отдела нет.
                    +1
                    Выглядит вкусно, надо пробовать в реальной работе.
                      +1
                      Почему-то у меня недоступен весь функционал, посвященный автоматической реализации свойств, поддерживающих INotifyPropertyChanged.

                      В меню Generate пункты Properties и Read-only properties всегда неактивны.

                      Нотификационого метода То property with change notification нет вообще, как нет Annotate with 'CanBeNullAttribute' и Annotate with 'NotNullAttribute'.

                      Проверял на нескольких проектах, в том числе и на новосозданном Console Application.

                      VS2010 SP1.

                      Подскажите, плз, что это может быть?
                        +2
                        Необходимо добавить JetBrains.Annotations в свой проект/солюшен. Это можно сделать, либо зареференсив JetBrains.Annotations.dll из папки ReSharper'а, либо скопировав дефолтную имплементацию в свой проект из ReSharper | Options Code Inspection | Code Annotations | Copy Default Implementation to Clipboard".
                          0
                          Да, это помогло, спасибо. Но только для Annotate with 'CanBeNullAttribute' и Annotate with 'NotNullAttribute'.

                          Добавить пропертю через мастер R# я всё-равно не могу.
                            0
                            Проверьте, что ваш метод вызова события помечен аттрибутом [NotifyPropertyChangedInvocator].
                              0
                              Ух ты! Помогло! Хотя в статье об этом ни слова. Спасибо.
                              Однако… в меню Generate пункт Property всё-равно неактивный. Работает только нотификационный метод То property with change notification.
                                +2
                                Все — разобрался. Пункт Generate Property работает только если у класса есть объявленные поля из которых R# и сделает свойства.
                        0
                        Вопрос не совсем по resharper'у: планируется ли что-то наподобие ncrunch и .net demon?
                          +2
                          Для Unit Test Coverage у нас есть dotCover; 'build as you type'-подобие возможно и с ReSharper'ом (с включенным Solution-Wide Analysis); для Continuous Integration есть TeamCity (у которого, к слову, в посл. версии появились ReSharper'овские инспекции кода).
                          0
                          Подскажите, после апгрейда до 7ки пропала опция close all windows на табах. Насколько я помню это решарпер ее добавлял, ибо в VS2010 была только опция close all but this.
                            0
                            Спасибо, мы знаем об этой проблеме: youtrack.jetbrains.com/issue/RSRP-328720.
                            Она будет пофикшена в ближайшем обновлении.
                              0
                              Замечательно. Спасибо.
                                0
                                Вам спасибо за репорт 8) Лучше держать «руку на пульсе» 8))
                            0
                            Javasript: ссылки из связанных файлов по прежнему не анализируются :(

                            мой топик на JetBrain: devnet.jetbrains.net/thread/432793
                              0
                              Извините… К сожалению, не успеваем сделать все, что просят. 8((

                              Я спрошу соотв. разработчика касательно этого фича-реквеста.
                                0
                                спасибо за feedback :)
                                  0
                                  Вам спасибо! 8)
                              –2
                              А в плагин встроен русский язык?
                                0
                                Нет.
                                +1
                                Эх, еще бы версию под MonoDevelop, купил бы сходу :(
                                  0
                                  К сожалению, планов касательно MonoDevelop у нас пока что нет.
                                    0
                                    А касательно чего-то вроде dotIDEA?
                                      0
                                      ".NET IDE" нас очень просят сделать, но (увы!) на подобный продукт у нас тоже пока что нет никаких планов.
                                        0
                                        Жаль. IDEA + MonoTouch = счастье =)
                                          0
                                          На самом деле, писать под Monotouch можно под Visual Studio, и Решарпер в этом сценарии работает без проблем. Понятное дело что Мак все равно нужен для xib-файлов, но я например работаю именно так, а синхронизацию провожу через DropBox.
                                  0
                                  У вас небольшая ошибка, должно быть не AdterNotify, а AfterNotify
                                  blogs.jetbrains.com/dotnet/wp-content/uploads/2012/07/gen3.png

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое