Привет, хабр!

Больше года мы не делились здесь новостями о релизах в семействе инструментов ReSharper Ultimate. Это не значит, что работа встала, напротив: ее было много.

Читатели нашего англоязычного блога уже в курсе, что в ReSharper 2016.3 появилась начальная поддержка Visual Studio 2017, C# 7, VB.NET 15 и возможность запуска и отладки .NET Core юнит-тестов. Под катом вы найдете обзор этих и других обновлений в .NET продуктах и в ReSharper C++.



Совместимость с Visual Studio 2017 RC


Все инструменты в составе ReSharper Ultimate можно установить в Visual Studio 2017 RC. Есть несколько новых функций Visual Studio, над поддержкой которых мы работаем и представим исправления в ближайших обновлениях. Сейчас в ReSharper не поддерживается режим инкрементальной загрузки решений (Lightweight Solution Load) и .NET Core юнит-тесты. Для работы с ReSharper C++ отключите опцию Enable Faster Projects Load в настройках текстового редактора Visual Studio.

Начальная поддержка C# 7 и VB.NET 15


ReSharper распознает локальные функции C# 7 и предоставляет множество инспекций кода в их контексте, таких как Possible System.NullReferenceException, Access to disposed closure и Access to modified closure.

В C# 7 поддерживаются out переменные и сопоставление с шаблоном для конструкций is и case в операторе switch.

Бинарные литералы в C# 7 и VB.NET 15 распознаются, и их можно преобразовать в шестнадцатеричную систему, а также добавить разделитель разрядов.

image

Больше генераторов кода


Мы улучшили механизм Generate (Alt+Ins) для C# и VB.NET и дополнили его тремя новыми действиями для генерации Relational members, Relational comparer и шаблона Dispose.

Generate relational members перегружает операторы сравнения (>, <, ?, ?) и реализует интерфейс IComparable и IComparable<T> с использованием выбранных полей и свойств. Generate relational comparer создает класс для сравнения выбранных объектов, наследуемый от Comparer<T>. ReSharper также определяет типы полей: если класс содержит строковые поля, можно выбрать опцию для сравнения строк и включить проверку на null.

Проверка параметров на null теперь доступна для генератора Generate constructor. При выборе опции Check parameters for null создаётся защитный код, который выбрасывает исключение ArgumentNullException в конструкторе.

Используйте Generate Dispose pattern для реализации интерфейса IDisposable с дополнительными проверками на null и деструктором для неуправляемых ресурсов.

image

Напомню, что меню Generate вызывается сочетанием клавиш Alt+Ins. Действия, которые реализуют интерфейсы IDisposable, IEquatable<T> и IComparable<T>, доступны по Alt+Enter на выделенном фрагменте кода.

Новые контекстные действия, быстрые исправления и рефакторинг


В ReSharper 2016.3 появилось быстрое исправление (quick-fix), с помощью которого создаются поля и свойства для неиспользованных аргументов. Раньше это действие выполнялось только для одного аргумента, но теперь поля и автосвойства генерируются сразу для всех аргументов. Можно задать тип генерируемого свойства, выбрав соответствующее значение в меню Configure default.

image

Появилось новое контекстное действие для полей типа Lazy<T>, которое создаёт свойство для инкапсуляции fieldname.Value.

image

Новый рефакторинг Transform Parameters заменил два других: Transform Out Parameters и Extract Class from Parameters. Он переписывает параметры метода, изменяя входные параметры на новый класс или кортеж. Для возвращаемого значения или любого выходного параметра можно создать новый класс. Как всегда, рефакторинг Transform Parameters вызывается из меню Refactor This (Ctrl+Shift+R).

image

Навигация и поиск стали удобнее


Мы обновили механизм поиска вхождений, упростив поиск ссылок на часто используемые символы. Во всплывающем окне Search for usages (Shift+Alt+F12) появилась кнопка Show in Find Results. Если поиск занимает много времени, нажмите эту кнопку (или + на цифровом блоке) и продолжайте работу над проектом, пока поиск выполняется в окне Find Results. Это окно теперь тоже наполняется асинхронно, позволяя работать с частичными результатами поиска.

image

