News Releases

ReSharper C++ 2021.2: подсказки при преобразовании типов, инспекции для неизменяемых данных, рефакторинг Inline Function

Read this post in other languages:
English

ReSharper C++ 2021.2 теперь доступен для скачивания! В этом релизе мы добавили новые встроенные подсказки для скрытых преобразований типов, рефакторинг Inline Function и расширенную поддержку Unreal Engine. Также мы пополнили список инспекций для модернизации кода в соответствии с современными стандартами C++ и доработали анализ неизменяемых данных, что позволит сделать код более правильным и удобным для чтения.

ReSharper C++ 2021.2

Обновиться или попробовать бесплатную 30-дневную версию можно уже сегодня. Переходите на наш сайт или воспользуйтесь приложением Toolbox App, с помощью которого можно скачать все наши инструменты для Visual Studio.

СКАЧАТЬ RESHARPER C++ 2021.2

Ниже мы расскажем подробнее обо всех новых возможностях и улучшениях в 2021.2:

Подсказки при преобразовании типов

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

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

Подсказки для преобразования типов при агрегированной инициализации

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

Подсказка для преобразования встроенных типов

По умолчанию подсказки для стандартных преобразований выключены. Чтобы их включить, перейдите в настройки ReSharper Environment | Inlay Hints | C++ | Type Conversion Hints.

Кроме того, подсказки для преобразования определенного класса можно спрятать, добавив их в список исключений. Также можно выбрать отображение подсказок в виде специальной иконки или кода. Для вызова этих настроек через контекстное меню воспользуйтесь горячими клавишами Alt+Enter или правой кнопкой мыши.

Список исключений для подсказок с преобразованием типов

Подробнее о подсказках при преобразовании типов можно узнать из этой статьи в нашем блоге.

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

Новый рефакторинг Inline Function позволяет быстро заменить вызов функции телом этой функции. Чтобы запустить его, поместите каретку на вызов функции, откройте меню Refactor This и выберите Inline Function. Также вы можете запустить рефакторинг из главного меню: ReSharper | Refactor | Inline.

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

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

Инспекции для неизменяемых данных

В ReSharper C++ 2021.2 мы улучшили анализ неизменяемых данных и добавили две новые инспекции, покрывающие оставшиеся правила раздела Constants and immutability в «C++ Core Guidelines».

  • Первая инспекция анализирует на предмет неизменяемости параметры функций, представляющие собой ссылку или указатель. ReSharper C++ сообщит вам о возможности передать указатель или ссылку на const, которая гарантирует, что функция не изменит соответствующий аргумент.
    Параметр можно сделать константной ссылкой
  • Вторая инспекция предложит вам отметить спецификатором constexpr переменные, которые могут быть вычислены при компиляции. Это позволит повысить производительность кода и качество проверок при компиляции.
    Значение, вычисляемое во время компиляции, можно сделать constexpr

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

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

Генерация кода

Какие настройки по умолчанию вы хотели бы использовать при генерации функций? Мы постарались сделать генерацию кода еще более удобной и добавили возможность настраивать способ определения генерируемых функций. Настроить это можно в меню ReSharper Code Editing | C++ | Code Generation.

Code Editing | C++ | Code Generation

По умолчанию ReSharper C++ генерирует функции с пустым телом. Теперь, с появлением настройки Default function body, можно указать, должны ли сгенерированные функции кидать std::logic_error, возвращать значение по умолчанию или включать некомпилируемый код.
Сгенерированная функция кидает std::logic_error

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

Также ReSharper C++ умеет создавать стандартные реализации операторов в виде вызова соответствующих операторов.
Генерация стандартной реализации оператора

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

Unreal Engine

В ReSharper C++ 2021.2 появилась полная поддержка Unreal Engine 5! Используйте раннее превью UE5 и получайте все те же возможности для работы с кодом Unreal Engine, что и в существующих проектах на UE4.

