ReSharper C++ 2020.3: UnrealHeaderTool, сравнения C++20, встроенные подсказки Push-to-Hint

Oksana Mandryka

Встречайте ReSharper C++ 2020.3 — финальный релиз этого года!

Среди новых возможностей ReSharper: интеграция с UnrealHeaderTool, новые возможности C++20, навигация между совпадающими директивами препроцессора, нечеткий текстовый поиск, режим Push-to-Hint для встроенных подсказок и многое другое. Мы думаем, вы оцените!

ReSharper C++ 2020.3

Начните пользоваться бесплатной 30-дневной пробной версией уже сегодня либо обновите вашу действующую подписку на ReSharper, ReSharper C++, dotUltimate или All Products Pack. Чтобы загрузить новую сборку, перейдите на наш сайт или воспользуйтесь приложением Toolbox App.

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

Вот основные нововведения этого релиза:

  • Unreal Engine: интеграция с UnrealHeaderTool, улучшенная проектная модель, новые инспекции на основе анализа потока управления в файлах шейдеров (HLSL).
  • Поддержка C++20: правила сравнения C++20, быстрые исправления для библиотеки Ranges и обновленные проверки соответствия стандарту.
  • Помощь при написании кода и автодополнение: улучшенное автодополнение для импортов и контекстные действия для инвертирования тернарных выражений.
  • Навигация и поиск: переход к совпадающим препроцессорным директивам, нечеткий текстовый поиск, действия Peek Implementation и Peek Base Symbols.
  • Анализ кода: новые инспекции для обновления кода и Clang-Tidy 11.
  • Push-to-Hint: новый режим просмотра встроенных подсказок.
  • Другие изменения: обновление поддержки Catch2 и новые переключатели компилятора /external:*.

Unreal Engine

ReSharper C++ 2020.3 обеспечивает интеграцию с UnrealHeaderTool. Инструмент запускается в фоновом режиме (в виде отдельного процесса) и начинает проверять файлы, которые вы редактируете. Таким образом вы будете знать об ошибках, которые обычно обнаруживаются лишь во время компиляции. Результаты анализа кода, как и любых других инспекций, отображаются прямо в редакторе:

UnrealHeaderTool: недостающие спецификаторы рефлексии

Неплохая экономия времени, неправда ли?

UnrealHeaderTool умеет находить самые разные проблемы в коде. Это может быть применение мета-тегов без необходимых спецификаторов рефлексии, использование макросов GENERATED_BODY в закрытой области видимости, Blueprints с невалидными сущностями и др. Подробнее об этой интеграции и возможностях настройки читайте в нашем блоге. Также предлагаем вам посмотреть короткую демонстрацию работы UnrealHeaderTool:

Чтобы сохранять актуальность вашего проекта, ReSharper C++ теперь отслеживает свойства Unreal Engine в режиме реального времени и пересоздает модель проекта, когда вы сохраняете изменения в файле .Build.cs, .Target.cs, .uproject или .uplugin.

Отслеживание свойств Unreal Engine

При работе с файлами шейдеров (HLSL) вы теперь можете использовать возможности ReSharper по анализу потока управления, включая предупреждения о недостижимом коде, неинициализированных переменных, избыточных ветках условных операторов, избыточных переходах потока управления и пр. Мы также добавили поддержку модификаторов ввода, специфичных для HLSL, которые указывают, служит ли аргумент функции вводом и/или выводом.

Модификаторы ввода, специфичные для HLSL

Мы добавили несколько обновлений для более строгого соответствия стандарту оформления кода Unreal Engine. К примеру, теперь настройки проектов Unreal Engine по умолчанию задают табуляцию четырьмя пробелами (если ваш файл отформатирован по-другому, ReSharper C++ автоматически определит это и не будет заставлять вас использовать табуляцию вместо пробелов). Также теперь вы можете использовать MoveTemp (эквивалент std::move в Unreal Engine) для приведения к типу rvalue-ссылки.

MoveTemp от Unreal Engine

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

Заново сгенерировать файлы проекта

Вы также можете опробовать все эти функции в превью-версии нашей новой среды разработки Rider для Unreal Engine. Он работает на основе ReSharper C++ и в данный момент доступен бесплатно. Регистрируйтесь и приступайте к созданию игр!

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

ReSharper C++ 2020.3 полностью поддерживает правила сравнения C++20. Это обновление включает существенные изменения в обработке сравнений: язык может переписывать выражения сравнения или менять порядок аргументов на обратный.

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

 C++20: список кандидатов на перегрузку

Также появились быстрые исправления для добавления директив #include <compare> и для создания операторов сравнения в виде функций-членов или в виде дружественных функций. Подробнее об изменениях правил сравнения в C++20 и о поддержке их в ReSharper C++ читайте в нашем блоге.

Мы создали две новые инспекции с быстрыми исправлениями, позволяющими вам использовать новую библиотеку Ranges:

  • Можно использовать алгоритм, работающий с диапазонами.
    Можно использовать алгоритм, работающий с диапазонами
  • Можно использовать std::views::keys/values.
    Можно использовать std::views::keys/values

Для улучшения поддержки C++20 мы также учли обновления в Visual Studio 16.8, касающиеся обеспечения соответствия стандарту. В частности, ReSharper C++ теперь поддерживает как стандартный, так и расширенный режим корутин C++, а также новый заголовок <coroutine>.

