В ReSharper 2023.1 улучшена поддержка C#, в том числе добавлен ряд инспекций для оптимизации и ускорения работы с разными типами коллекций, а также новые настраиваемые способы добавления в код проверок на null. Мы также обновили модули C++20, поддержали первую порцию возможностей C++23, а также добавили предварительный просмотр макроподстановки и отслеживание вызовов для C++. Кроме того, стало удобнее выполнять юнит-тестирование и очистку кода.
Новый набор инспекций с быстрыми исправлениями поможет оптимизировать и ускорить работу с разными типами коллекций за счет уменьшения количества объектов Lookup в коллекциях:
Contains(item) перед добавлением элемента в HashSet или другие коллекции, в которых реализован интерфейс ISet. ContainsKey(key) перед добавлением элемента в Dictionary или другие коллекции, в которых реализован интерфейс IDictionary.
TryAdd(key, value) для коллекций Dictionary или унаследованных от Dictionary. TryGetValue(key, out value) для коллекций IDictionary, когда это возможно.
Чтобы обеспечить единство стиля проверок not null в шаблонах, мы добавили новую настройку Syntax style. Она предлагает на выбор два варианта: пустой рекурсивный синтаксис шаблона { } и шаблон с отрицанием not null, при этом по умолчанию используется последний. Изменить настройки можно в любой момент на странице ReSharper | Options | Code Editing | C# | Syntax Style.
При использовании шаблона not null возникает одна сложность: в отличие от рекурсивного шаблона { LastName: { } lastName }, он не позволяет вставлять имена переменных в качестве проверяемого значения. Мы добавили контекстное действие Add pattern variable поверх шаблона not null, чтобы можно было найти выражения, которые получают доступ к тому же значению (поскольку мы вводим имя переменной), и заменить вновь введенным именем, консолидировав все случаи доступа к этому значению.
В .NET 6.0 SDK появился новый API для проверок на null: ArgumentNullException.ThrowIfNull. Наш движок анализа кода с самого начала распознавал этот вариант проверок, но использовать этот API в качестве стиля по умолчанию для проверок на null, проводимых ReSharper, было нельзя. В версии 2023.1 мы добавили в меню ReSharper | Options | Code Editing | C# | Null checking шаблон ArgumentNullException.ThrowIfNull.
Если вы активно используете сопоставление свойств с образцом, попробуйте новую инспекцию с быстрым исправлением для извлечения общих элементов из нескольких шаблонов свойств, когда они встречаются в потоке кода. Код, созданный с помощью быстрого исправления Extract common property pattern, поможет сократить количество повторений за счет переноса общих шаблонов свойств в шаблоны более высокого уровня.
Разработчики C# часто используют директиву #region и сворачивание кода в IDE, чтобы структурировать свой код. В результате рефакторинга некоторые директивы #region остаются пустыми, и код в свернутом виде может выглядеть странно. Новая инспекция позволяет найти пустые директивы #region в свернутом состоянии и применить быстрое исправление для очистки кода.
span.SequenceEqual(“str”) В анализ кода добавлена новая инспекция, которая предлагает заменить span.SequenceEqual("stringLiteral") на span is "stringLiteral" — более аккуратное и удобное синтаксическое решение в C#, чем вызов функции.
Лямбда-выражения в C# могут иметь неявно типизированные параметры и выведенные типы возвращаемых значений. Чтобы сделать код более понятным в сложных сценариях разрешения перегрузки, можно добавить явные типы. Начиная с версии C# 11, можно также добавить спецификацию типа возвращаемого значения в лямбда-выражения. Для этого мы добавили в ReSharper 2023.1 контекстное действие Insert return type specification. Его можно применять ко всем областям доступа, включая методы, классы, файлы, проекты и целые решения.
Шаблоны C# or/and/not удобно использовать для компактных проверок значений, но их сложнее распознать, чем такие традиционные выражения, как ||/&&/!. Кроме того, если пропущены скобки, они могут стать причиной ошибок, которые трудно найти. Чтобы с этим было легче справиться, мы добавили в версии 2023.1 новую возможность анализа кода, которая предупреждает о «мертвых» проверках в сложных шаблонах.
Мы продолжаем улучшать поддержку шаблонов списков C# 11. С помощью нового контекстного действия Convert to list pattern можно превратить проверки длины коллекции в шаблон списка. Действие можно использовать в любом контексте, допускающем проверку длины коллекции.
Наведя курсор на макрос, можно увидеть в окне подсказки раскрытие макроса с полной подсветкой синтаксиса и правильным форматированием кода. Раскрытие макроса можно, как и раньше, посмотреть прямо в коде с помощью контекстного действия Substitute macro call, но быстрое превью упрощает работу с макросами. Кроме того, во всплывающем окне быстрого просмотра документации (Ctrl+Shift+F1) можно посмотреть документацию по любому объекту из превью подстановки, просто щелкнув по этому объекту.
В ReSharper C++ появилась долгожданная функция Call tracking. Теперь можно просматривать цепочки вызовов в иерархии входящих вызовов и переходить по ним. В окне результатов отслеживания вызовов можно дважды щелкнуть по пункту иерархии, чтобы перейти к нужному вызову, или развернуть любой узел и посмотреть входящие в него вызовы.
Мы переработали диалог обновлений, в котором описываются изменения, вошедшие в последнюю сборку. Это поможет вам принять решение о том, стоит ли устанавливать обновление или можно его пропустить.
Reformat inactive preprocessor branches in file — это новый тип задания в ReSharper 2023.1. Задание позволяет переформатировать неактивные ветки препроцессинга. Его можно применять только ко всему файлу сразу и оно доступно только для исходных файлов на C#.
Задание не может менять форматирование кода, скрытого за директивой препроцессора #if, которая всегда ложна. Вот два наиболее очевидных примера этого ограничения: #if false ... #endif и #define A #if !A ... #endif.
Фильтры текстового поиска, применяемые к деревьям юнит-тестов в окнах Session и Explorer, теперь учитываются при запуске тестов с помощью кнопок запуска на панели инструментов. В списки включаются и затем выполняются только тесты, удовлетворяющие критериям поиска.
Мы улучшили процедуру переименования файлов в проекте. Начиная с этой сборки, при переименовании файла внутри решения будет появляться диалог с возможностью переименования всех связанных символов (классов, интерфейсов и т. д.) в соответствии с изменениями.
Теперь, если API, к которым обращаются плагины ReSharper, остаются неизменными и корректно работают, миграция плагинов с одной версии на другую осуществляется автоматически.
Встроенный инструмент проверки API проверит совместимость установленных плагинов на уровне двоичного кода и выполнит миграцию подходящих. Если API, используемый плагином, больше недоступен в SDK, создатель плагина получит автоматическое уведомление из JetBrains Marketplace.
Поскольку CSS редко используется в ReSharper, мы сочли нерациональным уделять много внимания поддержке новых версий языка. Поэтому поддержка CSS была приостановлена, пока мы не найдем более удобный способ поддержки этого языка.
Начиная с версии 2023.1, поддержка CSS будет по умолчанию отключена. Если вы все-таки хотите использовать этот язык, ее можно включить в меню ReSharper | Options | Environment | Products & Features, выбрав параметр CSS.
В настоящее время ReSharper и .NET Tools поддерживают 7 основных версий Visual Studio: с 2010 до самой новой — 2022. Начиная с версии 2023.1, этот список будет сокращен: мы прекращаем поддержку двух самых старых версий — Visual Studio 2010 и Visual Studio 2012.