JetBrains corporate blog
Programming
C++
C

CLion 2019.1: ClangFormat, подсветка кода через Clangd, memory view, начальная поддержка микроконтроллеров

Привет, Хабр!

У команды CLion множество отличных новостей — питерская часть команды вместе с другими коллегами успешно перебралась в новый офис, к нам присоединились новые классные разработчики, а главное, мы буквально на днях выпустили первое большое обновление в этом году, CLion 2019.1!

Работа в новой версии шла сразу по нескольким фронтам:

  • Усовершенствования поддержки языка C++: подсветка кода через Clangd, улучшения рефакторингов Extract и Rename, новая проверка на то, что функцию-член класса можно объявить статической.
  • Больше возможностей в настройках стиля написания кода: интеграция с ClangFormat, поддержка стилей именования переменных в C/C++, поддержка разных стилей для header guards.
  • Новые возможности и улучшения отладчика: просмотр состояния памяти — Memory View — для указателей, просмотр дизассемблированного кода в случае LLDB, ускорение работы пошаговой отладки.
  • CLion для микроконтроллеров, первые шаги.
  • Возможность создавать Build Targets и конфигурации для запуска/отладки в CLion, которые никак не связаны с проектной моделью.
  • Работа с другими языками программирования в строковых литералах в С/С++.
  • Новые визуальные темы и другие платформенные возможности.

CLion 2019.1 release

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

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


Clangd


Как вы уже знаете, в CLion два инструмента для поддержки языка C++ — один полностью свой, а второй основан на Clangd. Они работают совместно, дополняя друг друга и обмениваясь необходимой информацией. При этом, если производительность и критерий функциональной полноты позволяют, мы сейчас стараемся перенести умные средства по работе с кодом на C++ в CLion на инструмент на базе Clangd. Речь пока не идет про рефакторинги кода, но вот подсветка кода в 2019.1 сделана уже на базе Clangd. Это существенно улучшило “отзывчивость” редактора.

Еще несколько релизов назад мы перевели CLion на инструмент на базе Clangd при показе ошибок в редакторе. Теперь текст ошибок показывается более детально. Это пригодится, например, при отладке ошибок, связанных с перегрузкой функций:

Clang errors

К этому добавилась возможность вычисления позиции возможного исправления (quick-fix) тоже через Clangd. Само же исправление предоставляется непосредственно собственным инструментом CLion.

Еще одно интересное направление нашей работы — это написание новых проверок на инструменте парсинга кода на Clangd. Начиная с CLion 2019.1, новая проверка для кода на C++ подскажет, когда функцию-член класса можно объявить статической:

Static member check

Кстати, управление настройками этого альтернативного инструмента на Clangd можно найти в Settings/Preferences | Languages & Frameworks | C/C++ | Clangd.

Собственный инструмент парсинга кода


Производительность редактора является одной из наших самых приоритетных целей. Помимо множества небольших улучшений, в этом релизе стоит отметить существенное улучшение начального времени индексирования проекта. Оно случается не всегда, но в случаях, когда для своих проектов вы используете одни и те же библиотеки: тогда CLion может это автоматически заметить и переиспользовать символы для этих библиотек для нового открытого проекта, который их использует. Когда речь идет об STL или Boost, улучшения становятся очень заметными!

В наших планах на этот год повышение аккуратности и точности наших рефакторингов для C++. Мы начали с двух самых базовых — Rename и Extract. Для Extract мы поправили множество случаев, когда результат рефакторинга оказывался некорректным из-за неправильно учтенных квалификаторов пространства имен (например, std::), специализаций шаблонов и переопределенных имен типов (type aliases).

Применительно к Rename мы обратили внимание на случай, когда происходит переименование класса или структуры, совпадающей с именем файла, в котором они находятся. Раньше мы всегда переименовывали и файл тоже, а теперь CLion спрашивает вас о предпочтительном исходе во время рефакторинга. Можете переименовать, а можете оставить старое имя файла. В обратную сторону тоже работает — переименование файла не приводит к безусловному переименованию класса. (Где-то здесь должны быть крики из зала: “Наконец-то!”.)

