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

В ReSharper C++ добавлен рефакторинг Safe Delete для безопасного удаления символов из исходного кода. Для современных проектов на C++ поддерживается ряд новых возможностей C++20 и C++23, включая модули стандартной библиотеки C++23. Также в этой версии появился встроенный помощник на основе искусственного интеллекта AI Assistant, который помогает решать каждодневные задачи.

Скачать

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

AI Assistant Ограниченный доступ

AI Assistant не встроен в ReSharper, его нужно устанавливать отдельно. Доступ к AI Assistant временно ограничен, и вы можете оказаться в листе ожидания.

Подробнее об AI Assistant и его установке через Toolbox App или установщик dotUltimate читайте в документации.

В ReSharper C++ 2023.2 появился встроенный помощник на основе искусственного интеллекта AI Assistant. Это чат-бот, специально разработанный для ответов на вопросы по программированию: он помогает находить проблемы в коде, выполнять рефакторинг, документировать код и решать другие каждодневные задачи.

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

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

Поддержка стандарта C++23

Выражение if consteval — это новый способ вычисления констант в C++23, который развивает идею consteval и std::is_constant_evaluated() из C++20. Если вычисление выражения if consteval происходит во время вычисления константы, то выполняется следующая составная конструкция. В противном случае выполняется ветвь else.

В ReSharper C++ добавлена поддержка if consteval и набор соответствующих инспекций:

  • consteval if всегда является константой;
  • std::is_constant_evaluated всегда вычисляется в константу;
  • if можно заменить на if consteval.

ReSharper C++ теперь поддерживает именованные модули std и std.compat, появившиеся в стандартной библиотеке C++23. Если вы работаете в Visual Studio 17.6 или более поздней версии, можете использовать import std или import std.compat, чтобы импортировать стандартную библиотеку целиком вместо использования прекомпилированного заголовочного файла или включения конкретных заголовочных файлов стандартной библиотеки.

До выхода C++23 все операторы должны были быть нестатическими функциями-членами класса. Однако операторы вызова часто используются с функциями-объектами без членов, и если позволить операторам в этом случае быть статическими, то можно повысить эффективность кода. В C++23 статическими могут быть как operator(), так и operator[].

Поддержка стандарта C++20

Мы активно работаем над улучшением поддержки модулей C++20, исправляя проблемы, которые возникают при работе над реальными проектами, использующими модули. При внутренней обработке модулей ReSharper C++ теперь отбрасывает объявления, которые не достижимы из других объявлений, что значительно повышает производительность модулей, включающих большое количество заголовочных файлов в глобальный фрагмент модуля.

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

Новый атрибут [[no_unique_address]] из в C++20 указывает, что для нестатического члена данных класса не требуется уникальный адрес, что позволяет компилятору более эффективно размещать члены класса. ReSharper C++ теперь учитывает [[no_unique_address]] при вычислении размера объекта.

ReSharper C++ 2023.2 также поддерживает недавно принятый отчет о дефекте C++20, который позволяет инициализировать массив char или unsigned char строковым литералом UTF-8.

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

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

Для вызова рефакторинга поместите курсор на символ, который нужно удалить, и нажмите Alt+Del или выберите Safe Delete в меню Refactor This.

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

Unreal Engine

В этой версии мы ускорили индексирование файлов Blueprints. При первом открытии проекта ReSharper C++ индексирует все ассеты Blueprint, чтобы вы могли пользоваться функцией Find Usages, а значения сериализованных данных показываются прямо в редакторе.

Раньше ассеты индексировались одновременно с кодом C++, поэтому подготовка проекта к работе занимала больше времени. ReSharper C++ 2023.2 индексирует ассеты в фоновом режиме после индексации C++-кода, не мешая вашей работе.

Мы улучшили умное автодополнение для типов-оберток со стандартной семантикой присваивания. Теперь при присваивании переменной типа TEnumAsByte автодополнение будет предлагать перечисляемые типы из базового переисляемого типа.

Для проектов Unreal Engine 5.1 добавлена поддержка макроса UE_INLINE_GENERATED_CPP_BY_NAME, который позволяет встраивать сгенерированные файлы в модуль для ускорения компиляции.

