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

В ReSharper C++ 2019.3 вас ждут улучшения редактора по всем направлениям: от анализа кода и интеграции с Clang-Tidy до форматирования и навигации. Кроме того, в редакторе появились подсказки типов, упрощающие чтение и понимание кода, а также поддержка новых возможностей готовящегося к выходу стандарта C++20, в том числе концептов. Для разработчиков игр на Unreal Engine мы добавили новые специальные шаблоны для генерации кода и поддержку умных указателей UE4.

Скачать
Бесплатная пробная версия на 30 дней

ReSharper C++ 2019.3

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

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

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

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

В ReSharper C++ появилась поддержка концептов, включая обновленный с учетом этой языковой возможности рефакторинг Rename и действие Find usages. Более того, анализатор кода покажет подробную информацию об ошибках в использовании концептов. Например, если разрешение перегрузки невозможно, из-за того что не выполнено требование концепта, вы узнаете все подробности об ошибке из всплывающей подсказки. Кстати, для удобства чтения мы добавили цвета в подсказки, которые сообщают об ошибках разрешения перегрузки.

Мы подробно рассказываем о нововведениях C++20 и их поддержке в ReSharper C++ в серии статей в нашем блоге.

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

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

Если предупреждение Clang кажется вам слишком навязчивым, можете его отключить в меню инспекции. Если вы считаете, что какая-то проверка неактуальна в текущем файле, просто отключите ее с помощью Disable in file with comment. А чтобы отключить все проверки в файле, используйте опцию Disable all inspections in file with comment.

Когда вы вводите тело лямбды, новое быстрое исправление поможет добавить переменные в список захвата. Не нужно делать это вручную — просто поместите курсор на переменную в теле лямбды и нажмите Alt+Enter. ReSharper C++ предложит варианты для обновления списка захвата.

Clang-Tidy

Clang-Tidy

В этой версии, мы обновили встроенный исполняемый файл Clang-Tidy до версии Clang 9, чтобы предоставить вам множество новых инспекций и исправлений. Важно отметить, что встроенный исполняемый файл больше не препятствует модификации исходных файлов. Кроме того, Clang-Tidy теперь запускается быстрее, так как не ждет окончания других процессов анализа.

Настройки Clang-Tidy стали более гибкими:

  • Теперь у вас есть 3 варианта выбора исполняемого файла Clang-Tidy для использования в ReSharper C++. Помимо встроенного исполняемого файла и пользовательского файла, который вы можете указать в настройках, теперь можно выбрать файл из %PATH%ReSharper C++ будет искать в папках, перечисленных в переменной окружения %PATH%, и сообщит, если что-нибудь найдет.
  • Теперь вы можете указать на конкретный файл конфигурации Clang-Tidy, не используя строки в формате YAML/JSON.

подсказки типов

В современном C++ порой не так просто понять, какой же тип у переменных перед вами. Поэтому в ReSharper C++ 2019.3 мы добавили подсказки с типами для:

  • Переменных, объявленных как auto
  • Структурных привязок
  • Возвращаемых типов функций и лямбд
Шаблоны кода

Шаблоны кода

Мы переименовали некоторые шаблоны, чтобы они соответствовали ключевым словам используемого языка. Например, чтобы сгенерировать класс, введите class (вместо cls), для структур используйте struct (вместо str). Шаблоны переименованы аналогичным образом для объединений, перечислений и пространств имен.

Улучшения навигации

Улучшения навигации

Мы улучшили действие Go to file member:

  • Диалог отображается мгновенно, до завершения анализа файла.
  • Если объявление и определение функции содержатся в одном и том же файле, в диалоге они показываются только один раз.

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

Инструмент форматирования

Инструмент форматирования

В ReSharper C++ 2019.3 можно экспортировать настройки форматирования в clang-файл. Используйте опцию Write current style to .clang-format в меню ReSharper | Options | Code Editing | General Formatter Style.

Добавлены новые опции для постановки пробелов:

  • перед ptr в абстрактном объявлении
  • перед ref в абстрактном объявлении

ReSharper C++ 2019.3 теперь умеет проверять порядок директив #include в коде. Просто укажите нужные параметры, и соответствующая инспекция предупредит о том, что порядок нарушен, а быстрое исправление поможет расставить все по местам.

Поддержка Unreal Engine 4

Поддержка Unreal Engine 4

ReSharper C++ понимает, что вы работаете над проектом Unreal Engine и корректирует свое поведение в соответствии с особенностями UE4.

Постфиксный шаблон new теперь учитывает специфику создания объектов в UE4. Кроме того, появились шаблоны для генерации USTRUCT/UCLASS/UENUM/UENUMCLASS.

