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

В ReSharper C++ 2024.1 улучшена поддержка модулей C++20 и появилась навигация по исходящим вызовам с помощью функции Call Tracking. Расширенная помощь при написании кода включает в себя улучшенный рефакторинг Change Signature, обновленную поддержку документирующих комментариев и многое другое. Для разработчиков Unreal Engine в ReSharper C++ 2024.1 теперь доступны поддержка фреймворка Slate UI, а также автодополнение путей ассетов в коде C++.

Скачать

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

Поддержка модулей C++20

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

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

Unreal Engine

В ReSharper C++ 2024.1 добавлена поддержка фреймворка Slate UI для Unreal Engine. Встроенный инструмент форматирования и функции помощи при редактировании кода помогут отформатировать код Slate в соответствии с требованиями Unreal Engine. Такие функции, как Go to declaration, Find Usages и Rename, также были обновлены и теперь понимают синтаксис объявлений Slate.

Благодаря интеграции с возможностями Blueprints новая версия ReSharper C++ поддерживает добавление Core Redirects при переименовании экземпляра UENUM, а также автодополнение путей ассетов для имен ресурсов в коде C++.

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

Если вы хотите разрабатывать на Unreal Engine в отдельной кросс-платформенной IDE, обратите внимание на Rider. Поддержка Unreal Engine в Rider соответствует возможностям ReSharper C++, поэтому в Rider 2024.1 вас ждут такие же улучшения.

Исходящие вызовы в Call Tracking

В новой версии ReSharper функция Call Tracking поддерживает не только отслеживание входящих вызовов, как раньше, но и навигацию по всем цепочкам исходящих вызовов. Чтобы посмотреть исходящие вызовы, поместите курсор в любую функцию и выберите в контекстном меню пункт Inspect | Outgoing calls. Можно также нажать Ctrl+Shift+Alt+A, чтобы вызвать нужное действие из меню Inspect This.

Улучшения рефакторинга Change Signature

Теперь с помощью рефакторинга Change Signature удобно менять тип параметра функции: указатель, ссылка или значение. ReSharper автоматически обновит все использования параметра в теле функции и исправит ее аргументы в местах вызова, добавив при необходимости операторы разыменования и взятия адреса.

При вызове Change Signature для функции, у которой могут быть использования в зависимом коде, обновленный рефакторинг позволяет проверить изменения и указать, какие именно использования нужно обновить.

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

Другие важные изменения Change Signature:

  • улучшена обработка шаблонов функций с переменным числом аргументов;
  • правильно обновляются аргументы функций для мест вызовов внутри вызовов макросов;
  • теперь Change Signature сохраняет типы массивов и спецификатор типа int в типах unsigned int.

Документирующие комментарии

В новой версии можно настроить стиль генерируемых документирующих комментариев, при этом не придется редактировать шаблон Live Template. Это можно сделать в меню ReSharper Settings | Code editing | C++ | Code generation.

Начиная с версии 2023.3, в ReSharper используется новый инструмент проверки правописания и грамматики — JetBrains Grazie. В версии 2024.1 инспекции для проверки грамматики на основе Grazie стали доступны и в документирующих комментариях C++.

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

Анализ кода

По свежим данным, полученным в ходе широкого тестирования инструментов рефакторинга C++, которое проводил Ричард Томсон, ReSharper C++ по-прежнему опережает конкурентов, успешно проходя большинство тестов. Мы постоянно стремимся улучшить качество вариантов, предлагаемых нашим инструментом, и в ReSharper C++ 2024.1 мы устранили несколько проблем, которые Ричард нашел в ходе этого тестирования. Например, быстрое исправление Create constructor from usage теперь при необходимости добавляет конструктор по умолчанию.

Версия ReSharper C++ 2024.1 предлагает удалить избыточные идиоматические инциализаторы нуля при агрегированной инициализации. Несколько новых инспекций помогают найти разные проблемы с членами статических данных, например, избыточные спецификаторы inline в членах данных static constexpr.

Инструмент очистки кода Code cleanup добавляет новые элементы, чтобы удалить избыточные спецификаторы доступности и создать классы без наследников final. Функция Apply ‘auto’ style в новой версии обрабатывает не только локальные, но и глобальные переменные, а также члены классов.

