company_banner

Релиз CLion 2017.2: интеграция с Clang-Tidy, C++17 в мастере создания нового проекта, повышение производительности IDE

    Привет, Хабр! Лето в этом году местами подкачало (у команды CLion в Питере уж точно), а вот новый релиз CLion 2017.2, мы надеемся, удался! В этом посте мы хотим рассказать про новые возможности, важные баг-фиксы, и дать Вам возможность задать вопросы или поинтересоваться какими-то конкретными планами в комментариях.

    image

    Если коротко, то релиз 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 предлагает два варианта – просто удалить переменную или удалить переменную и оставить инициализацию для сохранения семантики кода:

    image

    Другое улучшение связано с приведением типов. CLion активно указывает на ситуации, где явное приведение типов необходимо. Но если раньше quick-fixes использовали только приведение типов в стиле языка C, то теперь на вооружение взяты и варианты приведения типов из C++ – static_cast, dynamic_cast, reinterpret_cast, const_cast:

    image

    В течение всего этого релизного цикла мы активно занимались исправлением багов в парсере / резолве / анализаторе кода. Изменений много и они расположены в самых разнообразных областях:

    • это и более корректный анализ кода в случае 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 выглядят так же, как и проверки встроенного анализатора кода:

    image

    То есть ошибки подсвечиваются на лету в редакторе, по Alt+Enter для некоторых проверок доступны исправления (quick-fixes).

    image

    По умолчанию мы включили не все проверки из Clang-Tidy. Какие именно включены, а какие выключены, можно посмотреть на нашей страничке на confluence. Чтобы изменить конфигурацию, нужно пойти в настройки в Settings/Preferences | Editor | Inspections | C/C++ | General | Clang-Tidy и там воспользоваться настройкой опций в формате командной строки:
    image

    Для тех, кто уже использовал 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:

    image

    С этой опцией стоит быть осторожным, так как слишком большое значение может привести к задержкам при вычислении значений при отладке.

    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:

    image

    Чтобы по выводу результата выполнения команды CMake в этом окне можно было легко понять завершена команда успешно или же отменена, соответствующий текст автоматически добавляется в конец лога ([Finished], [Reloading canceled]).

    Что касается действий навигации Go to subclass и Go to overridden functions, они теперь работают асинхронно, а чтобы отменить их, достаточно просто кликнуть мышкой в любую область за пределами всплывающего окна с результатами:

    image

    Интерфейс 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
    JetBrains
    Делаем эффективные инструменты для разработчиков

    Комментарии 38

      0
      Скажите а есть ли сейчас какой-нибудь способ работать с кодовой базой хромиума или webrtc например? Там gn + ninja.
      Я сейчас вручную генерирую здоровенный CMakeLists со всеми хедерами и инклудами и открываю его в clion. Кое как работает, но постоянно надо новые инклуды, исходники, дефайны прописывать. Есть ли другие способы?
        0
        А еще можно ли дебажить собраный gn+ninja бинарик в clion? в clion удается дебажить через gdbserver. Можно ли без него(gdbserver)?
          0
          Ну дебажить можно подключившись либо удаленно через GDB/GDBserver, либо через attach to local process, если процесс локально запущен
          0
          Пока, к сожалению, другого способа нет. Только CMake поддержан.
            0
            Ладно cmake, но то, что он еще и на make завязан жестко — очень жаль. ninja значительно быстрее работает…
              0
              Мы планируем сделать поддержку ninja генератора. Для этого надо научить CLion понимать формат соответствующих файлов и еще понять, что делать с недостающей информацией. Возможно, придется в ninja положить нужные нам изменения или какой-то обходной путь искать. В общем, мы думаем (активно), но пока решения нет.
                0
                Я сегодня статью запостил, что для этого делаю я — может опубликуют в песочнице.
                В двух словах, для вас гению через make, а для сборки использую ninja :)
        0
        А почему бы автоматически не читать настройки tidy из .clang-tidy?
        У меня проверка на tidy делается на каждый push. Специально сделал пару ошибок. Как увидеть результат tidy в CLion? Когда вы его прогоняете (он ведь довольно медленный)?

        Еще у вас всплывающие внизу справа уведомления жрут 100% CPU, пока их не закроешь :)
          0
          Clang-Tidy работает в фоне, и как закончит, все ошибки из него показываются в редакторе. Выглядит это также, как и ошибки от собственного анализатора кода.

          Что значит читать настройки автоматически? Откуда?

          Хм, про CPU, а можно скриншот и в идеале CPU snapshot? Мы что-то такого не видели.
            0
            https://drive.google.com/drive/folders/0B9A-dXORkQBvYW9DUE04T21NRXc?usp=sharing
              0
              CPU кушает gitignore плагин похоже. Плагин сторонний, у него вот есть похожие жалобы на github. Наверное, стоит написать там автору запрос, приложив CPU snapshot.
              0
              > Что значит читать настройки автоматически? Откуда?

              /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.
                0
                Теперь поняла, о чем речь. Спасибо. Вообще мы много чего еще планируем в этом направлении:


                Ваше предложение тоже где-то рядом. По-хорошему, наверное, нужен способ и читать настройки из самого clang-tidy, и уметь задавать их в IDE независимо от того, что в command line инструменте настроено.
                  0
                  Вторая ссылка — приватная :)

                  tidy работает, есть еще пара вопросов.
                  Где можно посмотреть, что процесс идет (это глаз справа вверху?)
                  Можно ли отключить ваш встроенный анализатор и оставить только tidy и проверку синтаксиса. А то, ваш анализатор C++17 не понимает (в частности инициализацию свойств через '='), и генерит ложные срабатывания — приходится на него забивать.
                    0
                    Упс, и правда. Но в общем самую правильную ссылку коллега написал — https://youtrack.jetbrains.com/issue/CPP-9129.

                    Встроенный анализатор отключается в настройках Settings | Editor | Inspections | C/C++, но есть два типа false-positive — от анализатора и от парсера кода, второй — не отключается. К сожалению, C++17 пока поддержан очень немного, но мы планируем работу в этом направлении.
                  0

                  Голосуйте, пожалуйста, за соответствующий запрос: https://youtrack.jetbrains.com/issue/CPP-9129

              0
              У нас поистине наполеоновские планы в области отладки в CLion

              Надеюсь, среди них есть и поддержка Qt в ближайших релизах. Очень уж колючий кактус с разработкой в CLion и отладкой в QtCreator…

              P.S. Те, для кого это тоже важно, могут проголосовать за это по ссылке выше.
                +1
                Забандлить эти pretty-printers к себе мы не можем по лицензионным соглашениям, но сделать удобный интерфейс для выбора их и использования в CLion в целом планируем (наверное, даже в ближайшем релизе).
                  0
                  А прямо сейчас их можно как-то неудобно добавить? Я вижу какие-то советы в issue, но опыта не хватает, чтобы понять насколько они рабочие, не говоря уже про следование им. Сделал как советовали в последнем комменте, но это извращение, а не отладка :)
                    0
                    Последний раз, когда мы смотрели, вроде через .gdbinit работало. Перепроверим.
                      0
                      Возникает ошибка, про неё уже писали.
                      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.
                        0
                        Да, в тикете такая же ошибка по сути. Мы посмотрим и отпишемся в тикете, как будут новости. Спасибо.
                +1
                Входит ли в ваши наполеоновские планы Memory View (https://youtrack.jetbrains.com/issue/CPP-3567)?
                  0
                  Да, этот тикет он как минимум в топ-10 тикетов по дебагеру, которые мы очень хотим сделать. Но пока что больше шансов, что мы начнем с hex formatting — https://youtrack.jetbrains.com/issue/OC-2305.

                  К тому же, хочется сначала разобраться с GDB 8.0 и LLDB 5.0. Кстати примерные планы на 2017.3 можно найти тут.
                    0
                    Тоже хороший тикет. Но, черт побери, надоело в консоль дебаггера лазить чтобы только лишь кусок памяти просмотреть.
                  0
                  Пофиксите плиз проблему, что когда изменяешь файл, потом удаляешь изменения, ваша git-интеграция, показывает что он изменён всё равно. Реально неудобно! И не надо, пожалуйста, подобные комменты удалять. Лучше пофиксите багу!
                    0
                    Хм, мы вроде обычно не удаляем комментарии.

                    А бага нам известна — https://youtrack.jetbrains.com/issue/IDEA-175622. Пока не готов фикс, можно воспользоваться временным решением — Refresh в Local changes помогает.
                      0
                      странно, почему-то не отправился комментарий к релизу в блоге. За тикет спасибо, буду следить!
                    0
                    Продукт интересный, но сам бы ни купил (использую рабочую лицензию). В основном пользуюсь QtCreator'ом, и вот почему:
                    * Поддержка ninja
                    * Интеграция с valgrind, мелочь а приятно
                    * В больших проектах часто сторонние библиотеки (общий код нескольких проектов) подключены из директорий за пределами корня проекта. При их правке CLion назойливо кричит что редактируется файл за пределами проекта. Меня раздражает.
                    * В продолжение последнего пукта, все эти фалы вываливаются в корень дерева проекта, из за этого что бы понять структуру, приходится пользоваться проводником :(
                    * Нет общего списка ошибок, как вообще так?

                    Кроме того, дебаггер в моих проектах даже std::string развернуть не может, причем интересно иногда QtCreator умеет разворачивать, иногда CLion.

                    Жду фиксов указанных проблем, тогда можно будет полностью перейти на CLion :)
                      0
                      В догонку (в конце я жму Enter).
                      image
                      CLion
                      CLion 2017.2.2
                      Build #CL-172.3968.17, built on August 22, 2017
                      JRE: 1.8.0_152-release-915-b11 amd64
                      JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
                      Linux 4.10.0-35-generic
                        0
                        • Ninja — CPP-870 — пока не понятно, когда будет, потому что есть техническая сложность (не полная информация о проекта, отдаваемая ninja), которую мы еще не научились решать. Некоторый workaround от пользователей, тем не менее, существует.
                        • Valgrind — сейчас ведется работа над интеграцией memcheck из valgrind
                        • То, что CLion говорит, что файл не в проекте, как нам кажется, хорошо, потому что намекает, что никакие рефакторинги работать не будут. Да и не должны вероятно в сторонних то библиотеках. Можно добавить библиотеку в sources проекта (Mark directory as).
                        • Под списком ошибок вы подразумеваете code analysis ошибки? Есть, если запустить полный анализ кода на проекте или выбранном скоупе. Так как код анализ работает на лету, то без этого, он показывается, ест-но, на текущем открытом файле.
                        • Про std::string есть несколько репортов — CPP-8693 и CPP-6828. Это проблема pretty printers в GDB, можно пока полечить указанным workaround-ом.
                          0
                          Все понятно, ждемс :) Моя структура проекта такая:

                          * ~/ui-framework/**/**.cpp
                          * ~/physics-framework/**/*.cpp
                          * ~/game-1/CMakeLists.txt
                          * ~/game-2/CMakeLists.txt
                          * ~/game-3/CMakeLists.txt

                          Всем кодом владею я. Т.е. «сторонние библиотеки» это тоже часть продукта. Скажем проект игры включает десятки исходных файлов, в то время как фреймворки — тысячи. И у меня пригорает от того что я постоянно вижу это сообщение. Я например, не понимаю почему файлы за директорией CMakeLists.txt считаются вне проекта, они явно указаны в CMakeLists.txt и должны принадлежать проекту как и файлы внутри директории с CMakeLists.txt. Мне кажется это какое-то политическое решение.

                          Список ошибок — структурированный отчёт о результатах компиляции, как в VS или Esclipse или QtCreator, кажется он везде есть. А вот в CLion нет, или я слепой :) Сейчас я наблюдаю только лог компиляции, который я должен разбирать сам. А каждая ошибка в логе компилятора излишне многословная. Кроме того, ошибки компилятора не помечаются на скроллбаре файла %)
                            0
                            Если библиотеки добавлены в CMakeLists.txt, то должны быть автоматически включены в проект. CMake на проекте без ошибок вызывается при CMake Reload?

                            CLion не показывает на данный момент ошибки компиляции в таком виде, как VS или Eclipse. Это правда.

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

                      Самое читаемое