Такие возможности редактора как Parameter Info, анализ кода и постфиксное автодополнение умеют работать с умными указателями Unreal Engine (TSharedPtr, TSharedRef, TWeakPtr, TUniquePtr) — аналогично тому, как это делается для std::shared_ptr/std::unique_ptr.

И наконец, мы улучшили производительность при работе над проектами UE4. Например, устранили зависание после действия Refresh Visual Studio Project в редакторе UE4.

Свойства проекта

Свойства проекта

Мы добавили некоторые настройки проекта для случая кастомного компилятора или инструмента сборки. Они хранятся в настройках ReSharper и позволяют указать:

  • Каталоги заголовочных файлов
  • Определения препроцессора
  • Стандарт языка C++

ReSharper C++ 2019.3 теперь умеет проверять порядок директив #include в коде. Просто укажите нужные параметры, и соответствующая инспекция предупредит о том, что порядок нарушен, а быстрое исправление поможет расставить все по местам.

Улучшения производительности

Подсветка синтаксиса теперь работает быстрее. После изменения тела функции, ReSharper C++ повторно анализирует только само тело.

Мы также ускорили поиск Find Usages путем добавления эвристики, основанной на графе включаемых заголовочных файлов. Файлы, в которых нет использований, исключаются из поиска.

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

Много изменений пришло из ReSharper. Читайте о них здесь.

Скачать
Бесплатная пробная версия на 30 дней

ReSharper C++ 2019.2

Ускоренное открытие проекта

Мы наконец завершили работу, которую вели на протяжении нескольких релизных циклов, и теперь можем официально объявить, что в ReSharper C++ появилась новая реализация препроцессора. На самом деле их сейчас два: новый используется для индексации, а старый — для всего остального. Новый препроцессор ускоряет индексацию типичных решений, таких как LLVM и Unreal Engine, на 15-25%.

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

Автодополнение

При использовании автодополнения ReSharper C++ показывает краткое описание каждого предлагаемого варианта (функцию можно включить/отключить в разделе настроек Environment | IntelliSense | Completion Appearance). Описание выбранного варианта автодополнения теперь выделено цветами и содержит соответствующую документацию.

Подсказки кода

Подсказки кода

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

Улучшенная поддержка C++20

Стандарт C++20 вот-вот будет подписан комитетом по стандартизации языка. Мы, конечно же, прилагаем все усилия, чтобы полностью обеспечить его поддержку. В ReSharper C++ 2019.2 добавилась поддержка:

  • условных explicit выражений,
  • нового типа char8_t,
  • распаковки аргументов в lambda init-capture,
  • конструируемых и назначаемых лямбд без сохранения по умолчанию,
  • правил C++20 для агрегатов,
  • спецификаторов conteval и constinit,
  • улучшений C++20, касающихся объявлений структурного связывания.
Поддержка редактирования

Поддержка редактирования

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

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

Инструмент форматирования

Инструмент форматирования

В ReSharper C++ 2019.2 появился целый ряд новых параметров форматирования:

  • Использовать отступ в непрерывной строке в декларации функции и вызове в кавычках.
  • Предпочтителен перенос строки перед ")" в объявлении.
  • Предпочтителен перенос строки перед ")" в вызове.
  • Использовать отступ в непрерывной строке в списках инициализаторов.
  • Выравнивать аргументы списка инициализаторов.
  • Предпочтителен перенос строки после "{" в списках инициализаторов.
  • Предпочтителен перенос строки перед "{" в списках инициализаторов.

Анализ кода

Появились новые инспекции для обнаружения проблем в структуре кода:

  • Несоответствующая директива препроцессора.
  • Явна заданная по умолчанию функция-член неявно удаляется.
  • Избыточный спецификатор final в классе, помеченном final.

Исправление Use static_cast для инспекции использованного приведения в стиле языка C может быть запущено как в массовом порядке, так и в составе Code Cleanup.

Навигация

Навигация

Действия навигации стали более точными:

  • С помощью Go to declaration можно перейти к конструктору по умолчанию, вызываемому, когда объект инициализирован значением по умолчанию в объявлениях переменных и новых выражениях.
  • Find usages находит использование конструкторов по умолчанию при инициализации по умолчанию.
  • Go to symbol теперь скрывает символы с квалифицированными именами (например, определения функций вне класса).

Кроме того, вы можете осуществлять поиск в файле прямо через диалог Go to File Member. Список результатов будет содержать имена всех подходящих членов и всех мест в файле, где есть искомая строка.

Unreal Engine

