Привет, Хабр! Лето в этом году местами подкачало (у команды 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
Поделиться с друзьями
-->

Комментарии (33)


  1. korniltsev
    25.07.2017 10:45

    Скажите а есть ли сейчас какой-нибудь способ работать с кодовой базой хромиума или webrtc например? Там gn + ninja.
    Я сейчас вручную генерирую здоровенный CMakeLists со всеми хедерами и инклудами и открываю его в clion. Кое как работает, но постоянно надо новые инклуды, исходники, дефайны прописывать. Есть ли другие способы?


    1. korniltsev
      25.07.2017 10:47

      А еще можно ли дебажить собраный gn+ninja бинарик в clion? в clion удается дебажить через gdbserver. Можно ли без него(gdbserver)?


      1. anastasiak2512
        25.07.2017 11:13

        Ну дебажить можно подключившись либо удаленно через GDB/GDBserver, либо через attach to local process, если процесс локально запущен


    1. anastasiak2512
      25.07.2017 11:12

      Пока, к сожалению, другого способа нет. Только CMake поддержан.


      1. Doktor3lo
        25.07.2017 12:25

        Ладно cmake, но то, что он еще и на make завязан жестко — очень жаль. ninja значительно быстрее работает…


        1. anastasiak2512
          25.07.2017 12:39

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


          1. Doktor3lo
            25.07.2017 12:44

            Я сегодня статью запостил, что для этого делаю я — может опубликуют в песочнице.
            В двух словах, для вас гению через make, а для сборки использую ninja :)



            1. alexey-m-ukolov
              25.07.2017 15:35
              +1

              Опубликовали — https://habrahabr.ru/post/334080/


              1. anastasiak2512
                25.07.2017 15:44

                Спасибо! Очень интересно


            1. encyclopedist
              26.07.2017 13:08

              Кстати, есть такая штука kati, которая конвертирует makefile в ninja. Написана Гуглом, используется в Андроиде.


              1. anastasiak2512
                26.07.2017 13:13

                О, интересно. Посморим. Спасибо за ссылку!


  1. Doktor3lo
    25.07.2017 12:16

    А почему бы автоматически не читать настройки tidy из .clang-tidy?
    У меня проверка на tidy делается на каждый push. Специально сделал пару ошибок. Как увидеть результат tidy в CLion? Когда вы его прогоняете (он ведь довольно медленный)?

    Еще у вас всплывающие внизу справа уведомления жрут 100% CPU, пока их не закроешь :)


    1. anastasiak2512
      25.07.2017 12:19

      Clang-Tidy работает в фоне, и как закончит, все ошибки из него показываются в редакторе. Выглядит это также, как и ошибки от собственного анализатора кода.

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

      Хм, про CPU, а можно скриншот и в идеале CPU snapshot? Мы что-то такого не видели.


      1. Doktor3lo
        25.07.2017 12:38

        https://drive.google.com/drive/folders/0B9A-dXORkQBvYW9DUE04T21NRXc?usp=sharing


        1. anastasiak2512
          25.07.2017 12:44

          CPU кушает gitignore плагин похоже. Плагин сторонний, у него вот есть похожие жалобы на github. Наверное, стоит написать там автору запрос, приложив CPU snapshot.


      1. 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.


        1. anastasiak2512
          25.07.2017 13:14

          Теперь поняла, о чем речь. Спасибо. Вообще мы много чего еще планируем в этом направлении:



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


          1. Doktor3lo
            26.07.2017 04:25

            Вторая ссылка — приватная :)

            tidy работает, есть еще пара вопросов.
            Где можно посмотреть, что процесс идет (это глаз справа вверху?)
            Можно ли отключить ваш встроенный анализатор и оставить только tidy и проверку синтаксиса. А то, ваш анализатор C++17 не понимает (в частности инициализацию свойств через '='), и генерит ложные срабатывания — приходится на него забивать.


            1. anastasiak2512
              26.07.2017 12:23

              Упс, и правда. Но в общем самую правильную ссылку коллега написал — https://youtrack.jetbrains.com/issue/CPP-9129.

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


        1. dkozh
          25.07.2017 15:16

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


  1. alexey-m-ukolov
    25.07.2017 15:27

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

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

    P.S. Те, для кого это тоже важно, могут проголосовать за это по ссылке выше.


    1. anastasiak2512
      25.07.2017 15:30
      +1

      Забандлить эти pretty-printers к себе мы не можем по лицензионным соглашениям, но сделать удобный интерфейс для выбора их и использования в CLion в целом планируем (наверное, даже в ближайшем релизе).


      1. alexey-m-ukolov
        25.07.2017 15:37

        А прямо сейчас их можно как-то неудобно добавить? Я вижу какие-то советы в issue, но опыта не хватает, чтобы понять насколько они рабочие, не говоря уже про следование им. Сделал как советовали в последнем комменте, но это извращение, а не отладка :)


        1. anastasiak2512
          25.07.2017 15:46

          Последний раз, когда мы смотрели, вроде через .gdbinit работало. Перепроверим.


          1. 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.


            1. anastasiak2512
              25.07.2017 16:20

              Да, в тикете такая же ошибка по сути. Мы посмотрим и отпишемся в тикете, как будут новости. Спасибо.


  1. joedm
    26.07.2017 20:52
    +1

    Входит ли в ваши наполеоновские планы Memory View (https://youtrack.jetbrains.com/issue/CPP-3567)?


    1. anastasiak2512
      27.07.2017 00:22

      Да, этот тикет он как минимум в топ-10 тикетов по дебагеру, которые мы очень хотим сделать. Но пока что больше шансов, что мы начнем с hex formatting — https://youtrack.jetbrains.com/issue/OC-2305.

      К тому же, хочется сначала разобраться с GDB 8.0 и LLDB 5.0. Кстати примерные планы на 2017.3 можно найти тут.


      1. joedm
        27.07.2017 16:54

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


  1. melon
    31.07.2017 16:33

    Пофиксите плиз проблему, что когда изменяешь файл, потом удаляешь изменения, ваша git-интеграция, показывает что он изменён всё равно. Реально неудобно! И не надо, пожалуйста, подобные комменты удалять. Лучше пофиксите багу!


    1. anastasiak2512
      31.07.2017 16:43

      Хм, мы вроде обычно не удаляем комментарии.

      А бага нам известна — https://youtrack.jetbrains.com/issue/IDEA-175622. Пока не готов фикс, можно воспользоваться временным решением — Refresh в Local changes помогает.


      1. melon
        01.08.2017 21:14

        странно, почему-то не отправился комментарий к релизу в блоге. За тикет спасибо, буду следить!