Новые возможности в автодополнении и анализе кода позволят вам более эффективно работать с модулями и плагинами:

  • Теперь при вызове автодополнения в файлах .Build.cs и .Target.cs проекта Unreal Engine ReSharper C++ также показывает список доступных модулей и плагинов.
    Автодополнение для имен модулей и плагинов
  • Новая инспекция подсвечивает места в коде, где нет ссылки на необходимые модули и плагины. Добавить нужный заголовок или новые модули и плагины в файл .uproject или .uplugin можно с помощью соответствующих быстрых исправлений.
    Добавление недостающей зависимости (плагина)

Благодаря улучшенной генерации функций ReSharper C++ теперь добавляет в тело переопределяющей функции вызов переопределенной функции, используя стандартный вызов Super.
Использование псевдонима Unreal Engine Super в теле сгенерированной функции

Мы оптимизировали производительность и потребление памяти при холодном запуске. Теперь ReSharper C++ индексирует кодовую базу Unreal Engine на 10% быстрее.

Инспекции для обновления кода

ReSharper C++ 2021.2 пополняет список инспекций для обновления кода в соответствии с современными стандартами:

  • Использование структурного связывания вместо tie(..): начиная с C++17 не обязательно использовать std::tie() или boost::tie() для распаковки кортежа или пары — вы можете применить структурное связывание и тем самым упростить код.
    Вместо tie(..) можно использовать структурное связывание
  • Упрощение свойства типа при помощи псевдонима шаблона или переменной шаблона: вы можете сокращать выражения свойств типов C++11, используя псевдонимы шаблона C++14.
    Свойство типа можно упростить, применив шаблон псевдонима или переменной
  • Использование std::size: инспекция предлагает использовать std::size в качестве типобезопасного аналога идиомы С для вычисления размера массива.
    Можно использовать std::size
  • Использование нулевой инициализации вместо memset: нулевая инициализация делает код более лаконичным и предотвращает ошибки, связанные с memset.
    Вместо memset можно использовать нулевую инициализацию

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

Бывает ли вам трудно понять строковое значение, в котором много специальных символов? С появлением новых контекстных действий любое строковое значение можно преобразовать в необработанный строковый литерал C++11, более удобный для чтения, и наоборот.

Преобразование в необработанный строковый литерал

Теперь, если вам нужно заглянуть на cppreference.com, чтобы уточнить детали класса или функции стандартной библиотеки, вы можете нажать на Read more во всплывающем окне Quick Documentation (Ctrl+Shift+F1) — соответствующая страница откроется в вашем браузере.

Встроенные ссылки на cppreference.com

Благодаря умному удалению отступов теперь не нужно выравнивать их вручную: нажатие клавиши Backspace, когда курсор находится перед отступом, убирает все лишние символы сразу. Чтобы указать другой способ удаления отступов, перейдите в настройки ReSharper Environment | Editor | Behavior.
Backspace убирает отступ

Другие изменения

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

Сравнение всегда верно

Встроенный Clang-Tidy был обновлен до версии Clang 12 и теперь включает проверки из свежей версии LLVM. Помимо этого мы улучшили производительность Clang-Tidy при работе со сложными файлами, в частности на проектах, использующих C++20.

Clang-Tidy 12

ReSharper C++ теперь поддерживает два новых переключателя компилятора из Visual Studio 16.10:

  • стандартный переключатель /std:c++20,
  • переключатель /await:strict для тех, кто хочет использовать корутины из C++20, но пишет на C++14 или C++17.

На этом все. Полный список новых возможностей и исправленных ошибок включает более 180 пунктов. Посмотреть его можно в нашем баг-трекере. Кроме того, есть изменения и с платформы ReSharper. К примеру, инструмент командной строки InspectCode теперь восстанавливает пакеты NuGet и собирает приложение до того, как начать его анализировать. Также смотрите нашу статью Что нового в ReSharper.

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

СКАЧАТЬ RESHARPER C++ 2021.2

Ваша команда ReSharper C++
The Drive to Develop

Автор оригинальной статьи:

Oksana Mandryka

Elvira Mustafina

Discover more