В предыдущем релизе мы начали работу над улучшением поддержки удаленного вызова процедур для UE4. Теперь мы обновили рефакторинги Rename и Change Signature для корректной работы с функциями RPC. Добавлено несколько новых проверок кода для Unreal Engine, в частности для обнаружения отсутствующих или неправильно установленных макросов рефлексии UE4.

В версии 2019.1 мы реализовали автодополнение для спецификаторов рефлексии, а теперь добавили для них встроенную документацию. Она отображается во всплывающем окне Quick Documentation (Ctrl+Q), когда курсор установлен на спецификаторе.

Другие возможности

ReSharper C++ 2019.2 обеспечивает начальную поддержку режима Per-Monitor DPI Awareness, представленного в Visual Studio 2019. Кроме того, мы обновили страницу руководства по улучшению производительности (ReSharper | Options | Environment | Performance Guide): добавили раздел Windows Defender, а также описания всех советов по улучшению производительности, из которых вы узнаете, что именно произойдет после применения предложения.

Есть хорошие новости и для авторов плагинов: сборки C++ из ReSharper C++ теперь включены в ReSharper SDK.

ReSharper C++ 2019.1

Улучшения производительности

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

Помимо оптимизации памяти, алгоритмических улучшений индексации кода и ускоренной сериализации кэша, мы добавили некоторые специальные возможности для проектов Unreal Engine. Они включают в себя пропуск плагинов и стороннего кода по умолчанию при индексации проекта Unreal Engine 4. Параметры, влияющие на индексацию кода в решениях Unreal Engine 4, можно найти на новой странице настроек: ReSharper | Options | Code Editing | C++ | Unreal Engine.

Правила именования UE4

Поддержка Unreal Engine

Правила именования в Unreal Engine

Код, в котором соблюдаются правила именования, легче читать. Неудивительно, что Epic Games опубликовала руководство по стилю оформления кода в Unreal Engine 4, которое включает большой раздел, посвященный соглашению об именах. Основная рекомендация — следовать этому руководству при разработке игр на Unreal Engine. ReSharper C++ 2019.1 учитывает это соглашение об именах во всех командах, в том числе в рефакторингах переименования и введения переменной, при генерации кода геттеров и сеттеров и во многих других действиях.

ReSharper C++ следит за правильностью использования имен по всей кодовой базе. Любые несоответствия правилам именования UE4 подсвечиваются в редакторе благодаря специальным инспекциям Inconsistent UE4 naming. Чтобы вызвать рефакторинг Rename для неверного символа, используйте соответствующее быстрое исправление.

Автодополнение спецификаторов рефлексии UE4

Автодополнение спецификаторов рефлексии

Для упрощения работы с макросами отражения Unreal Engine, ReSharper C++ предоставляет автодополнение для спецификаторов отражения внутри макросов:

Навигация по удаленным вызовам процедур

Процедуры удаленного вызова

ReSharper C++ 2019.1 идентифицирует процедуры удаленного вызова по ключевым словам Client, Server или NetMulticast в макросе объявления UFUNCTION. ReSharper C++ знает, что для таких функций должна быть сгенерирована функция _Implementation, а также функция _Validate, если установлен спецификатор WithValidation. Если отсутствует только одна функция, будет сгенерирована нужная, а если отсутствуют обе — то две.

При переходе к определению ReSharper C++ предложит обе функции (_Validate и _Implementation). Также можно воспользоваться меню, вызываемом Alt+Enter, и выбрать в нем пункт Related UE4 functions. Подробнее

Проверки сгенерированных заголовочных файлов UE4

Автоимпорт с учетом сгенерированных заголовочных файлов

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

Кроме того, автоматический импорт больше не предлагает символы из папок Private и Classes проекта UE4.

шаблонная лямбда

Язык C++: стандарты C++17 и C++20

Мы улучшили поддержку стандартов C++:

Объявления С в стиле K&R

Объявления С в стиле K&R

ReSharper C++ научился корректно обрабатывать объявления C, оформленные в стиле K&R. Если у вас есть библиотека, в которой использован этот стиль, или вам просто он нравится, теперь вы сможете работать с ним в ReSharper C++:

Настройки Clang-Tidy

Clang-Tidy

Уже довольно давно ReSharper предоставляет интеграцию с Clang-Tidy — мощным инструментом анализа кода, основанным на компиляторе Clang. В версии 2019.1 мы обновили встроенный исполняемый файл Clang-Tidy до версии Clang 8, чтобы предоставить вам множество новых инспекций и исправлений.