Мы также поработали над представлением информации в окнах Recent Files и Recent Edits. Теперь в них показывается путь к файлу, чтобы избежать путаницы в случае одинаковых имен. В Recent Files можно удалять записи с помощью клавиши Delete. В Recent Edits несколько изменений в одном и том же методе объединяются в одну запись.

В Go to Text появилась поддержка новых форматов файлов: .less, .hbs, .coffee, .scss, .dart, .as, .styl.

В настройках ReSharper появилась новая опция Remember last search. Если её включить и выполнить поиск, то его результаты отобразятся в окне при следующем вызове Go to Everything, Go to Text и других поисковых команд. Это полезно, если не подошёл первый результат поиска, на который вы перешли, и вы хотите походить по другим результатам.

ReSharper Build


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

image

ReSharper Build обзавелся собственным механизмом восстановления пакетов NuGet (NuGet Restore). Раньше приходилось использовать интеграцию NuGet в Visual Studio, но это работало только в версии 2015. Теперь механизм восстановления работает во всех версиях Visual Studio при условии, что у вас установлен .NET Framework 4.5 или выше.

Небольшие изменения появились в опциях ReSharper Build. Из наиболее интересного — вывод журнала ошибок в окно Output Visual Studio или запись журнала в файл.

Поддержка .NET Core


Мы улучшили поддержку .NET Core во всех инструментах ReSharper Ultimate. ReSharper теперь позволяет запускать юнит-тесты xUnit и NUnit в проектах .NET Core и ASP.NET Core 1.0.x в Visual Studio 2015. Всё, что вы привыкли делать с тестами для .NET Framework — запускать, отлаживать, организовывать по сессиям, — теперь доступно и в проектах .NET Core.

image

dotCover теперь умеет измерять покрытие кода юнит-тестами в проектах .NET Core.

В dotTrace и dotMemory можно профилировать производительность и потребление памяти в приложениях .NET Core. Для этого выберите тип профилирования .NET Core Application и укажите путь к приложению.

image

Улучшенная поддержка TypeScript, JavaScript и JSON в ReSharper


В TypeScript появилось автодополнение кода для строковых литералов. Если у нас есть метод с определенным набором параметров, то автодополнение кода их покажет. Это работает и для чисел.

Go to Implementation (Ctrl+F12) работает для типов TypeScript. Переходите от базового типа к любой из его реализаций, пропустив промежуточные шаги в цепочке наследования. Структурный поиск (Structural Navigation) с использованием клавиш Tab или Shift+Tab работает в JavaScript, TypeScript и JSON.

Новое быстрое исправление Surround with type guard генерирует проверку типа переменных. В примере ниже мы добавили защиту типа для padding, чтобы исключить ошибку в том случае, если переменная содержит число.

image

Мы также добавили поддержку CSS, JSON и JavaScript кода в строковых литералах. В C#, TypeScript или JavaScript строковому литералу можно присвоить определённый язык, чтобы получить доступ к функциям ReSharper по анализу кода и автодополнению. Сделать это можно двумя способами: с помощью сочетания клавиш Alt+Enter вызвать контекстное действие Mark as или добавить комментарий с таким синтаксисом: //language=javascript|html|regexp|jsregexp|json|css

ReSharper автоматически распознает код в литералах для известных сценариев, таких как введение кода JavaScript в шаблоны AngularJS или CSS в индексаторы $[] jQuery. Включить или отключить автоматическую поддержку кода в строковых литералах можно в опциях ReSharper: Options | Code Editing | Language Injections.

Наконец, в ReSharper появилась новая опция для настройки работы со сторонним кодом. На странице Third-Party Code можно отметить JavaScript, TypeScript или JSON файлы как «Skipped code» или «Library code», исключив таким образом сторонний код из индексации и инспекций ReSharper.

image

Декомпилятор в ReSharper и dotPeek


В окне ReSharper Assembly Explorer появилась возможность открыть сборку, загрузив её непосредственно с nuget.org или иного репозитория пакетов.

image

После загрузки выбранного пакета можно исследовать входящие в него сборки, пространства имен и типы.