Rename class

И, кстати, чуть ниже я расскажу о возможности задавать стили header guards. Так вот, если использованный в файле header guard следует заданному шаблону стиля и при этом в его имени есть имя переименованного файла, то CLion обновит и header guard!

Стили кодирования


В версии 2019.1 мы добавили возможность переключиться на ClangFormat для форматирования кода в CLion. Это включает в себя не только само действие форматирования (Ctrl+Alt+L на Windows/Linux, ⌥⌘L на macOS) или автоформатирование при печати кода, но и форматирование перед коммитом (pre-commit hook), при генерации кода средствами CLion, при рефакторингах и при применении исправлений (quick-fixes). В общем, в любом месте, где IDE форматирует код, будет вызываться ClangFormat.

Переключиться на ClangFormat можно глобально — в настройках Settings/Preferences | Editor | Code Style. А можно только для конкретного проекта. Причем, если в проекте будет обнаружен конфигурационный файл .clang-format, CLion предложит переключиться на ClangFormat именно с использованием этого конфигурационного файла:

ClangFormat

Чуть больше деталей можно найти в нашем блоге (на английском).

Именование переменных, типов и других символов в коде — сложный, порою даже философский вопрос. Но в мире программирования (для улучшения читаемости кода) давно придумали стили именования. Есть стиль LLVM, есть Qt, есть Google. Поэтому в настройках CLion Settings/Preferences | Editor | Code Style | C/C++ теперь появилась новая вкладка — Naming Convention, в которой можно выбрать один из предопределенных стилей или настроить свой, задав стиль именования для различных типов символов (макросов, глобальных функций, членов класса, параметров, локальных переменных и пр.). Выбранная конвенция будет использоваться во всех действиях IDE — кодогенерации, рефакторинга, автоматических исправлениях и т. д. Кроме того, если хочется еще более точно следить за выполнением правил именования, можно включить новую проверку Inconsistent Naming, которая покажет имена, не соответствующие правилам, и предложит вариант переименования:

Naming convention

В этой же вкладке можно найти настройки стиля header guards, которые я упоминала выше:

Header Guards

Кстати, если вы предпочитаете использовать #pragma, то просто поправьте шаблон новых заголовочных файлов в Settings/Preferences | Editor | File and Code Templates.

Отладчик


Просмотр памяти Memory View


У нас наконец дошли руки до просмотра памяти в отладчике. В текущей версии можно посмотреть память по указателю: достаточно встать на любой указать в панели Variables во время отладки и запросить Memory View (Ctrl+Enter на Windows/Linux, ⌘Enter на macOS). А если вкладка memory view открыта при пошаговой отладке, то в ней можно видеть подсвеченные изменения в памяти:

Memory View

На следующий релиз уже запланированы изменения в UI/UX, но сначала хотелось бы собрать отзывы от пользователей. Так что пишите!

Дизассемблирование в случае LLDB


Ассемблерный код теперь разбит по функциям и, главное, показывается не только в случае GDB, но и для LLDB!

Disassembler LLDB

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

Производительность пошаговой отладки


Иногда пошаговая отладка затягивается из-за длительного вычисления переменных на каждом шаге. Но ведь порою эти вычисления никому не нужны — хочется как можно быстрее пройти какую-то область кода по шагам, изредка просматривая значения пары переменных! Теперь в CLion появилась возможность отключить пересчет переменных при пошаговой отладке — Mute Variables в контекстном меню отладчика делает ровно это. А когда понадобится вычислить и отобразить значения, на переменной можно нажать Load:

Mute variables

CLion для микроконтроллеров


Илья Моторный (elmot) уже писал здесь на Хабре про свой плагин для интеграции CLion с STM32CubeMX и поддержкой отладчика OpenOCD. В конце прошлого года Илья присоединился к нашей команде и уже успел существенно обновить плагин и перенести его внутрь CLion.

CubeMX integration