Опции Clang-Tidy теперь сгруппированы на отдельной странице: Options | Code Editing | C++ | Clang-Tidy. Вы можете перечислить проверки, которые хотите включить/отключить, в простой текстовой форме, добавить конфигурационный файл Clang-Tidy и даже указать собственный исполняемый Clang-Tidy, который будет использоваться вместо встроенного.

Базовые члены файла

Навигация

Чтобы добиться максимальной отзывчивости редактора, в этой версии мы ускорили работу команд Search everywhere и Go to type. Действия Go to file member, Go to base class и Go to derived class теперь можно использовать во время индексации.

Команда Go to Everything также стала значительно быстрее: улучшилась общая производительность, ускорился поиск шаблонов с :: и пробелами, а также другие аспекты.

При вызове действия Go to File Member теперь можно включать в результаты поиска базовые члены и переходить к ним.

Настройки именования

Правила именования

Мы переработали страницу настроек правил именования C++ (ReSharper Options | Code Editing | C++ | Naming Style). Там теперь есть два отдельных списка: спецификаторы и виды сущностей, представленные в виде дерева. Вы можете их объединять и добавлять правила, относящиеся к одному или нескольким видам сущностей.

Мы добавили несколько новых видов сущностей, чтобы сделать настройку еще более гибкой:

  • Параметры шаблона были разделены на типовые и нетиповые параметры шаблона.
  • Параметры были разделены на параметры функций и лямбд.
  • Перечисляемые типы были разделены на стандартные (unscoped enumerators) и классы (scoped enumerators).
ClangFormat в настройках форматирования ReSharper

Инструмент форматирования

Среди настроек форматирования много новых опций и улучшений:

  • Чтобы сделать форматирования более гибким, мы разделили параметры форматирования для пробелов вокруг ссылок и указателей. Теперь для каждого случая есть два набора опций. Так вы можете добавить пробел перед ссылкой в типе возвращаемого значения функции, но пропустить его перед указателем.
  • Можете делать перенос перед запятыми в списке базовых классов.
  • ReSharper C++ поддерживает много новых параметров ClangFormat, например CompactNamespaces, AllowShortBlocksOnASingleLine и AllowShortFunctionsOnASingleLine, AccessModifierOffset, BreakBeforeBraces: Custom.
  • В настройках можно увидеть, какие параметры форматирования зависят от конкретного параметра ClangFormat.
Документация

Документация

Когда вы набираете документирующий комментарий, по нажатию Enter ReSharper C++ автоматически добавит /// на новую строку. Если у функции есть XML-комментарий с документацией, и ее параметр переименовывается с помощью рефакторинга Rename, то соответствующий тег <param> в комментарии тоже будет обновлен. Это еще не все: если вы переименуете параметр вручную, ReSharper C++ выделит несоответствие и предложит добавить новый тег <param> или переименовать существующий.

Поддержка Doctest

Юнит-тестирование

Для юнит-тестирования теперь поддерживаются:

  • Декларации TEMPLATE_PRODUCT_TEST_CASE из Catch 2.7,
  • Макрос GTEST_SKIP() из Google Test.

Кроме того, к числу поддерживаемых фреймворков (Google Test, Boost.Test и Catch) добавился doctest. Это относительно новый фреймворк, легкий и очень гибкий. Он позволяет писать тесты непосредственно в production-коде и в то же время предоставляет возможность удалить все, что связанно с тестами, из двоичного файла.

ReSharper C++ 2018.3

отзывчивый_редактор

Отзывчивый редактор

В ReSharper C++ 2018.3 мы значительно улучшили производительность. Во-первых, действие Find code issues и инструмент командной строки InspectCode теперь работают параллельно, а значит гораздо быстрее. Во-вторых, загрузка кэша при повторном открытии проекта теперь также выполняется параллельно, что в среднем ускорило процесс в два раза. Наконец, улучшения общей производительности отразились на скорости автодополнения, начальной индексации проекта и анализа файлов.

Unreal Engine

Поддержка Unreal Engine

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

Unreal Engine использует специальные макросы (UCLASS, USTRUCT, UENUM и др.) для эмуляции отсутствующих в C++ функций отражения. ReSharper C++ теперь правильно парсит эти макросы, даже до того, как вы соберете проект Unreal Engine.

Улучшения C++/CLI

Улучшенная поддержка C++/CLI Улучшенная поддержка C++/CLI Ultimate

В версии 2018.3 мы улучшили поддержку C++/CLI, добавив новые способы генерации недостающего кода:

  • Новые действия генерации методов Equals() и GetHashCode()
  • Действия Generate constructor и Generate getter/setter для генерирации свойств C++/CLI
  • В классах C++/CLI можно сгенерировать производный класс, структуру или интерфейс
  • Автодополнение работает после объектов универсальных типов в C++/CLI. Умное автодополнение типа фильтрует список типов, методов и переменных в соответствии с ожидаемым типом и теперь работает после gcnew
  • Новые постфиксные шаблоны new и foreach в коде C++/CLI
  • Вы также можете создать поле и функцию-член C++/CLI класса из фактического использования

