Что нового в ReSharper 2020.3

ReSharper 2020.3 поддерживает новые возможности C# 9, представляет новую концепцию встроенных подсказок, реализует поддержку Avalonia, подключает динамический анализ программ, а также предоставляет множество мелких обновлений, которые помогут вам в повседневной работе.

Скачать

Доступна бесплатная пробная версия на 30 дней

Поддержка C#

Появление генераторов кода в компиляторе C# стало одной из самых обсуждаемых новостей. И действительно, возможность генерировать код прямо во время компиляции и тут же применять его — может быть чрезвычайно полезна в целом ряде ситуаций.

А что же ReSharper? Resharper продолжает делать то, что умеет лучше всего, — прекрасно поддерживать новые возможности. Новая версия Resharper учитывает сгенерированные файлы в своих рефакторингах, помогает вам в навигации по ним, и, конечно же, оснащает новыми полезными возможностями редактор кода.

Частичные методы теперь могут иметь выходные параметры и любой модификатор доступа. Также они теперь могут возвращать значения, отличные от void, — что позволяет применять их при генерации кода. Включив определяющее объявление частичного метода в генератор кода, вы можете настроить желаемым образом его поведение.

Еще одна новая возможность — свойства init-only. Задать значения таким свойствам можно только в ходе инициализации объекта. А значит, вы наконец можете использовать инициализаторы объектов, не прописывая свойства как mutable.

ReSharper знает свойства init-only и учитывает их, когда выполняет генеративное автодополнение, анализирует, было ли свойство изменено, и предлагает быстрое исправление на случай, если вы передумали.

Свойства init удобно применять для типов record. Это ссылочные типы с семантикой значений, которые позволяют обеспечить неизменяемость. В данном случае неизменяемым станет весь объект. ReSharper же со своей стороны обеспечивает всей необходимой поддержкой — от быстрых исправлений, позволяющих выбрать стиль объявлений, до базового автодополнения.

У позиционных записей есть метод Deconstruct(), сгенерированный компилятором. Для таких объектов в ReSharper доступны все типы деконструкции. Когда вы объявите переменную, появится окно, предлагающее выбрать между одиночной переменной и объявлением деконструкции. То же самое произойдет, если вы запросите из функции свойство record-объекта.

Также есть ряд менее крупных изменений. Для локальных функций теперь разрешены атрибуты, а также параметры и параметры типов. Быстрые исправления ReSharper уже поддерживают это. Также вы можете добавлять методам аннотацию [NotNull] и [CanBeNull] при помощи ! и ? соответственно.

Новые возможности C# 9 позволяют писать высокоуровневые программы. Теперь вам не придется воевать с классами Program — код точки входа можно разместить сразу после директив using. Также Rider помогает в работе с операторами верхнего уровня. Для этих операторов есть два правила: во-первых, они должны предшествовать любым типам и пространствам имен; во-вторых, только один файл в проекте может содержать код верхнего уровня. Оба правила легко нарушить при реорганизации кода. Чтобы не допустить этого, ReSharper предлагает специальные быстрые исправления, которые переставляют код верхнего уровня в начало файла либо переносят его в отдельный файл.

Код верхнего уровня — это тоже код, и у Resharper также есть для него рефакторинги: Extract local variable и Extract method.

С C# 9 появляется возможность target-typing, позволяющая не указывать тип после оператора new — вместо этого он будет автоматически определен из контекста. ReSharper полностью поддерживает эту возможность языка, в том числе позволяя вам просматривать все использования конструктора (при помощи действия Find Usages) и выбирать предпочитаемый стиль синтаксиса. Последнее позволяет вам использовать синтаксис new(), если тип очевиден, либо указать типы явно в остальных случаях.

Если же использование new() выйдет из-под контроля, вы всегда можете воспользоваться нашими специальными подсказками для типов.

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

Новая версия языка улучшает возможности сопоставления с образцами (паттернами). Задавая образцы, вы теперь можете использовать отношения (, и т. д.) и логические паттерны (not, or, and) — это намного проще, чем применять старые конструкции switch. ReSharper поможет вам проанализировать паттерны и переписать их в желаемом стиле.

Также мы добавили быстрое исправление для новых параметров discard в лямбда-выражениях.

Это были главные обновления языка. Есть ряд более мелких, и мы также поддержали их в ReSharper 2020.3. Они включают target-typing для условий, статические лямбды, методы расширения GetEnumerator для foreach, указатели на функции и нативные целочисленные типы.

Встроенные подсказки

Встроенные подсказки довольно удобны, однако важно, чтобы они визуально не перегружали интерфейс. И мы придумали неплохой компромисс — механизм «Push-to-Hint».

