Что нового в ReSharper 2021.3

Новая версия ReSharper совместима с Visual Studio 2022! Мы улучшили поддержку C# 10 — добавили пространства имен на уровне файлов директивы global using, новые возможности работы с NRT и многое другое. Также мы добавили новые значки на поля редактора, улучшили возможность Copy Code Reference и поддержали действие Find Usages для пользовательских операторов неявного преобразования.

Скачать

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

Поддержка Visual Studio 2022

ReSharper 2021.3 поддерживает релизную сборку Visual Studio 2022. Это значит, что вы сможете пользоваться привычным набором функций Visual Studio. Поскольку Visual Studio 2022 является 64-разрядным приложением, ReSharper может использовать любое количество оперативной памяти и работать быстрее.

Чтобы пользоваться ReSharper с новой версией Visual Studio, при установке dotUltimate 2021.3 выберите опцию VS2022.

C# 10

Не так давно вышел C# 10, и мы продолжаем расширять его поддержку. В новой версии мы поддержали пространства имен на уровне файла, директиву global using, атрибут CallerArgumentExpression, а также обработчики интерполированных строк и лямбды C# 10.

Начнем с пространств имен на уровне файла. Мы поддержали соответсвующий синтаксис, а также добавили для него настройки стиля (ReSharper | Options | Code Editing | C# | Syntax Style | Code body | Namespaces). Как только вы выберете стиль, ReSharper укажет на код, требующий изменений, и предложит быстрые исправления. Вы сможете в один клик применить изменения ко всему проекту или решению.

Также мы добавили два контекстных действия, позволяющих вернуть прежний стиль синтаксиса: Convert to file-scoped namespace и Convert to block-scoped namespace.

Подробнее о поддержке пространств имен на уровне файла читайте в нашем блоге

Перейдем к директивам global using. Теперь при анализе кода ReSharper учитывает директивы using, отмеченные ключевым словом global, и использует эти данные для разрешения символов во всех файлах проекта. ReSharper уведомит вас, если директива global using располагается в неправильном месте.

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

Мы добавили расширенную поддержку атрибута CallerArgumentExpression, включая автодополнение кода и инспекции.

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

C# 10 вводит понятие обработчиков интерполированных строк. Выражения с интерполированными строками будут работать быстрее в .NET 6, а обработчики позволят использовать значения Span<char>, чтобы заполнить интерполяцию. Те, кто пишет свои библиотеки, смогут использовать обработчики для того, чтобы следить за преобразованием интерполированных выражений в строки. ReSharper 2021.3 распознает обработчики интерполированных строк в библиотечном коде и предлагает безопасно вводить интерполяцию строк в других местах.

Чтобы объекты record struct работали быстрее, ReSharper предложит отметить их ключевым словом readonly. Чтобы лишний раз не перегружать объявления типов различными модификаторами, эта инспекция будет предложена только тогда, когда тип record содержит члены экземпляра без мутации, а во всем решении нет мутации через сеттеры (чтобы определить это, необходимо включить SWEA).

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

Мы добавили в ReSharper соответствующую инспекцию, быстрое исправление, а также контекстное действие для отмены быстрого исправления.

А еще:

  • Мы улучшили поддержку лямбд C# 10 — вы не столкнетесь с ложноположительными ошибками и красной подсветкой в проектах .NET 6 Minimal API. Также ReSharper подскажет, какой синтаксис использовать, и добавит скобки там, где это необходимо для компиляции.
  • Теперь ReSharper разрешает генерировать класс с именем «Program», позволяющий выполнять операторы верхнего уровня.
  • Мы добавили базовую поддержку членов интерфейса static abstract. Теперь такие конструкции учитываются при анализе кода и не подсвечиваются красным. Также они учитываются при генерации отсутствующих членов. Кроме того, в этой версии появились соответсвующие отметки на полях редактора и возможность навигации к базовым/производным символам.

Cсылочные типы, допускающие значение null

Люди часто используют код из внешних источников, например c сайта stackoverflow.com. В последнее время в примерах кода из интернета все чаще используется синтаксис NRT (cсылочных типов, допускающих значение null). Но что, если ваше решение не поддерживает NRT? Мы добавили два быстрых исправления, которые позволяют избавиться от синтаксиса NRT при вставке такого кода в проект: Replace with JetBrains.Annotations attributes и Remove nullable annotations without ‘#nullable’ context.

Время от времени соответствие аргументов типов ограничениям допустимости значения null может нарушаться. Мы добавили ряд быстрых исправлений, позволяющих:

  • убрать аннотации допустимости значения null из аргументов типа;
  • убрать ограничения notnull из аргументов типа;
  • разрешить использование значений, допускающих null, в параметрах типов;
  • запретить использование значений, допускающих null, в параметрах типов, которые используются в качестве аргументов типов.

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

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

Анализ кода

Мы добавили несколько быстрых исправлений и контекстное действие для статических локальных/анонимных функций с замыканиями:

  • Используйте быстрое исправление Allow closures, чтобы убрать модификаторы static из локальной/анонимной функции, содержащей замыкания.
  • Используйте быстрое исправление Pass closure as a parameter, чтобы добавить замыкание в параметры статической локальной функции.
  • Используйте контекстное действие Pass closure as a parameter, чтобы добавить замыкание в параметры нестатической локальной функции.

Новая инспекция Simplify string interpolation и соответствующее быстрое исправление позволяют заменить вызовы методов .PadLeft() и .PadRight() на выравнивание в плейсхолдерах внутри интерполированных строк.

Помимо добавления типа record struct (C# 10) мы улучшили поддержку обычных структур. Многие разработчики все еще используют для DTO классы с инициализаторами объекта. Теперь вы можете быстро преобразовывать их в конструкторы с параметрами. Это можно сделать непосредственно в объявлении record или в любом инициализаторе объекта. Также вы можете преобразовывать DTO, которые задают конструктор, включающий инициализацию свойств.

Некоторое время назад ReSharper начал уведомлять о нарушениях консистентности при блокировке полей. В этой версии мы добавили инспекцию, которая учитывает порядок блокировки ресурсов и сообщает о возможных deadlock-циклах.

Мы добавили проверку целесообразности выполнения целочисленных арифметических операций для типов byte, sbyte, short, ushort, uint, long, ulong и enum. Они помогут вам устранить недостижимый код.

Чтобы длинные и сложные условия было проще читать, ReSharper теперь подсвечивает группы логических операторов (например цепочки && и || в C#).

Ускоренный анализ кода

Выполнение быстрых исправлений и контекстных действий для папок, проектов и решений занимает меньше времени.

Если вы включите Solution-Wide Error Analysis (SWEA) и отслеживание предупреждений (Monitor warnings), то сможете значительно ускорить поиск ошибок, которые нужно исправить: используя результаты SWEA, ReSharper отфильтрует файлы и оставит для рассмотрения только те, в которых были найдены ошибки.

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

 

Анализ кода для файлов с объемными методами стал работать намного быстрее. К объемным методам относятся:

  • методы с большими или вложенными условиями, кортежами или выражениями switch;
  • методы с большим количеством проверок (если cсылочные типы, допускающие значение null, не разрешены);
  • методы с частым использованием индексаторов (если cсылочные типы, допускающие значение null, разрешены);
  • методы с огромным количеством замыканий (если cсылочные типы, допускающие значение null, разрешены).

Навигация и поиск использований

Новые значки на полях редактора

На полях редактора появились новые значки, позволяющие перемещаться по иерархии наследования класса, интерфейса или структуры. Значки ↑O/↑I указывают на наследование/реализацию сущностью другого класса или интерфейса. Если иерархия наследования сложнее, нажмите на значок — в открывшемся меню будут перечислены все предки (полная иерархия). Если класс одновременно реализует/наследует и интерфейс, и класс, на полях редактора отобразится значок ↑IO.

Теперь ReSharper по умолчанию отмечает на полях члены классов. Если член класса переопределяется в производных классах, напротив него на полях редактора слева отобразится значок ↓O. Нажмите на значок, чтобы:

  • перейти к переопределяющему члену производного класса,
  • просмотреть список других переопределяющих членов классов.

Действие Find Usages для пользовательских операторов неявного преобразования

Теперь действие Find Usages работает для операторов неявного преобразования, заданных пользователем. Для этого используется тот же механизм, что и для подсказок при преобразовании типов.

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

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

Переход к реализациям интерфейса во время отладки

Если при отладке вы вызовите действие Go to Type of Symbol для переменной или параметра типа интерфейса, то перейдете не к объявлению интерфейса, а к той реализации, которая используется в текущем фрейме.

Языковые вставки

Теперь любые параметры, поля и свойства функции можно отмечать атрибутом [LanguageInjection], означающим, что строковое значение данной сущности написано на другом языке. Вы можете добавлять фрагменты кода на CSS, HTML, JavaScript, JSON и XML. Как только вы укажете атрибут, для фрагмента кода заработает подсветка синтаксиса, автодополнение и другие возможности. Чтобы пользоваться атрибутом LanguageInjection, добавьте в проект последнюю версию JetBrains.Annotations.

Copy Code Reference

Мы значительно изменили возможность Copy FQN. Теперь она называется Copy Code Reference: такое название лучше отражает смысл.

Если в качестве системы контроля версий выбран Git, при использовании Copy Code Reference вам будут доступны дополнительные возможности. Для проектов, клонированных из GitHub, во всплывающем окне Copy Code Reference отобразятся специальные опции: они позволят сгенерировать правильную ссылку на GitHub-репозиторий, и вы сможете сразу ею поделиться.

Для других репозиториев в настройках ReSharper можно добавить шаблоны для URI. Эти шаблоны будут отображаться во всплывающем окне Copy Code Reference. В шаблон для URI можно включать плейсхолдеры: Current Branch Name, File Name, Current Line Number и другие.

Также мы значительно изменили интерфейс окна, включая структуру, значки и форматирование.

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

  • Теперь вы можете настроить отступы перед скобками для лямбд и паттернов свойств внутри условий операторов (if(), while() и др.).
  • Вы можете настроить выравнивание условий внутри скобок для if(), foreach() и др. Возможность включена по умолчанию.
  • Также для бинарных паттернов можно настроить обертку, выравнивание, отрицательные отступы и удаление последнего символа. Пример: x is Foo or Bar or Baz.

Создание новых классов Unreal Engine

Шаблоны файлов Unreal Engine позволят создавать классы, не переключаясь в Unreal Editor. Вы найдете их в списке шаблонов ReSharper.

Чтобы создать новый класс, зайдите в Solution Explorer, кликните правой кнопкой мыши по нужной папке и откройте меню Add (либо нажмите Ctrl+Alt+Insert). Выберите любой шаблон Unreal Engine из списка и укажите название нового класса — ReSharper C++ сам создаст все заголовочные и исходные файлы с шаблонным кодом, распределив их по папкам в соответствии с нужным уровнем доступа (public/private).

Что нового в ReSharper C++ 2021.3

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

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

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

Что нового в ReSharper C++ 2021.3

Поддержка файлов AnalyzerConfig

Начиная с .NET 5 SDK для настройки анализатора Visual Studio можно использовать глобальные файлы AnalyzerConfig. ReSharper 2021.3 считывает из них информацию о стиле кода и соответствующим образом редактирует правила ReSharper.

Семплированные данные о распределении памяти dotUltimate

Теперь dotMemory может собирать семплированные данные о распределении памяти на основе событий ETW. Семплирование уступает в точности традиционному статистическому методу сбора данных о распределении памяти, но имеет ряд преимуществ:

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

Обратите внимание, что эта возможность доступна только на Windows.

Что нового в dotMemory 2021.3

Скачать

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