Усовершенствованная диагностика ошибок в шаблонном коде

Когда в C++ происходит ошибка разрешения перегрузки, ReSharper C++ 2018.3 теперь более конкретно описывает причины, точно указывая на условия, которые не были удовлетворены. Это особенно полезно при неудачных условиях enable_if, неверно сформированных выражениях внутри decltype и отсутствующих внутренних типах.

Подробнее

автодополнение шаблонов

Автодополнение в зависимом коде

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

Информация о параметрах

Подсказки и информация о параметрах

Всплывающая подсказка Parameter Info теперь предоставляет еще больше информации: в ней отображается информация об удаленных функциях, неявно сгенерированных функциях и описания параметров шаблона, взятые из документирующих комментариев к аргументам шаблона. Parameter Info работает для зависимого кода и пользовательских бинарных операторов. А еще подсказки Parameter Info стало проще читать благодаря раскраске кода внутри них.

Подсказки имен

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

приведение в функциональном стиле

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

Мы добавили более 10 новых инспекций, и для многих из них есть быстрые исправления. Например, появилось быстрое исправление, которое можно использовать для добавления приведения в функциональном стиле и инициализации всех неинициализированных членов класса. А еще интеграция с Clang-tidy обновилась до версии Clang 7, тем самым предоставляя более 50 дополнительных проверок.

приведение в функциональном стиле

Рефакторинг и исправления

Рефакторинги ReSharper теперь лучше понимают современный C++. С помощью Change Signature можно сделать функцию constexpr, const, или noexcept и поменять квалификаторы ссылок.

В ReSharper C++ 2018.3 появилось несколько новых контекстных действий, которые позволяют:

  • Создавать реализацию функции и копировать ее в буфер обмена вместо вставки в документ.
  • Сгенерировать функцию, которая преобразует перечисление в строку (можно настраивать с помощью шаблона live template).
  • Преобразовывать обычный тип возвращаемого значения в объявлении функции в trailing return type и обратно.
  • Подставлять аргументы шаблона, выведенные с помощью class template argument deduction.
несовпадающие сигнатуры

Навигация

Команда Go to declaration теперь работает с независимыми спецификаторами decltype и лямбда-выражениями (переход к телу лямбды). Это действие доступно даже время начальной индексации проекта.

В универсальном диалоге поиска Search Everywhere добавилось несколько дополнительных фильтров: например /gf для глобальных функций C++, /gv для глобальных переменных C++ и /d для определений макросов.

Пожалуй, самая удобная функция — переход к несовпадающим сигнатурам. Например, когда действие Go to declaration вызывается на измененном объявлении функции-члена класса, вы переходите к определению со старой сигнатурой.

стиль кода

Стиль кода

Порой гораздо проще настроить параметры форматирования, просто определив их по существующему коду. С ReSharper C++ это возможно! Выберите в меню ReSharper | Edit | Detect formatting settings, и ReSharper обнаружит настройки форматирования, используемые в вашем коде. Вы сможете просмотреть полученные значения в специальном окне и применить их к настройкам ReSharper на вашем компьютере. Их также можно сохранить на уровне настроек совместного использования, чтобы у ваших коллег была такая же конфигурация форматирования при открытии текущего решения. Подробнее

ReSharper C++ пока не умеет автоматически определять схемы именования C++, но мы добавили в настройки предопределенные правила именования C++: STL, Google, LLVM, CamelCase и Microsoft. Их можно выбрать в меню ReSharper Options | Code Editing | C++ | Naming Style.

приведение в функциональном стиле

Юнит-тестирование с помощью Catch

Эта версия поддерживает Catch 2.5 вместе с новыми шаблонными тестами.

ReSharper C++ 2018.2

C++/CLI

Начальная поддержка C++/CLI Начальная поддержка C++/CLI Ultimate

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

Однако из-за большого количества синтаксических дополнений и специфических изменений семантики C++, сделать это оказалось непросто. И вот наконец мы готовы представить поддержку C++/CLI в ReSharper C++ 2018.2: многие основные функции (включая инспекции, помощь при наборе текста, форматирование и автодополнение) теперь поддерживают этот диалект.

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

Для доступа к поддержке C++/CLI требуется подписка на ReSharper Ultimate и включенный ReSharper. Подробнее о поддержке C++/CLI в ReSharper C++ читайте в нашем блоге.

