Если коротко, то релиз CLion 2017.2 посвящен:
- Расширению возможностей анализатора кода (это касается как встроенного, так и стороннего инструмента – CLang-Tidy)
- C++17 в мастере создания нового проекта
- Поддержке PCH для MSVC (мы ниже обязательно расшифруем все аббревиатуры!)
- Force Step Into в отладчике
- Автоматическому созданию Google Test конфигураций для таргетов, слинкованных с gmock
- Отменяемым асинхронным действиям навигации и загрузки CMake
- Общим улучшения производительности
- И еще многому другому!
Готовы попробовать уже сейчас? Скачивайте бесплатную 30-дневную версию с нашего сайта и вперед!
Нужно больше подробностей? Детали ниже. Кстати, попробовать все новые возможности можно на небольшом демо-проекте, который мы специально подготовили для этих целей.
Анализатор кода
Новые quick-fixes и улучшения корректности парсера
Quick-fixes в CLion позволяют исправлять потенциальные проблемы в коде в одно нажатие
Alt+Enter
. В этом релизе мы улучшили некоторые из них.Так, например, ранее можно было только удалить неиспользуемую переменную. Но, если конструктор у такой переменной нетривиальный, то это может быть не вполне корректное исправление. Теперь CLion предлагает два варианта – просто удалить переменную или удалить переменную и оставить инициализацию для сохранения семантики кода:
Другое улучшение связано с приведением типов. CLion активно указывает на ситуации, где явное приведение типов необходимо. Но если раньше quick-fixes использовали только приведение типов в стиле языка C, то теперь на вооружение взяты и варианты приведения типов из C++ –
static_cast
, dynamic_cast
, reinterpret_cast
, const_cast
:В течение всего этого релизного цикла мы активно занимались исправлением багов в парсере / резолве / анализаторе кода. Изменений много и они расположены в самых разнообразных областях:
- это и более корректный анализ кода в случае
std::enable_if
, - и поддержка
va_*
макросов (анализатор раньше ошибочно помечал переменные, используемые только в этих макросах, как неиспользуемые), - и более правильная работа с функциями, которые принимают пакет параметров и еще не-шаблонные аргументы,
- и корректная работа с вложенными шаблонными типами в STL контейнерах для GCC 5 / 6,
- и многое-многое другое.
Тут сразу стоит оговориться, что на следующий релиз план немного другой. Мы планируем вместо точечных исправлений переписать целый пласт кода внутри нашей языковой поддержки.
Не буду вдаваться сильно в подробности, но лишь скажу, что мы, основываясь на предыдущем опыте, проанализировали, где больше всего проблем, отсортировали эти области снизу вверх и выбрали те проблемные области, которые лежат в основе остальных. Ими и будем заниматься. Кстати, год назад мы уже занимались такой переделкой в overload resolution, и отзывы пользователей были очень позитивные.
Интеграция с Clang-Tidy
Помимо улучшений во встроенном анализаторе кода, мы решили увеличить количество разнообразных проверок и quick-fixes за счет популярного и быстро развивающегося сейчас инструмента на базе Clang – Clang-Tidy. Самым большим аргументом в его пользу является частичная поддержка проверок из C++ Core Guidelines, которые сейчас активно продвигают в сообществе C++ разработчиков Бьерн Страуструп и Херб Саттер. Но это не единственное его достоинство!
Важным аргументом является возможность писать свои собственные проверки и добавлять их в Clang-Tidy.
Что же из себя представляет интеграция Clang-Tidy в CLion? Для пользователя IDE проверки из Clang-Tidy выглядят так же, как и проверки встроенного анализатора кода:
То есть ошибки подсвечиваются на лету в редакторе, по
Alt+Enter
для некоторых проверок доступны исправления (quick-fixes).По умолчанию мы включили не все проверки из Clang-Tidy. Какие именно включены, а какие выключены, можно посмотреть на нашей страничке на confluence. Чтобы изменить конфигурацию, нужно пойти в настройки в Settings/Preferences | Editor | Inspections | C/C++ | General | Clang-Tidy и там воспользоваться настройкой опций в формате командной строки:
Для тех, кто уже использовал Clang-Tidy на своих проектах, строка будет очень знакомой – это тот список включенных/выключенных проверок, который передается Clang-Tidy при запуске из командной строки. Так, например, для включения только проверок из C++ Core Guidelines надо написать
-*,cppcoreguidelines-*
.А как насчет своих собственных проверок? Точно так же! Добавляйте их в Clang-Tidy, который используется в CLion, и они автоматически появятся в редакторе CLion. Правда, если быть честными до конца, сейчас есть пара тонкостей, которые надо учитывать:
- Clang-Tidy необходимо брать из нашего репозитория, где лежит версия с нашими изменениями для корректной работы с CLion. Как только наши патчи примут в LLVM (они сейчас на ревью) и изменения попадут в мастер, можно будет использовать основную ветку LLVM. Подробнее о том, где искать наш репозиторий и какие именно патчи, можно почитать в блоге.
- В релиз не успела попасть настройка UI для смены Clang-Tidy, так что пока надо заменять бинарник встроенного Clang-Tidy. Но это будет поправлено, мы надеемся, в одном из ближайших обновлений.
C++17 в мастере создания нового проекта
История этого изменения началась с того, что мы включили CMake 3.8 в CLion 2017.2. А именно в этой версии CMake появилась возможность привычным образом указывать версию стандарта языка в CMake файлах –
set(CMAKE_CXX_STANDARD 17)
— такую строчку генерирует CLion при создании нового проекта. И теперь в мастере создания нового проекта в выпадающем списке стандартов C++ появился дополнительный пункт – C++17.PCH для MSVC
Как я и обещала, расшифровываю использованные аббревиатуры. Поддержка precompiled headers в CLion (то есть корректный резолв символов из таких файлов и их правильная подсветка в редакторе) появилась еще в прошлом релизе. Но это касается не всех компиляторов, а только для GCC и Clang. Microsoft Visual C++ compiler (MSVC) поддерживается в CLion в экспериментальном режиме также с прошлого релиза. Но именно в случае с MSVC необходимо и широко распространено использование PCH. Так что мы добавили эту поддержку и для данного случая. Некоторые тонкости и ограничения описаны в запросе в трекере.
Отладчик
У нас поистине наполеоновские планы в области отладки в CLion, но в этом релизе нашей целью были исправления ошибок и доработки текущей функциональности.
Так, после релиза CLion 2017.1 стало понятно, что не очень удобно использовать обычное действие Step Into для того, чтобы попадать на код на дизассемблере при отладке. Зачастую пользователям хочется, чтобы при обычных шагах в отладчике CLion пропускал все фреймы, для которых нет исходного кода. Так что теперь Step Into (
F7
) работает именно так; а чтобы попасть на код на дизассемблере, следует использовать Force Step Into (Shift+Alt+F7
).Еще одно важное изменение в отладчике — это дополнительная опция в Registry для просмотров массивов во время отладки. Дело в том, что для улучшения производительности CLion подгружает и показывает не весь массив сразу, а только некоторое количество элементов. По умолчанию это 50 элементов. Чтобы посмотреть следующие 50, надо нажать Expand. И так каждые 50 элементов.
Теперь в Registry доступна опция
cidr.debugger.value.maxChildren
, равная по умолчанию 50 и определяющая количество элементов, которые необходимо подгружать с каждым нажатием Expand:С этой опцией стоит быть осторожным, так как слишком большое значение может привести к задержкам при вычислении значений при отладке.
Gmock и Google Test конфигурации
CLion поддерживает Google Test и Catch фреймворки для модульного тестирования. Поддержка включает в себя встроенное специальное окно с выводом результатов тестов (test runner). Для того, чтобы туда попадали результаты тестов, необходимо использовать специальную конфигурацию Google Test или Catch при запуске тестов. Для Google Test она создается автоматически для любого таргета в CMake, слинкованного с gtest. А теперь еще и для любого, слинкованного с gmock.
Отменяемые действия навигации и загрузки CMake
В фокусе этого релиза была производительность IDE. Например, мы уменьшили время индексации за счет более оптимальной обработки компиляторных макросов (compiler-predefined macros). Были и другие улучшения в этом направлении.
Помимо обычной работы над производительностью IDE, мы решили передать больше возможностей управления в руки пользователей. Для этого мы начали некоторые действия в IDE делать асинхронными и отменяемыми, чтобы пользователь мог не ждать действия, которые по каким-то причинам выполняется очень долго, а быстро и безболезненно отменить его.
Первыми такими действиями стали – перезагрузка CMake и действия навигации (Go to subclass и Go to overridden functions). В случае CMake в соответствующем инструментальном окне добавилась кнопка отмены работающей команды CMake:
Чтобы по выводу результата выполнения команды CMake в этом окне можно было легко понять завершена команда успешно или же отменена, соответствующий текст автоматически добавляется в конец лога ([Finished], [Reloading canceled]).
Что касается действий навигации Go to subclass и Go to overridden functions, они теперь работают асинхронно, а чтобы отменить их, достаточно просто кликнуть мышкой в любую область за пределами всплывающего окна с результатами:
Интерфейс Find in Path, улучшения поддержки систем контроля версий и другое
CLion – это продукт на основе платформы IntelliJ, а значит, на него распространяются следующие изменения:
- Улучшенный пользовательский интерфейс поиска Find in Path
- Новые возможности встроенной VCS поддержки, такие как Git Revert, Reword и настройки редактирования commit messages
- Улучшения в поддержке мониторов с высоким разрешением (HiDPI)
Подробнее оних можно почитать в посте про релиз IntelliJ IDEA 2017.2 здесь, на Хабре.
Демонстрация новых возможностей CLion 2017.2 на английском языке от нашего девелопер-адвоката (автора того самого Catch фреймворка):
Если вам стало интересно, скачайте 30-дневную бесплатную пробную версию с официального сайта компании, где в разделе цен можно также узнать о стоимости подписки.
Следите также за статьями и обновлениями в нашем англоязычном блоге. Мы будем рады ответить на любые ваши вопросы в комментариях.
Ваша команда JetBrains CLion
The Drive to Develop
Комментарии (33)
Doktor3lo
25.07.2017 12:16А почему бы автоматически не читать настройки tidy из .clang-tidy?
У меня проверка на tidy делается на каждый push. Специально сделал пару ошибок. Как увидеть результат tidy в CLion? Когда вы его прогоняете (он ведь довольно медленный)?
Еще у вас всплывающие внизу справа уведомления жрут 100% CPU, пока их не закроешь :)anastasiak2512
25.07.2017 12:19Clang-Tidy работает в фоне, и как закончит, все ошибки из него показываются в редакторе. Выглядит это также, как и ошибки от собственного анализатора кода.
Что значит читать настройки автоматически? Откуда?
Хм, про CPU, а можно скриншот и в идеале CPU snapshot? Мы что-то такого не видели.Doktor3lo
25.07.2017 12:38https://drive.google.com/drive/folders/0B9A-dXORkQBvYW9DUE04T21NRXc?usp=sharing
anastasiak2512
25.07.2017 12:44CPU кушает gitignore плагин похоже. Плагин сторонний, у него вот есть похожие жалобы на github. Наверное, стоит написать там автору запрос, приложив CPU snapshot.
Doktor3lo
25.07.2017 13:07> Что значит читать настройки автоматически? Откуда?
/Applications/CLion.app/Contents/bin/clang/clang-tidy --help
…
-config= —
Specifies a configuration in YAML/JSON format:
-config="{Checks: '*',
CheckOptions: [{key: x,
value: y}]}"
When the value is empty, clang-tidy will
attempt to find a file named .clang-tidy for
each source file in its parent directories.anastasiak2512
25.07.2017 13:14Теперь поняла, о чем речь. Спасибо. Вообще мы много чего еще планируем в этом направлении:
Ваше предложение тоже где-то рядом. По-хорошему, наверное, нужен способ и читать настройки из самого clang-tidy, и уметь задавать их в IDE независимо от того, что в command line инструменте настроено.Doktor3lo
26.07.2017 04:25Вторая ссылка — приватная :)
tidy работает, есть еще пара вопросов.
Где можно посмотреть, что процесс идет (это глаз справа вверху?)
Можно ли отключить ваш встроенный анализатор и оставить только tidy и проверку синтаксиса. А то, ваш анализатор C++17 не понимает (в частности инициализацию свойств через '='), и генерит ложные срабатывания — приходится на него забивать.anastasiak2512
26.07.2017 12:23Упс, и правда. Но в общем самую правильную ссылку коллега написал — https://youtrack.jetbrains.com/issue/CPP-9129.
Встроенный анализатор отключается в настройках Settings | Editor | Inspections | C/C++, но есть два типа false-positive — от анализатора и от парсера кода, второй — не отключается. К сожалению, C++17 пока поддержан очень немного, но мы планируем работу в этом направлении.
dkozh
25.07.2017 15:16Голосуйте, пожалуйста, за соответствующий запрос: https://youtrack.jetbrains.com/issue/CPP-9129
alexey-m-ukolov
25.07.2017 15:27У нас поистине наполеоновские планы в области отладки в CLion
Надеюсь, среди них есть и поддержка Qt в ближайших релизах. Очень уж колючий кактус с разработкой в CLion и отладкой в QtCreator…
P.S. Те, для кого это тоже важно, могут проголосовать за это по ссылке выше.anastasiak2512
25.07.2017 15:30+1Забандлить эти pretty-printers к себе мы не можем по лицензионным соглашениям, но сделать удобный интерфейс для выбора их и использования в CLion в целом планируем (наверное, даже в ближайшем релизе).
alexey-m-ukolov
25.07.2017 15:37А прямо сейчас их можно как-то неудобно добавить? Я вижу какие-то советы в issue, но опыта не хватает, чтобы понять насколько они рабочие, не говоря уже про следование им. Сделал как советовали в последнем комменте, но это извращение, а не отладка :)
anastasiak2512
25.07.2017 15:46Последний раз, когда мы смотрели, вроде через .gdbinit работало. Перепроверим.
alexey-m-ukolov
25.07.2017 16:18Возникает ошибка, про неё уже писали.
Traceback (most recent call last):
File "", line 1, in File "/opt/qt/Tools/QtCreator/share/qtcreator/debugger/gdbbridge.py", line 36, in import tempfile
File "/home/ukolov/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/171.4694.31/bin/gdb/lib/python2.7/tempfile.py", line 35, in from random import Random as _Random
File "/home/ukolov/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/171.4694.31/bin/gdb/lib/python2.7/random.py", line 48, in from binascii import hexlify as _hexlify
ImportError: No module named binascii
/home/ukolov/.gdbinit:2: Error in sourced command file:
Error while executing Python code.
anastasiak2512
25.07.2017 16:20Да, в тикете такая же ошибка по сути. Мы посмотрим и отпишемся в тикете, как будут новости. Спасибо.
joedm
26.07.2017 20:52+1Входит ли в ваши наполеоновские планы Memory View (https://youtrack.jetbrains.com/issue/CPP-3567)?
anastasiak2512
27.07.2017 00:22Да, этот тикет он как минимум в топ-10 тикетов по дебагеру, которые мы очень хотим сделать. Но пока что больше шансов, что мы начнем с hex formatting — https://youtrack.jetbrains.com/issue/OC-2305.
К тому же, хочется сначала разобраться с GDB 8.0 и LLDB 5.0. Кстати примерные планы на 2017.3 можно найти тут.joedm
27.07.2017 16:54Тоже хороший тикет. Но, черт побери, надоело в консоль дебаггера лазить чтобы только лишь кусок памяти просмотреть.
melon
31.07.2017 16:33Пофиксите плиз проблему, что когда изменяешь файл, потом удаляешь изменения, ваша git-интеграция, показывает что он изменён всё равно. Реально неудобно! И не надо, пожалуйста, подобные комменты удалять. Лучше пофиксите багу!
anastasiak2512
31.07.2017 16:43Хм, мы вроде обычно не удаляем комментарии.
А бага нам известна — https://youtrack.jetbrains.com/issue/IDEA-175622. Пока не готов фикс, можно воспользоваться временным решением — Refresh в Local changes помогает.melon
01.08.2017 21:14странно, почему-то не отправился комментарий к релизу в блоге. За тикет спасибо, буду следить!
korniltsev
Скажите а есть ли сейчас какой-нибудь способ работать с кодовой базой хромиума или webrtc например? Там gn + ninja.
Я сейчас вручную генерирую здоровенный CMakeLists со всеми хедерами и инклудами и открываю его в clion. Кое как работает, но постоянно надо новые инклуды, исходники, дефайны прописывать. Есть ли другие способы?
korniltsev
А еще можно ли дебажить собраный gn+ninja бинарик в clion? в clion удается дебажить через gdbserver. Можно ли без него(gdbserver)?
anastasiak2512
Ну дебажить можно подключившись либо удаленно через GDB/GDBserver, либо через attach to local process, если процесс локально запущен
anastasiak2512
Пока, к сожалению, другого способа нет. Только CMake поддержан.
Doktor3lo
Ладно cmake, но то, что он еще и на make завязан жестко — очень жаль. ninja значительно быстрее работает…
anastasiak2512
Мы планируем сделать поддержку ninja генератора. Для этого надо научить CLion понимать формат соответствующих файлов и еще понять, что делать с недостающей информацией. Возможно, придется в ninja положить нужные нам изменения или какой-то обходной путь искать. В общем, мы думаем (активно), но пока решения нет.
Doktor3lo
Я сегодня статью запостил, что для этого делаю я — может опубликуют в песочнице.
В двух словах, для вас гению через make, а для сборки использую ninja :)
anastasiak2512
Как-то так http://nevkontakte.com/2015/rogue-ninja-support-in-clion.html?
alexey-m-ukolov
Опубликовали — https://habrahabr.ru/post/334080/
anastasiak2512
Спасибо! Очень интересно
encyclopedist
Кстати, есть такая штука kati, которая конвертирует makefile в ninja. Написана Гуглом, используется в Андроиде.
anastasiak2512
О, интересно. Посморим. Спасибо за ссылку!