Раньше, чтобы отключить выбранную инспекцию для определенной области доступа, можно было использовать специальные комментарии // ReSharper disable. ReSharper C++ 2024.1 распознает также комментарии NOLINT, NOLINTNEXTLINE и NOLINTBEGIN ... NOLINTEND, используемые clang-tidy.

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

В ReSharper C++ 2024.1 появилось несколько новых параметров форматирования:

  • Break line after goto labels и Indent goto labels улучшают форматирование выражений с метками;
  • настройки, управляющие переносом строк внутри перечислений в Arrangement of enumerations;
  • Empty braces formatting теперь включает в себя параметр Do not change.

При использовании конфигурации .clang-format инструмент форматирования ReSharper теперь учитывает настройки DisableFormat и IndentAccessModifiers. Кроме того, поддерживается встроенный в GNU стиль clang-format.

В свежей версии ReSharper тоже много нового.

Скачать

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

ReSharper C++ 2023.3

Официальная версия AI Assistant Публичный доступ

В ReSharper C++ теперь официально доступен JetBrains AI Assistant. Мы добавили ряд новых возможностей и улучшили уже известные функции, чтобы сделать вашу работу еще более эффективной. Обновления, сделанные в новой версии, позволяют лучше учитывать контекст проекта для действий на основе ИИ, а также включают в себя библиотеку подсказок.

Чтобы использовать AI Assistant как дополнительную функцию ReSharper C++, вам потребуется подписка JetBrains AI Service.

Обновления для HLSL и Unreal Engine

В HLSL 2021 появились C++-подобные шаблоны для функций и типов данных. В новой версии ReSharper C++ обеспечена полная поддержка шаблонов HLSL.

В ReSharper C++ 2023.3 теперь есть поддержка встроенного типа HLSL RayQuery и улучшена работа автодополнения кода для соответствующих флагов.

Новая инспекция поможет избежать распространенных ошибок, связанных с макросом помощника AddDynamic. Если функция динамического делегата не помечена макросом UFUNCTION, вы получите предупреждение.

Если вам временами еще приходится писать стереотипный код, помните, что сочетание клавиш Alt+Insert позволяет автоматически генерировать члены общего типа. В ReSharper C++ 2023.3 генерация хеш-функций настроена в соответствии с правилами Unreal Engine.

Если вы хотите разрабатывать на Unreal Engine в отдельной кросс-платформенной IDE, обратите внимание на Rider. Поддержка Unreal Engine в Rider соответствует возможностям ReSharper C++, поэтому в Rider 2023.3 вас ждут такие же улучшения.

Поддержка C и C++

Если вам иногда приходится проверять, доступен ли в текущей версии стандарта или компилятора определенный атрибут, вам пригодится проверка функций C++20. Используя __has_cpp_attribute(operand) в условиях препроцессинга, можно проверить, распознает ли компилятор атрибут, на который ссылается операнд. Новая версия ReSharper C++ корректно обрабатывает __has_cpp_attribute, и это позволило улучшить поддержку аннотаций атрибутов в стандартных библиотеках C++.

Мы добавили поддержку пакета pragma, используемого с ключевым словом __pragma. Синтаксис __pragma (pack) иногда используется в определениях макросов, поскольку там нельзя использовать директив #pragma. В подобных случаях ReSharper C++ теперь правильно вычисляет размер упакованных структур, и вы можете быть уверены в результатах анализа кода.

В ReSharper C++ добавлена поддержка некоторых функций C:

  • квалификатор типа C99 restrict, который можно использовать в объявлениях указателей;
  • выведение типов, constexpr и nullptr из C23.

Кроме того, мы добавили поддержку нескольких новых встроенных функций clang, например __is_const(), __is_member_pointer() и других, чтобы ReSharper C++ лучше работала с кросс-платформенным кодом.

Если вас интересует кросс-платформенная разработка на C и C++, рекомендуем ознакомиться с отдельной IDE CLion Nova, доступной по программе раннего доступа. Она создана на базе ReSharper C++ и на данный момент распространяется бесплатно: просто зарегистрируйтесь, начните писать код и не забудьте прислать нам отзыв!

Проверка правописания и грамматики