Возможности C++17

Возможности C++17

Еще одна область, над которой мы усердно работаем — улучшение поддержки стандарта C++17. ReSharper C++ 2018.2 поддерживает:

  • Вывод типов аргументов шаблона класса (CTAD) и пользовательские правила вывода типов.
  • Свертка параметров шаблона.
  • Auto для нетипизированных параметров шаблона.
  • Распаковка аргументов в using-объявлениях.
  • Using-объявления с несколькими деклараторами.
  • Гарантированное избавление от копирования.
  • Агрегаты с базовыми классами.
  • Поддержка свойства типа std::is_aggregate.
  • Макрос препроцессора __has_include.

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

Возможности C++20

Возможности C++20

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

  • Корутины (как указано в n4760 Coroutines TS).
  • Назначенная инициализация (designated initialization).
  • Цикл for с инициализатором в условии цикла.
  • Тестовые макросы для возможностей языка.
  • Инициализаторы битовых полей по умолчанию.
Встроенная проверка орфографии

Встроенная проверка орфографии с помощью ReSpeller

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

Когда вы сталкиваетесь с орфографической ошибкой, вызовите меню с помощью Alt+Enter, и ReSpeller предложит несколько вариантов решения проблемы: можно исправить опечатку либо добавить слово в словарь ReSpeller. По умолчанию инструмент поставляется со встроенным словарем английского языка (США), но можно легко добавить и другие словари.

О том, как добавить новый словарь, и другую информацию о ReSpeller читайте в нашем блоге.

Инспекции форматирования

Инспекции форматирования

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

По умолчанию эти инспекции отключены, чтобы не беспокоить тех, кто не переживает о форматировании, когда пишет код. Перейдите в меню ReSharper | Options | Code Inspection | Inspection Severity, чтобы просмотреть все доступные проверки форматирования и настроить уровни серьезности для тех из них, о которых вы хотите получать уведомления.

Читайте о соблюдении единого стиля оформления кода с помощью инспекций в нашем блоге.

Информация о параметрах

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

Как обычно, в ReSharper C++ 2018.2 добавлено множество небольших улучшений по разным направлениям:

  • При выполнении вычислений размера и выравнивания механизм анализа кода учитывает размеры битовых полей, спецификаторы alignas и атрибуты __decltype(align).
  • Parameter Info предоставляет подробную информацию о членах агрегатного класса при выполнении инициализации агрегатов.
  • Комментарии в файле для переопределения настроек форматирования генерируются напрямую из диалогового окна Configure Format.
  • Операторы for на основе диапазона содержат ссылки по двоеточию для простой навигации к функциям begin() и end(), используемым в цикле.
  • Были добавлены отдельные настройки цвета для статических полей класса и статических функций-членов класса.
  • Спецификация ожидаемых отказов поддерживается в юнит-тестах с использованием Boost.Test.
  • Исправлено множество проблем производительности в различных областях ReSharper: от ускорения поддержки ClangFormat до сокращения времени загрузки решения. Читайте о нашей работе над производительностью в серии блогпостов, посвященной выпуску ReSharper 2018.2.

ReSharper C++ 2018.1

Фильтры для шагов отладки

Фильтры для шагов отладки

Фильтры для пошаговой отладки — это новейшая из возможностей отладки, предоставляемых в ReSharper C++. При вызове команды Step Into отладчик Visual Studio обычно заходит во все функции, вызываемые из текущего выражения. Однако некоторые функции могут быть либо тривиальными, либо настолько хорошо протестированными, что заходить в них нет необходимости. В подобной ситуации пригодятся фильтры для пошаговой отладки: можно указать функции, которые отладчик должен обходить стороной.

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

  • На странице Tools | Debugging | C++ есть список всех доступных фильтров, где вы можете исследовать их, настраивать, отключать или включать.
  • Если при заходе в функцию вы решите, что хотите перешагнуть через нее в будущем, используйте контекстное действие, чтобы быстро добавить эту функцию в список фильтров. Для шаблонных функций существуют отдельные контекстные действия, которые позволяют добавить в фильтр только текущий экземпляр функции, либо все ее экземпляры.

Подробнее о фильтрах для шагов отладки читайте в нашем блоге.

Анализ включений

Анализ включений

Для крупномасштабных проектов на C++ момент компиляции связан с наибольшими проблемами. В ReSharper C++ 2018.1 появился анализ включенных заголовочных файлов — новый инструмент, помогающий оценить, какие именно файлы заголовков в проекте добавляют больше всего строк кода и вносят наибольший вклад в ресурсоемкость компиляции. Чтобы воспользоваться этой возможностью, можно вызвать действия ReSharper | Inspect | Analyze Includes in … или выбрать команду контекстного меню Analyze Includes в Solution Explorer. ReSharper C++ проанализирует файлы в указанной области и выдаст отчет в отдельном окне инструмента.