В режиме Push-to-Hint встроенные подсказки по умолчанию не показываются. Просмотреть подсказку можно удерживая клавишу Ctrl (как только вы ее отпустите, подсказка исчезнет) либо двойным нажатием Ctrl (чтобы убрать подсказку, вам нужно будет снова дважды нажать Ctrl).

Перейдя в настройки, вы можете указать ReSharper, какие подсказки должны отображаться сами, какие — только по нажатию, а какие и вовсе можно скрыть. Используйте настройку «Visibility» для каждого вида подсказок.

Также появились подсказки для неявного приведения типов. Неявное приведение типов порой приводит к ухудшению производительности. ReSharper укажет вам на случаи неявного приведения типов в вашем коде.

Выполните Ctrl+Click для такой подсказки, и вы перейдете непосредственно к реализации неявного преобразования.

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

Форматирование

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

Через настройки паттернов для свойств вы можете указать ReSharper, чтобы он размещал простые паттерны на отдельных строках и определенным образом оформлял длинные паттерны. Также вы можете настроить выравнивание паттернов свойств в столбцы.

IDE может сама добавлять пустые строки до и после аксессоров свойств и событий.

Для Visual Basic .NET есть возможность добавлять пробел после унарного оператора +/-.

Также мы обновили поддержку .editorconfig. Мы поддержали чтение свойств Roslyn: file_header_templates, dotnet_sort_system_directives_first и dotnet_separate_import_directive_groups.

При экспорте в .editorconfig теперь есть новый параметр «Spaces around ‘=’». Для существующих файлов его значение определяется автоматически, а для новых файлов его можно прописать вручную. По умолчанию используется значение «true».

Динамический анализ программы

В ReSharper появилась возможность динамического анализа программ (DPA). С помощью него вы можете анализировать код и улучшать его, выявляя замыкания и выделение памяти в кучах малых и больших объектов.

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

Подробнее о DPA читайте в нашем блоге.

Структурное удаление

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

При использовании действий Extend и Shrink Selection важно не забывать добавлять запятую, точку или скобку. А удаление кода привело бы к ошибке. Чтобы помочь вам, ReSharper готов сам выполнить небольшую чистку: если вы выделили конструкцию в коде структурно и нажали Backspace или Delete, IDE постарается удалить ее тоже структурно.

Инструменты командной строки

Когда вы работаете с объемной кодовой базой, каждая операция, выполняемая на уровне решения, занимает долгое время. Бывало ли, что вы меняли всего несколько файлов и вам приходилось ждать переформатирования всего решения? Теперь вы можете запускать из консоли CleanupCode, не указывая на файл решения — просто укажите нужный набор файлов и папок. Команда выглядит так: cleanupcode.exe [Path to folder] [Path to file] [Path to another file]

Обращаем ваше внимание, что в этом режиме инструмент выполняет только форматирование и ничего не чистит.

Еще одна вещь, которой некоторое время не хватало среди наших консольных инструментов, это поддержка плагинов. Но она вернулась! Правда на данный момент она доступна только для Windows. Чтобы настроить использование плагина из консоли, вам нужно знать его ID. Зайдите на JetBrains Marketplace, откройте страницу плагинов и перейдите в раздел Versions. Нажмите на любую из версий, и скопируйте ID плагина. Далее запустите InspectCode или CleanupCode, указав -x=[ID] и ID плагина — инструмент автоматически загрузит и подключит плагин. Команда выглядит так: cleanupcode.exe -x=[ID] [Path to solution file].

Обращаем ваше внимание, что плагин должен быть совместим с версией консольного инструмента. Also, plugins are not yet supported if you’re using the .NET Core global tools mechanism to install ReSharper’s command line tools.

Навигация

Бывало ли вам трудно искать строки? Возможно, вы искали определенную строку в коде или комментарий, и не могли ничего найти из-за простой опечатки?

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

Поддержка Avalonia

Анализ кода

Как и полагается WPF-фреймворку, Resharper умеет анализировать код и предлагает множество различных инспекций и быстрых исправлений — как для выделенного кода C#, так и для файлов .axaml, содержащих “Possible ‘System.NullReferenceException’” и “Class/Property {...} is obsolete: Use {...}”.

Помимо обычных WPF-инспекций есть множество инспекций, специфичных для Avalonia, например, Path to resource is case-sensitive. Инспекция ColumnDefinitions tag can be converted to attribute предлагает контекстное действие для атрибута ColumnDefinitions="*,Auto,*", позволяющее конвертировать его обратно в тег <Grid.ColumnDefinitions>.

В Resharper 2020.3 мы обновили поддержку синтаксиса связывания ("$self", "$parent", "^" и "#"), а также улучшили проверку индексов в массиве $parent[].

Также предлагается расширенная поддержка CompiledBinding и расширения x:CompileBindings. В частности, ReSharper проследит, чтобы вы указывали для привязок DataType.