В автономном dotPeek теперь показываются метаданные .NET сборок: таблицы, BLOB-объекты, строки и т.д. Окно Assembly Explorer позволяет автоматически найти и отобразить вхождения табличных элементов метаданных, декодировать и вывести значения BLOB, исследовать заголовки PE-файла. И, конечно, можно посмотреть декомпилированный код для любого элемента метаданных.

image

Новая подсветка кода в dotCover


В dotCover изменился механизм подсветки кода. Раньше покрытые тестами строки кода выделялись зелёным цветом, а непокрытые — красным. Вместо этого в текстовом редакторе появились цветные маркеры, которые показывают как состояние покрытия кода, так и статус покрывающих их юнит-тестов. Зелёный маркер рядом со строкой означает, что все инструкции на этой строке покрыты и тесты проходят. Красный — не работают тесты, связанные с текущей инструкцией. Серый маркер сообщает о том, что инструкция не покрыта тестами.



dotTrace: доработанное представление Timeline


В режиме Timeline появилась новая опция Collect native allocations, которую можно выбрать перед запуском профилировщика. Затем при анализе данных профилирования можно отфильтровать события по обращению к нативной памяти (Native Memory Allocation), чтобы выявить места в коде с возможными утечками памяти, проблемами использования неуправляемых компонентов в вашем управляемом коде и т.д.



Timeline viewer теперь содержит подсистемы (Subsystems) — одну из лучших фич Performance Viewer. Механика подсистем проста: в большинстве случаев, каждая подсистема группирует вызовы, выполненные в определенном пространстве имен или сборке. Эта информация полезна для быстрой оценки распределения времени в определённом поддереве вызова среди различных компонентов: пользовательский и системный код, WPF, LINQ, коллекции, строки и т.д.



Если вы используете в своем решении сторонние фреймворки, добавьте соответствующие подсистемы в dotTrace. Даже быстрый взгляд на подсистемы в дереве вызовов позволит понять, сколько времени в этом дереве приходится на тот или иной фреймворк.

Окно Call Stack получило целый набор улучшений. Мы вернули опцию Show system functions, полезную при анализе времени выполнения методов. Список методов помимо времени каждого метода показывает общее время поддерева вызова. Кликните по времени метода или общему времени, чтобы применить фильтр по соответствующему методу или методу и его поддереву.

В dotTrace 2016.3 мы добавили новое окно событий (Events), в котором видны все события в ходе профилирования: файловые операции, JIT, SQL запросы и др.



Новая автоинспекция в dotMemory


dotMemory предоставляет ряд автоматических инспекций для диагностики утечек памяти. В дополнение к обнаружению дубликатов строк, разреженных массивов и других проблем, dotMemory теперь позволяет проверить приложение на наличие завершенных объектов и объектов в очереди на завершение. Эти объекты, отсортированные по типу, показываются в разделе Finalizable objects, и являются кандидатами на реализацию в их классах интерфейса iDisposable.



ReSharper C++


Постфиксные автодополнения и шаблоны — одно из самых интересных обновлений, пришедших из ReSharper, позволят вам полностью сфокусироваться на данных, а не на синтаксисе. Когда вы добавляете точку (.) или стрелку (->) после выражения, ReSharper С++ предложит свободные функции, которые могут принять это выражение в качестве первого параметра. Постфиксные шаблоны помогают сэкономить время при необходимости изменить то или иное выражение. Оборачивайте выражение с использованием шаблонов if, else, while, do, return, switch и foreach, добавив соответствующий постфикс.

image

Мы добавили новые рефакторинги typedef. Introduce typedef быстро определяет тип для выбранного типа данных и заменяет этот тип и все его вхождения на новый typedef. Inline typedef делает обратное: заменяет существующий typedef фактическим типом данных.

image

Ещё в ReSharper C++ появилась поддержка тестового фреймворка Catch, возможность анализа кода из командной строки и многое другое. В видео-обзоре наш технический евангелист Phil Nash подробно рассказал обо всех обновлениях в ReSharper C++:



Попробуйте инструменты в работе и поделитесь мнением


В этой статье рассмотрены самые заметные обновления ReSharper Ultimate. Больше подробностей вы найдете на странице What’s New. Там же можно скачать продукты.