В отчете перечислены файлы, отсортированные по количеству строк кода, которые они привносят вместе с транзитивно включенными файлами. Вы можете изучить зависимости между файлами либо с помощью дерева Includees, в котором дочерние узлы соответствуют файлам, которые включают файл в родительском узле, либо с помощью дерева Includers, в котором дочерние узлы являются включенными файлами. Используя эти два представления, вы сможете точно определить, какие заголовочные файлы, вносят наибольший вклад, а затем попытаться избавиться от любых ненужных директив #include.

Улучшения навигации

Улучшения навигации

Мы переработали диалог Go to File Member. Теперь члены класса сгруппированы в списке результатов по классу, в котором они содержатся. Более того, активные члены файла сортируются в порядке их объявлений, а прокручиваемый список результатов вмещает больше элементов. Благодаря этим изменениям пользоваться диалогом стало удобнее и можно получить более четкое представление о структуре текущего файла.

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

При выполнении поиска в окне Recent Files результаты поиска Go to File добавляются в список результатов после объектов Recent File.

Наконец, ReSharper С++ теперь по умолчанию запоминает последний поисковой запрос в диалоге Search Everywhere. Отключить опцию можно в настройках: Environment | Search & Navigation | Remember last search.

Очистка кода из командной строки

Очистка кода из командной строки

Бесплатный набор инструментов ReSharper Command Line Tools, которые можно использовать из командной строки или как часть процесса непрерывной интеграции, теперь позволяют выполнять очистку кода в проектах на C++. Запустите файл cleanupcode.x86.exe в своем решении, и он автоматически переформатирует ваш код, удалит избыточные фрагменты, применит исправления Clang-Tidy и другие автоматические способы улучшения стиля кода. Таким образом вы мгновенно избавитесь от нарушений стиля кода в вашем проекте или решении и обеспечите единообразие кодовой базы.

Кроме того, в этой версии были исправлены ошибки в работе инструмента InspectCode в 64-битных проектах. Кроме того, TeamCity 2018.1 позволяет запускать InspectCode в проектах на C++ (подробности: TW-48978).

Узнайте больше об очистке кода с помощью инструментов командной строки ReSharper в нашем блоге.

Инспекции кода

Инспекции кода

В ReSharper C++ появились новые встроенные инспекции:

  • Новая инспекция (с соответствующим исправлением и поддержкой в code cleanup), предлагающая заменить операторы if на операторы if constexpr, когда условие является константным выражением во время компиляции.
  • Набор инспекций для диагностики использований удаленных функций.
  • Инспекции, анализирующие поток управления, и проверки использования теперь работают внутри тела лямбды.
Расширенные настройки серьезности инспекций

Расширенные настройки серьезности инспекций

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

Чтобы включить эту функцию, отметьте флажком опцию Read settings from EditorConfig and project settings в разделе Code Inspection | Settings | General.

Подробнее о настройке уровня важности инспекций с помощью EditorConfig.

Обновленная интеграция с Clang-Tidy

Обновленная интеграция с Clang-Tidy

Интеграция с Clang-Tidy получила несколько улучшений:

  • Мы обновили Clang-Tidy до версии 6.0, добавив тем самым несколько новых проверок.
  • Новое действие позволяет отключить определенную проверку Clang-Tidy в текущей строке по имени инспекции.
  • При падениях Clang-Tidy, диалоги о системных ошибках больше не будут отображаться.
Другие улучшения

Другие улучшения

В новую версию ReSharper C++ также вошли следующие изменения:

  • Поддержана директива препроцессора #include_next для лучшей совместимости с компиляторами, которые реализуют это расширение GNU.
  • Когда вы редактируете файлы C++, ReSharper автоматически удаляет хвостовые пробелы при нажатии Enter, чтобы избавить ваш код от лишних пробелов.
  • Если вы выберете выражение и откроете окно быстрой документации, в нем вы увидите различную информацию о выражении, например его тип, значение и категорию значений.
  • Новая настройка Tools | Unit Testing | C++ Tests | Use command-line arguments… контролирует, нужно ли использовать значение свойства проекта Debugging | Local Windows Debugger | Command Arguments при запуске юнит-тестов.
  • Всплывающее окно автодополнения работает быстрее.

ReSharper C++ 2017.3

Возможности отладчика

Возможности отладчика