Помощь при написании кода и автодополнение

Благодаря Import Symbol Completion вы можете импортировать классы из заголовочных файлов, не включенных в текущий файл. И мы добавили несколько полезных улучшений:

  • Варианты автодополнения теперь включают подходящие члены неполных классов.Автодополнение импортов для неполных классов
  • Классам теперь можно добавлять уточняющей спецификаторы типов.
    Добавьте уточняющий спецификатор типа

Новое контекстное действие помогает инвертировать выражения тернарных операторов:

Инвертируйте тернарный оператор

Вы можете использовать быстрое исправление "Join declaration and assignment" в случае, если перед чтением локальной переменной ее значение переустанавливается в рамках всех имеющихся путей.

Объединение объявления переменной с присваиванием значения

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

Улучшенное автодополнение аргументов библиотечных функций

При навигации по коду чаще всего используется действие Go to Declaration. Теперь его также можно использовать для перехода между соответствующими директивами препроцессора:

  • Переходите между #define и #undef макроса в рамках одного файла.
    Навигация между #define и #undef
  • Переходите между директивами в рамках блока директив препроцессора.
    Навигация в блоке условных препроцессорных директив

Теперь вы можете использовать действие Go to Declaration для ключевого слова override. Это позволит вам перейти к базовой функции, не запуская для имени функции действие Base Symbols:

Go to Declaration для ключевого слова override

Помимо обычного поиска операция Find Text теперь выполняет нечеткий поиск, что позволяет находить текст с опечатками и пропущенными словами. Эта функциональность может быть очень полезна, если вы ищете определенную форматную строку, используемую в качестве аргумента функции форматирования текста, например такой, как printf или std::format.

Нечеткий текстовый поиск

Теперь для кода C++ поддерживаются действия Peek Implementations и Peek Base Symbols — они позволят вам просматривать и редактировать код во всплывающем окне, не покидая того кода, над которым вы работаете:

  • Чтобы просмотреть реализации, нажмите Ctrl+Alt+Q или используйте меню ReSharper | Navigate | Peek.
    Показ реализаций
  • Чтобы просмотреть базовые символы, нажмите Shift+Alt+Q или используйте меню ReSharper | Navigate | Peek.
    Показ базовых символов

Для улучшения читаемости во вложенных пространствах имен в окне File Structure теперь используется синтаксис C++17, даже если вы еще не внедрили новый синтаксис в свою кодовую базу:

Вложенные пространства имен в файловой структуре

Мы продолжаем улучшать поддержку C++/CLI. К примеру, действие Go to Derived Symbols теперь работает с функциями get/set внутри свойств C++/CLI, а также с функциями add/remove внутри событий C++/CLI:

Переход к производным символам (для get и set)

Анализ кода

Помимо упомянутых инспекций для C++20 и анализа потока управления в файлах шейдеров мы также создали новую инспекцию, позволяющую (там, где это возможно) заменять стандартные алгоритмы, принимающие пару итераторов, на эквивалентные алгоритмы, которые принимают итератор и счетчик:

Используйте алгоритмы, принимающие счетчики

Встроенный исполняемый файл Clang-Tidy был обновлен до версии Clang 11, добавляющей новые проверки и диагностические процедуры компилятора из свежей версии LLVM.

Clang-Tidy 11

Push-to-Hint

ReSharper C++ предлагает множество различных встроенных подсказок. Все они полезны в определенных сценариях, однако порой их очень много. Чтобы решить эту проблему, мы создали для встроенных подсказок специальный механизм под названием "Push-to-Hint". В режиме Push-to-Hint подсказки отображаются только при нажатии и удерживании Ctrl либо при двойном нажатии Ctrl:

Push-to-Hint

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

Измените режим видимости

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

Мы добавили поддержку макросов TEMPLATE_TEST_CASE и TEMPLATE_PRODUCT_TEST_CASE (были недавно обновлены в Catch 2.8), а также появившихся недавно макросов TEMPLATE_TEST_CASE_SIG и TEMPLATE_PRODUCT_TEST_CASE_SIG:

Параметризованные тесты в Catch2 2.8+

ReSharper C++ теперь сможет подхватывать и использовать пути include к сторонним библиотекам, указанные с помощью переключателей компилятора /external:*.

Ну и еще одно полезное обновление: нам удалось повысить производительность операций Find Usages и Rename, используемых в отношении членов закрытых классов. Если у содержащего класса нет дружественных классов, ReSharper C++ будет искать использования члена класса только в тех файлах, которые содержат определение класса и определения функций-членов этого класса. Для огромных кодовых баз эта оптимизация ускоряет Find Usages в 50, а то и в 100 раз (например, при поиске полей Data и Length класса LLVM StringRef).

Полный список новых возможностей и исправлений, вошедших в этот релиз, насчитывает более 190 задач и доступен в нашем баг-трекере. Вы можете оставить запрос свой о добавлении новой функциональности или проголосовать за любой существующий. Мы всегда рады вашей обратной связи!

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

Попробуйте ReSharper C++ 2020.3 и расскажите нам о своих впечатлениях!

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

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

Подписаться

Подписаться на обновления