Довольно большой и детальный блог пост по обновленному плагину можно найти в нашем блоге. Здесь же я опишу самое главное, что теперь можно сделать:

  • В диалоге New Project можно создать проект STM32CubeMX (.ioc).
  • Прямо из CLion запустить для проекта STM32CubeMX, чтобы обновить настройки микроконтроллера и сгенерировать код для проекта.
  • CLion при этом сам сгенерирует корректный CMake-файл для работы с этим проектом.
  • CLion предложит выбор конфигурационного файла для железа (board config).
  • Для отладки с помощью OpenOCD нужно создать конфигурацию специального типа “OpenOCD Download and Run”. Для проекта STM32CubeMX CLion создаст такую сам. Указав все настройки, можно отлаживаться на микроконтроллере прямо из CLion!

У Ильи много грандиозных планов, поэтому нам очень важны ваши отзывы. Так что, если вам интересна разработка под встроенные системы в CLion, ждем вас в комментариях!

Проектно-независимые таргеты и конфигурации


Некоторое время назад список поддерживаемых проектных моделей в CLion был расширен Gradle C++ и compilation database. С последним были проблемы, связанные с тем, что формат не включает информацию о сборке всего проекта, поэтому ни сборка, ни запуск, ни отладка проекта в случае compilation database не были возможны. Да и просто в случае известной CLion проектной модели, иногда хочется иметь таргет, который просто собирается какой-то командой в терминале.

Теперь для таких случаев есть Custom Targets (Settings/Preferences | Build, Execution, Deployment | Custom Build Targets) и Custom Run/Debug Configurations (Run | Edit Configurations…). В случае таргета надо задать параметры внешних инструментов (external tools), которые будут использоваться при сборке и очистке проекта:

Custom targets

А в случае проектно-независимой конфигурации для запуска и отладки надо указать таргет, исполняемый файл и желаемые аргументы для запуска:

Custom configuration

Injected Language


Встречаются ли в вашем коде строковые литералы, внутри которых запрос SQL, HTML код или регулярное выражение? Если да, то наверняка вам бы хотелось хотя бы подсветить код внутри литерала в соответствии с его происхождением. Теперь это возможно! Временно включить в строковом литерале другой язык можно простым нажатием Alt+Enter и выбором опции “Inject language or reference”. Теперь выбираем нужный нам язык и в еще недавно обычном строковом литерале появляется подсветка выбранного языка, а также все специальные действия. Самый яркий пример — регулярные выражения и возможность проверки строки на соответствие им прямо в IDE:

Injected language

И многое другое


Продукты в компании JetBrains как правило создаются не одной небольшой командой, а командой всей соответствующей платформы. Поэтому в CLion попадают возможности из IntelliJ IDEA, WebStorm, AppCode, DataGrip, PyCharm и пр. В этом релизе из таких улучшений стоит отметить:

  • Просмотр всех мест в коде проекта, где разработчик производил какие-то изменения или просто читал код, — Recent Locations Popup (Shift+Ctrl+E на Win/Lin, ⇧⌘E на macOS).
  • Создание новых тем для интерфейса IDE, в дополнение к стандартным светлой, темной (Darcula) и контрастной (High-Contrast). Примеры таких тем-плагинов и пошаговый туториал можно найти в нашей документации.
  • Кстати, о плагинах. Если вы пишете на Rust, то наверняка знаете, что есть плагин IntelliJ Rust. В CLion его версия включает поддержку Cargo и отладчик. А с новым релизом в плагине появились инструменты профилирования кода на Линуксе и macOS, возможность автодополнения еще не импортированных символов, а также другие улучшения.

На этом пока все. Спасибо, если дочитали до конца!

Демо


Ну, и традиционный ролик о новых возможностях CLion 2019.1 (на английском):


Вопросы, пожелания, баг-репорты и просто мысли высказывайте в комментариях! Мы будем рады ответить.

Ваша команда JetBrains CLion
The Drive to Develop
+15
4.5k 21
Comments 37
Top of the day