Новый инструмент проверки правописания и грамматики в ReSharper — JetBrains Grazie. Grazie поддерживает более 20 языков и находит как ошибки в естественных языках, так и в языках программирования, поддерживаемых ReSharper (C#, C++, VB.NET), языках разметки текста (HTML, XML, XAML) и комментариях. Добавить в Grazie другие естественные языки можно в меню ReSharper Options | Grammar and Spelling | General.

Обратите внимание, что проверка грамматики в комментариях doxygen в настоящее время недоступна.

Работа с неактивным кодом

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

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

Анализ кода

Вы можете использовать специальные атрибуты ReSharper в C++, чтобы анализ кода в ReSharper был точнее и полнее. В ReSharper C++ 2023.3 мы добавили помимо [[rscpp::...]] префикс [[jetbrains::...]] для существующих атрибутов [[jetbrains::format]], [[jetbrains::guard]] и [[jetbrains::has_side_effects]].

Новый атрибут [[jetbrains::pass_by_value]] позволяет отключить инспекцию Pass value by const reference для параметров функции. Подробнее

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

Мы обновили встроенный Clang-Tidy до версии Clang 17 — теперь он включает обновления из свежей версии LLVM.

Некоторые проверки Clang-Tidy выдают подробную информацию, помимо текста предупреждения. Новая версия ReSharper C++ показывает эти дополнительные сведения в виде подсказки.

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

Теперь ReSharper C++ предлагает быстрое исправление для удаления избыточных операторов условий и упрощения тернарных условных выражений.

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

Меню Generate, которое можно вызвать сочетанием клавиш Alt+Insert, помогает быстро сгенерировать стереотипный код. В ReSharper C++ 2023.3 добавлено новое действие для генерации деструкторов.

Если его вызвать в полиморфном классе, действие использует настройки стиля синтаксиса, чтобы вставить нужные спецификаторы virtual и (или) override. Стиль тела сгенерированного деструктора можно настроить на странице параметров Code Editing | C++ | Code Generation.

Директивы #pragma region и #pragma endregion позволяют указать сворачиваемый блок кода. Как и в случае с другими соответствующими директивами, перейти от одной к другой можно, вызвав действие Go to Declaration на директиве #pragma, или с помощью новой встроенной подсказки с именем региона.

Кроме того, в окне File Structure теперь можно легко свернуть регионы и перейти к соответствующим блокам кода.

В коде C следует использовать void в списке параметров функции, чтобы указать, что она не принимает никакие аргументы. Новая версия ReSharper C++ сохраняет этот специальный параметр void при вызове рефакторингов Extract method или Change signature, при генерации определения для функции или при создании новой функции из ее использования.

Встроенные подсказки ссылок теперь содержат отдельный текст [>>], чтобы перенаправляющие ссылки были сразу видны.

Новое действие Generate inline definitions помогает быстро сгенерировать тела для нескольких функций одновременно. Как и уже существующее действие Generate definitions, новое действие доступно, если выбрать в редакторе имя класса или несколько объявлений функций.

Когда вы вызываете рефакторинги Introduce parameter и Introduce field на вложенном выражении, новая версия ReSharper позволяет явно выбрать целевое выражение, а не автоматически применяет рефакторинг к внешней его части.

Для упрощения навигации по коду символы, появившиеся в результате макроподстановки, теперь будут скрыты в окнах Go to и File Structure. Это очень удобно, если макросы добавляют при раскрытии много дополнительных символов, например декларации тест-кейсов в популярных фреймворках юнит-тестирования.

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

В ReSharper C++ 2023.3 появилось несколько новых параметров форматирования:

  • разрыв строки перед -> в типах trailing return type;
  • разрыв строки после -> в типах trailing return type;
  • пробелы внутри пустых блоков;
  • возможность добавления комментариев после {.

Мы также обновили встроенный исполняемый файл clang-format до версии Clang 17 и реализовали поддержку настройки clang-format InsertNewlineAtEOF и при импорте настроек форматтера из конфигурационного файла .clang-format, и при использовании clang-format вместо встроенного форматтера.

В свежей версии ReSharper тоже много нового.

ReSharper C++ 2023.2

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 тоже много нового. Например, там появился предиктивный отладчик, который предвидит все возможные состояния, возникающие при выполнении программы, не прибегая к ее реальному выполнению.