ReSharper C++ 2017.3 позволяет просматривать значения локальных переменных, параметры функций, выражения текущей строки и возвращаемые значения функции прямо в редакторе, рядом рядом с соответствующими строками кода. Кроме того, в ReSharper C++ появилось новое действие Go to Breakpoint (переход к точке останова, Ctrl+Alt+F9) и новое окно R# Breakpoints для быстрой навигации по точками останова в решении, а также возможность создавать точки останова и точки трассировки в окне Find Results.

ReSharper C++ также предоставляет подсказки значений данных (DataTips) при отладке с возможностью поиска конкретного значения. Для доступа к DataTips кликните по отображаемому значению или отключите Visual Studio DataTips в разделе настроек Tools | Debugger.

Интеграция с Clang-Tidy

Интеграция с Clang-Tidy

Clang-Tidy — мощный инструмент для анализа кода, основанный на популярном компиляторе Clang. Он предоставляет широкий набор инспекций и исправлений. В ReSharper C++ 2017.3 появилась интеграция с Clang-Tidy: анализатор работает в фоновом режиме при редактировании кода, а результаты проверок мгновенно отображаются в редакторе вместе со встроенными инспекциями. ReSharper C++ позволяет применять исправления, предоставляемые Clang-Tidy как по отдельности для выбранной области, так и с помощью функции Code Cleanup.

Помимо собственных инспекций, Clang-Tidy также предоставляет проверки Clang Static Analyzer и предупреждения компилятора clang. Для всех них найдется соответствующая инспекция ReSharper, уровень важности которой можно настроить в соответствии с вашими потребностями.

Обратите внимание, что на данный момент Clang-Tidy не поддерживает файлы, использующие кодировку UTF-16 или UTF-32.

Более глубокое понимание C++

Поддержка языка

Улучшение поддержки языка C++ было основным направлением работы над версией 2017.3. Теперь ReSharper C++ поддерживает несколько новых функций C++17 и C++14:

  • C++17: декларации со структурным связыванием.
  • C++17: inline-переменные.
  • C++17: constexpr if.
  • C++14: вывод типа возвращаемых значений для auto-функций без trailing return type.
  • Проверка типов и вывод типа возвращаемого значения для лямбда-выражений, поддержка обобщенных лямбда-функций C++14.

Другие изменения включают:

  • Поддержку pragma-директив include_alias.
  • Улучшенную обработку явных реализаций шаблона.
  • Поддержку расширения Microsoft C++ для обработки событий.
Добавление недостающего описания параметра функции

Инспекции и контекстные действия

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

  • Бинарный оператор с одинаковыми или равными аргументами.
  • Переопределение аргумента функции по умолчанию из другого объявления или базовой функции.
  • Избыточный спецификатор const для параметра в объявлении функции.
  • Отсутствует описание параметра функции в документирующем комментарии.
  • Избыточный инициализатор в списке инициализаторов члена.
  • Не inline-переменная определена в заголовочном файле.
  • Литерал имеет пользовательский суффикс, который не начинается с подчеркивания.
  • Подробная диагностика ошибок в объявлениях со структурным связыванием.

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

  • Преобразование инициализатора в списке инициализаторов членов в инициализатор нестатического члена данных.
  • Переключение между ключевыми class и typename в объявлении типизированного параметра шаблона.
Новые возможности форматирования

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

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

  • Многострочное форматирование кода:
    • Выравнивание присваиваний, объявлений и однострочных комментариев в виде столбцов.
    • Смещение влево запятых и операторов доступа к членам в последовательных вызовах методов.
  • Пробелы перед запятыми и после них в списках инициализации и перед комментариями в конце строки.
Переход к объявлению

Усовершенствованная навигация к объявлению

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

Кроме того, Go to Declaration теперь позволяет переходить от определения функции к объявлению с несовпадающей сигнатурой, если соответствующих объявлений не обнаружено.

Страница руководства по улучшению производительности

Руководство по улучшению производительности

В руководстве по улучшению производительности собраны все настройки Visual Studio и ReSharper, которые могут повлиять на общую производительность, и указано, как их быстро изменить. Перейти к руководству можно через Environment | Performance Guide.

Объекты to-do поддерживают ссылки на внешние ресурсы

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

  • Добавлена поддержка Catch2 — свежей версии популярного фреймворка для юнит-тестирования Catch.
  • Закладки to-do поддерживают ссылки на внешние ресурсы.
  • Переработана панель предварительного просмотра в окнах инструментов и на страницах параметров форматирования.
  • Окно Find Usages поддерживает многострочные вхождения.
  • Search Everywhere всегда показывает текстовые совпадения, даже если есть другие результаты.