Помощь при написании кода

Благодаря улучшенному автодополнению зависимого кода вам будут предлагаться варианты автодополнения, когда тип ограничен концептом или признаком типа. ReSharper C++ теперь учитывает стандартные признаки типов std::is_same/std::is_base_of, их псевдонимы значений _v, соответствующие концепты std::same_as/std::derived_from и признак Unreal Engine TIsSame.

Чтобы предлагать наиболее подходящие варианты автодополнения, ReSharper C++ теперь также извлекает требования к типу и значению из условий requires, if constexpr и SFINAE.

Два новых взаимодополняющих контекстных действия помогают переместить ограничение параметров шаблона в условие requires и преобразовать условие requires в ограничение параметров шаблона.

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

В списке вариантов автодополнения зарезервированные идентификаторы теперь отфильтровываются и предлагаются только после _. Это значит, что больше не нужно пролистывать список вариантов из стандартных библиотек, если они не нужны.

В предыдущей версии мы реализовали правильную подсветку и форматирование макроподстановок в окне Quick Documentation и во всплывающих подсказках. В версии 2023.2 эти улучшения также будут работать для макроопределений и Parameter Info в автодополнении кода.

Механизм вычисления выражений теперь поддерживает агрегированную инициализацию массивов constexpr.

Улучшена совместимость с компиляторами GCC и Clang, а также стандартными библиотеками libc++/libstdc++. Мы поддержали больше встроенных конструкций, например __integer_pack и __is_convertible/__is_nothrow_convertible, и обновили поддержанные ранее.

Если вы указываете направление параметра с помощью атрибутов [in], [in,out] или [out] Doxygen-команды param, всплывающие подсказки теперь извлекают их из вашего комментария.

Анализ кода

В ReSharper C++ 2023.2 добавлена инспекция, которая обнаруживает избыточные операторы косвенного обращения и взятия адреса. Быстрые исправления помогут упростить доступ к членам и удалить лишние операторы.

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

Новая проверка совместимости предупреждает о предварительном объявлении перечислений в стиле C без базового типа, которое запрещено стандартом C++, но допустимо в MSVC, что может привести к появлению непортируемого кода.

ReSharper C++ теперь подсвечивает диагностические директивы препроцессора #error и #warning в соответствии с их уровнем серьезности.

Мы также обновили встроенный исполняемый файл до версии Clang 16, добавив новые проверки и исправления.

В зависимости от значения аргумента компилятора /Zc:preprocessor MSVC может использовать как традиционный, так и новый препроцессор, согласованный со стандартом. ReSharper C++ считывает значение этого аргумента из свойств проекта и соответствующим образом настраивает поведение встроенного препроцессора.

Навигация

ReSharper C++ 2023.2 содержит несколько улучшений в Go to declaration для более простой навигации по коду без лишних действий:

  • При вызове Go to declaration на имени класса в вызове конструктора навигация приведет вас к конструктору, а не к содержащему его классу.
  • Go to declaration теперь осуществляет переход к первому объявлению typedef или псевдонима, а не показывает меню со всеми объявлениями.
  • При вызове на имени модуля Go to declaration позволяет переключаться между блоками интерфейса и реализации этого модуля.
  • Вызов Go to declaration на папке в пути #include откроет эту папку.

Кроме того, для символов, не являющихся деклараторами, теперь доступно действие Type of symbol. Принцип его работы в этом случае аналогичен Go to declaration.

Форматирование и поддержка редактирования

При генерации документирующих комментариев ReSharper C++ приводит шаблон в соответствие стилю комментария в редакторе. Если в редакторе используется /**, комментарий будет сгенерирован в формате /** */, а если /// — в формате ///.

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

Мы добавили возможность отключить генерацию документирующих комментариев, чтобы избежать конфликтов со встроенным генератором Visual Studio (ReSharper | Options | Environment | Editor | Behavior | C++, C, HLSL | Generate documentation comments).

Мы также обновили встроенный исполняемый файл clang-format и внесли исправление в механизм clang-format: новая строка в конце файла больше не удаляется.

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

Скачать

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