Как всегда, мы будем рады вашим комментариям. Обязательно пишите о своем опыте использования инструментов, пожеланиях и возникших проблемах здесь или в наш баг-трекер.

Спасибо за внимание и до новых релизов ;)
Поделиться с друзьями
-->

Комментарии (26)


  1. leschenko
    21.12.2016 19:15
    +1

    К сожалению, в очередной раз (может последний), вынуждены отказаться от решарпера.
    Причина проста:
    1. ужасные тормоза.
    2. огромное потребление памяти.
    3. креши студии.
    4. постоянное отставание от актуальной версии typescript.


    1. kxl
      21.12.2016 19:44

      Согласен по п. 1 и 2. EAP был тормозной, постоянно выскакивали исключения, но студия не крешилась. Надеялся, что релиз шустрее будет. Но увы… даже хуже стало. Теперь при открытии солюшена подвисает всё. И, пока внизу не появится processbar resharper'а, интерфейс студии не реагирует.


      1. SvetlanaGEm
        21.12.2016 22:25

        Если первый раз решение открываете, то это нормальное поведение. Могу порекомендовать в то же руководство заглянуть. И если в процессе работы тормоза — будем признательны, если сделаете профилировку и отправите снэпшот.


        1. leschenko
          21.12.2016 23:29

          Решение открывается не первый раз. Люди мучились-мучились и решили отказаться от решарпера. Проблема не у одного меня. Проблема у всей команды.


          1. leschenko
            21.12.2016 23:32
            +1

            Просмотрел, что вопрос не мне оказался. Извините.


        1. kxl
          22.12.2016 08:50
          +1

          Почитал ваше руководство, в принципе я его и раньше читал. Сделал несколько оптимизаций по Configuring Visual Studio preferences. Roslyn тоже отключил. Понаблюдаю.
          А про hardware… 12 Gb Ram, SSD SATA. Но сейчас собираю себе новый комп- надеюсь на улучшение…


    1. SvetlanaGEm
      21.12.2016 22:22
      +1

      Сожалею, что у вас такой опыт :( Далеко не всегда проблема только в решарпере. Если не затруднит, можете отпрофилировать VS (ReSharper | Help | Profile Visual Studio) и прислать нам результаты? Ещё пробовали ли вы настроить студию и решарпер в соответствии с этим руководством?


      1. kxl
        23.12.2016 11:22

        Кстати, иногда, при работе, тормоза возникают неожиданно, а после запуска профайлера не проявляются… Как такое отловить?


        1. SvetlanaGEm
          26.12.2016 15:06

          Вероятно, так получается, что Garbage Collection завершается к моменту аттача снэпшота (вы же не перезапускаете студию под профилятором?) Происходящее очень напоминает частый GC, поэтому рекомендую еще пройтись по руководству Speeding Up ReSharper и отключить все интенсивные потребители памяти, а это в первую очередь SWA (если включен) и студийные VCS провайдеры. Дальше продолжить наблюдение.


    1. nerzhul
      21.12.2016 22:29

      не могли бы сообщить, какую студию используете, и размер вашего солюшена? примерное кол-во проектов/файлов


      1. leschenko
        21.12.2016 23:28

        VS 2015, 63 проекта, 33000 файлов и 3266 папок.


    1. SvetlanaGEm
      22.12.2016 23:06
      +1

      По TypeScript еще уточнила — в ReSharper 2017.1 будет полная поддержка TS 2.1 и, возможно, экспериментальная поддержка 2.2. Причина отставания в том, что наши релизные циклы не всегда совпадают. Когда был выпущен TypeScript 2.1, уже не было возможности отправить его поддержку в этот релиз ReSharper.


      1. leschenko
        25.12.2016 14:59

        Забава в том, что когда у вас появится нормальная поддержка версии X, актуально уже будет X+n.
        И нет никакой возможности отключить в решарпере TS без отключения JS.


    1. timramone
      25.12.2016 14:53

      Последнее очень раздражает. Такие продукты, как решарпер, просто не в состоянии угнаться за скоростью разработки typescript.


  1. Master_Dante
    22.12.2016 05:55
    -1

    Очень раздражает что Решарпер вот так не умеет выравнивать код: http://prntscr.com/dmfzse Обращал ваше внимание на это еще год назад, ваши говорили что даже таск такой уже давно есть, а воз и ныне там. В остальном все устраивает. Еще пожалуй одно но не сильно, решарпер ругается на не известные ему теги в ШТМЛ, это тоже лучше подправить.


    1. kxl
      22.12.2016 08:43
      -1

      Тоже очень хочу такое выравнивание. И тоже писал об этом на rsdn, обещали подумать. Есть плагин для студии, но в Resharper было бы лучше…


    1. SvetlanaGEm
      22.12.2016 18:11

      Это есть в плане для версии 2017.2. В следующем релизе 2017.1 вероятно сделаем возможность оставлять пользовательское выравнивание. При необходимости можете свой запрос уточнить в комментарии здесь: https://youtrack.jetbrains.com/issue/RSRP-121267


  1. exvel
    23.12.2016 12:14

    С рефакторингом аргументов в класс какая-то беда в режиме «New class with public fields». Почему-то публичные поля нового класса генерируются с именами как для приватных.

    До:

    class Class1
    {
        public void Foo(int x, int y)
        {            
        }
    }
    

    После:
    internal class GeneratedClass
    {
        public int _y;
        public int _x;
    
        public GeneratedClass(int x, int y)
        {
            _x = x;
            _y = y;
        }
    }
    
    class Class1
    {
        public void Foo(GeneratedClass generatedClass)
        {            
        }
    }
    

    VS2012, .NET 4.0, ReSharper 2016.3


    1. SvetlanaGEm
      23.12.2016 13:07
      +1

      Спасибо за отлов бага. В трекер занесла RSRP-462349


      1. exvel
        23.12.2016 15:42

        Не за что. :)


  1. White_Scorpion
    23.12.2016 17:22

    Казалось бы время уже прошло, но вставлю и свои 5 копеек…
    Вот уже почти вынул кошелёк и достал кредитку, но отказался от покупки приватной лицензии RS после смены модели лицензирования.

    Груздь-пичаль.


    1. SvetlanaGEm
      23.12.2016 17:27

      При покупке 12 мес подписки для вас по сути ничего не меняется — по истечении срока вы продолжаете пользоваться версией RS на момент покупки + минорные обновления. Это всё подробно обсуждалось в комментариях к соответствующему посту. Если вы не до конца понимаете, как работает новая модель, буду рада ответить на вопросы. Если ваш комментарий был из разряда «просто пожаловаться, что всё плохо», скажу только, что, к сожалению, всем и всегда угодить невозможно.


      1. White_Scorpion
        24.12.2016 02:19

        Не всё плохо. Наоборот — для меня это прекрасно. Я не успел привыкнуть к приличному помощнику, а значит мне не пришлось отвыкать работать без него. Не пришлось проходить — ломку =). Так что — я скорее «на позитиве».

        Это фича/ошибка ваших менеджеров (в зависимости от точки зрения) — лишила вас части клиентов и денег, а не меня. Так что мне нет причин жаловаться. Мой пост был по типу: печально, но без тула вполне можно жить и работать. Nothing more. Простите если задел.


        1. SvetlanaGEm
          24.12.2016 11:48
          +1

          Не задели) Это нормальная ситуация — кому-то такие тулы нужны и важны, кто-то прекрасно обходится без них, как в вашем случае. Если бы новая модель не работала, давно бы поменяли.


      1. exvel
        26.12.2016 10:55
        +1

        по истечении срока вы продолжаете пользоваться версией RS на момент покупки
        А вот про это не знал. Думаю это надо большим шрифтом на странице покупки написать. Знал бы, купил бы раньше подписку.


  1. constructor
    27.12.2016 16:30

    Этот релиз R# как то стал хуже работать с подсветкой ошибок (я открыл баг на это дело).
    Например, синтаксис корректный и R# ничего такого не показывает.
    Начинаешь редактировать, синтаксис ломается и R# начинает подсвечивать проблемы. Чинишь эту проблему, но R# по прежнему ее показывает. Компиляция при этом проходит без проблем.