Для множества свойств Avalonia доступно быстрое исправление «Create from usage».

Поддержка XAML Avalonia теперь включает понимание системы стилей по типу CSS.

Ну и не забывайте про встроенные подсказки! Они всегда помогут разобраться в коде.

Автодополнение

Возможности автодополнения и просмотра информации о параметрах доступны для всех ключевых слов XAML, а также для расширений разметки, свойств x:Name, Style, свойств Source для StyleInclude и др.

Навигация

Вы можете легко переходить к скомпилированным типам связывания данных, типам элементов управления Avalonia и объявлениям x:Name. ReSharper также позволяет переходить напрямую от XAML к декомпилированному внешнему коду, в том числе к свойствам сеттеров стилей и указанным пространствам имен xmlns.

Find Usages (поиск использований)

С помощью действия Find usages вы теперь можете искать в коде связывание методов, а также использование атрибутов x:Name, классов и сеттеров Style и множества других свойств.

Рефакторинги

Рефакторинги Rename и Safe Delete теперь знакомы со множеством сценариев использования XAML-кода Avalonia и способны срабатывать точнее.

Иерархия и структура кода

Теперь вам доступно наглядное представление иерархии и структуры XAML-кода Avalonia.

Обновления декомпилятора

Интегрированный декомпилятор ReSharper теперь поддерживает больше возможностей C#. Также мы улучшили механизм синхронизации между IL Viewer и исходным кодом.

Специально для операторов верхнего уровня мы добавили в Assembly Explorer узел <Top-level Entry Point>. Нажав по нему дважды либо вызвав контекстное меню, вы перейдете к операторам верхнего уровня в декомпилированном коде.

Resharper теперь поддерживает Private Source Link. Перейдя к внешним источникам, требующим подключения к частными серверами с исходным кодом, вы получите уведомление и сможете ввести данные вашей учетной записи (если вы используете GitHub или BitBucket и уже указывали данные для авторизации в настройках Visual Studio, Resharper применит их автоматически).

Blazor

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

Отличный компаньон Unreal Engine

Unreal Engine

ReSharper C++ 2020.3 обеспечивает интеграцию с UnrealHeaderTool — это позволяет отлавливать ошибки, которые обычно обнаруживаются только во время компиляции. ReSharper C++ запускает UnrealHeaderTool в фоновом режиме и сразу отображает результаты прямо в редакторе.

Чтобы улучшить поддержку HLSL, мы добавили в ReSharper C++ инспекции для анализа потока управления в файлах шейдеров. Отслеживание изменений в конфигурациях сборки позволяет ReSharper всегда использовать только самую свежую проектную модель.

Подробнее

Расширенная поддержка C++20

C++20

ReSharper C++ 2020.3 реализует новые правила сравнения C++20. Инспекции и сообщения об ошибках помогут вам понять, как ведет себя ваш код, а быстрые исправления облегчат работу с операторами сравнения.

Кроме того, мы добавили в ReSharper C++ 2020.3 новые инспекции для работы с библиотекой Ranges и поддержали стандартный режим корутин C++20, впервые появившийся в Visual Studio 16.8.

Подробнее

Инспекции для хронологического графика dotUltimate

Инспекции для хронологического графика

dotMemory использует хронологические данные для предоставления автоматических инспекций прямо в графике «Timeline».

На данный момент доступны три инспекции:

  • Высокое давление на память (сборка мусора)
  • Закрепленные объекты в Gen0
  • Быстрый рост кучи больших объектов

Подробнее

Улучшения для непрерывного тестирования dotUltimate

Улучшения для непрерывного тестирования

Теперь вы можете указать IDE, какие проекты необходимо собирать при запуске сессии непрерывного тестирования. Таким образом вы можете ускорить их. Функциональность доступна и в Visual Studio, и в Rider.

Подробнее

Другие улучшения

  • Мы добавили поддержку nullable-аннотаций для обобщенных типов, не ограниченных ссылочными типами и типами значений, а также поддержали ограничение default.
  • Небольшое обновление для TypeScript — поддержка nullish coalescing и optional chaining.
  • Появилось новое быстрое исправление, позволяющее переходить от проверки последовательных шаблонов к более сложным проверкам сравнения шаблонов.
  • Что касается рефакторинга Change Signature, мы обновили инструмент, используемый при выборе «Resolve with call tree» (для указания значений параметров по умолчанию). Навигацию теперь можно выполнить двойным кликом по узлу. Появилась новая опция «Create default parameter», позволяющая сразу перейти в нужное место для указания значения. Кроме того, разные изменения в дереве теперь окрашиваются в разные цвета. Надеемся, это упростит процедуру изменения сигнатуры.
Скачать

Доступна бесплатная пробная версия на 30 дней