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

Вот и подоспел первый релиз CLion в этом году — 2018.1! В этом посте мы расскажем, что мы успели реализовать за эти месяцы и какие планы у нас на следующий релиз.

image

Cначала очень коротко о главном. В этот релиз вошли:

  • Поддержка языка C++
    • Поддержка возможности C++17: structured binding
    • Поддержка возможности C++17: операторы if и switch с инициализаторами
    • Множество баг-фиксов и улучшений

  • Возможность использовать файлы конфигурации Clang-Tidy в CLion, а также настраивать опции для проверок из Clang-Tidy в интерфейсе CLion
  • Улучшения для пользователей Windows
    • Компилятор Microsoft Visual C++ включен по умолчанию
    • Поддержка подсистемы WSL

  • CMake и не только
    • Вызов из IDE CMake Install
    • Шаблоны для создания файлов CMakeLists.txt
    • Возможность открыть файл или папку без проектной модели CMake

  • Экспериментальная поддержка hex view в отладчике
  • Улучшения редактора:
    • “Хлебные крошки” (breadcrumbs) для C/C++
    • Действие Unwrap
    • Сворачивание управляющих конструкций

  • Поддержка новых языков в CLion: Objective-C / Objective-C++, Rust, Fortran

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


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


Спойлеры! Мы смотрим на разные альтернативные варианты языкового движка (есть и наши наработки, и clang, и много чего еще интересного), проводим тесты, сравнения, измерения производительности, анализ возможностей по расширению. А пока все это в процессе, мы продолжаем улучшать текущий языковой движок.

Во-первых, мы исправили десятки различных проблем в парсере и анализаторе кода. Многие пользователи на стадии Early Access Program отмечали улучшения, так что верим, что все это было не зря. В частности, множество проблем и ложных ошибок в анализаторе кода исправлено для случая тернарного оператора.

Во-вторых, рефакторинги Rename и Change Signature теперь более надежно обновляют иерархии. Например, если переименовать функцию в классе-наследнике, то CLion не только предложит обновить базовый класс, но и пройдется по другим классам, унаследованным от этого базового:

image

Такие каскадные изменения просто необходимы, чтобы код после рефакторинга остался корректным.

И самое главное, добавлена поддержка двух больших возможностей C++17:

  • Structured binding
    image
  • Операторы if и switch с инициализаторами
    image

Улучшения в поддержке Clang-Tidy


В прошлом году (в версии 2017.2) мы добавили в CLion интеграцию с инструментом для анализа кода Clang-Tidy. Он предоставляет десятки различных проверок, включая группы Clang Analyzer, C++ Core Guidelines, Modernize и Google. В этом релизе мы обновили забандленную версию инструмента, чуть изменили набор проверок, включенных по умолчанию, а самое главное:

  • Добавили возможность использовать конфигурационные файлы .clang-tidy вместо настроек IDE — это может быть полезно, если хочется сохранить настройки Clang-Tidy в системе контроля версий и/или поделиться ими со всей командой (где не все используют CLion). Также это позволяет запускать Clang-Tidy как из IDE, так и из консоли на одном и том же наборе проверок, не задумываясь о том, чтобы передавать одинаковые параметры в обоих случаях.
  • Некоторые проверки Clang-Tidy позволяют указывать опции, влияющие на поведение проверки. Например, modernize-use-nullptr позволяет указать, какие константы заменять на nullptr. Сделать это можно теперь и в настройках CLion (Editor | Inspections | C/C++ | General | Clang-Tidy).

image

WSL и другие изменения тулчейна на Windows


Для начала, компилятор Microsoft Visual C++ теперь включен по умолчанию. То есть, если он у вас установлен, то можно сразу воспользоваться им в CLion (не надо, как раньше, идти и включать настройку в Registry).

Но самое заметное изменение — это поддержка Windows Subsystem for Linux (WSL). Это подсистема на Windows 10 предоставляет Linux-окружение, встроенное в Windows, и позволяет собирать, запускать и отлаживать Linux-приложения на Windows.

image

CLion теперь умеет работать с таким тулчейном и даже позволяет запускать приложение с Valgrind Memcheck — инструментом для поиска утечек памяти, некорректного доступа к памяти, использования неинициализированных переменных и пр.

image

Таким образом, WSL дает уникальную возможность запускать приложения, которые не доступны на Windows (как например, тот же Valgrind).

Кстати, если говорить про средства анализа ошибок работы с памятью, сейчас наша команда занимается интеграцией Google Sanitizers. Надеемся, что результаты будут доступны уже в 2018.2.

Стоит отметить, что интеграция WSL реализована по ssh, так как это первый шаг к полноценной поддержке удаленной разработки в CLion. Ее первый прототип мы надеемся показать уже в 2018.2. А пока можно попробовать WSL — ссылку на скрипт для быстрой настройки WSL, а также детали работы можно найти в блоге.

CMake & non-CMake


Мы начали процесс отделения проектной модели CMake от CLion. Первые результаты уже можно наблюдать в релизе 2018.1. А именно, CLion позволяет теперь открыть файл или целую папку, не имеющую CMake-файлов. Конечно, многие умные функции по работе с кодом окажутся отключены (так как все информацию о проекте CLion берет именно из проектной модели), но того, что останется, хватит для первичного ознакомления с кодом, чтения отдельных файлов и пр.

В CLion 2018.1 появилась возможность вызвать CMake Install. Соответствующее действие доступно из меню Run или в возможных шагах в Run/Debug-конфигурации (там Install можно добавить, например, сразу после сборки, но до запуска конфигурации). При вызове Install происходит запуск команды cmake install и, соответственно, устанавливаются все таргеры, для которых определена эта команда.

image

Кстати, теперь создавать файл CMakeLists.txt можно из меню создания нового файла (Create new file — Alt+Insert на Windows/Linux, ?N на macOS):

image

Преимущество в том, что файл будет создаваться по шаблону, который можно кастомизировать под свои нужды в настройках Editor | File and Code Templates.

Hex view в отладчике


Да, мы знаем, вы просили эту возможность очень давно, а embedded-разработка так вообще не представляет себе IDE без такой возможности… В CLion 2018.1 hex view экспериментальный и доступен под ключом в регистре:

  1. Идем в диалог Find Action (Shift+Ctrl+A на Linux/Windows, ??A на macOS), пишем там “Registry”, открываем Registry.
  2. Там ищем cidr.debugger.value.numberFormatting.hex (достаточно просто ввести hex и запустится поиск) и включаем опцию.
  3. Теперь идем в настройки IDE: Build, Execution, Deployment | Debugger | Data Views | C/C++ и там включаем hex view.

Отображаться hex view будет как в окне отладчика:

image
так и в самом редакторе, в Inline Variables View:

image

Почему так сложно, почему экспериментальная поддержка? Скажем так, реализация пока вызывает у нас сомнения, и хочется сделать лучше. К тому же, доступен пока hex только для целочисленных типов, и нет binary view.

Улучшения в редакторе


Хоть CLion и написан в основном на Java и Kotlin, как и вся платформа IntelliJ, у нас есть небольшая часть разработки на C++. А значит, мы, конечно, пробуем свой продукт для своих же задач. И пусть хочется, чтобы было больше dogfooding-а в нашей работе, но даже сейчас видны результаты. В этом релизе случилось сразу несколько улучшений редактора по мотивам нашего собственного использования продукта (это уже не говоря о разнообразных баг-фиксах).

“Хлебные крошки” (breadcrumbs) для C и C++ добавлены для пространств имен, классов, структур, функций и лямб. Это такой удобный способ чтения и навигации по коду — внизу редактора показываются небольшие маркеры того, где сейчас находится курсор, и можно кликать по этой иерархии маркеров, чтобы подниматься на уровень выше (например, из функции в класс, в котором она определена):

image

Платформенная возможность unwrap/remove теперь реализована и в CLion, для кода на C/C++. С помощью нее можно удалить те блоки кода, которые включают данный (где стоит курсор). Особенно это бывает полезно, чтобы убрать объемлющий тернарный оператор, вызов функции или, например, блок if..else, содержащий текущее выражение:

image

В этой версии также добавилось сворачивание управляющих конструкций if/else, do/while, for, switch (Shift+Ctrl+Period / Ctrl+= на Windows/Linux и ??./?+ на macOS). И опции для настройки сворачивания окна сообщений при сборке проекта.

Больше, чем IDE для C/C++


В CLion, помимо C/C++, уже некоторое время есть встроенная поддержка Python (аналог PyCharm Community Edition), поддержка JavaScript, XML, HTML, CSS и других веб-технологий, а также плагин для Swift. С конца прошлого года появилась поддержка Kotlin/Native (через плагин). А в версии 2018.1 мы добавили встроенную поддержку для Objective-C / Objective-C++ (список возможностей смотрите тут), а также положили в репозиторий плагин для Fortran и обновили плагин для Rust. Про последнее поподробнее. Это тот же плагин, что доступен в IntelliJ IDEA, но:

  1. Он теперь умеет работать с Cargo в CLion (раньше был только CMake)
  2. В CLion (и пока только в нем) в плагине есть отладчик для Rust

image

Подробнее про плагины для Fortran и Rust смотрите тут.

И в заключение, демонстрация новых возможностей CLion 2018.1 на английском языке от нашего девелопер-адвоката:


Вот и все! Заинтересовались? Тогда качайте 30-дневную бесплатную пробную версию с официального сайта компании, где в разделе цен можно также узнать о стоимости подписки. Следите также за статьями и обновлениями в нашем англоязычном блоге. Мы будем рады ответить на любые ваши вопросы в комментариях.

Ваша команда JetBrains CLion
The Drive to Develop

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


  1. Alex_ME
    30.03.2018 13:19

    А есть возможность просмотра памяти, как это сделано в Visual Studio и многих других IDE?

    Если не понятно, о чем речь
    image


    1. anastasiak2512 Автор
      30.03.2018 13:28

      Memory View пока нет. Надеемся, что появится в 2018.x каком-нибудь.


      1. SAKrisT
        30.03.2018 13:46

        Пройдя по ссылке, можно проголосовать. Я свой голос уже давно оставил :)


  1. eReS
    30.03.2018 14:30

    Планируется добавление Dlang?


    1. anastasiak2512 Автор
      30.03.2018 14:54

      Пока нет таких планов.


  1. dion
    30.03.2018 15:26

    Эхх. Когда вы уже поддержку ninja прикрутите… сmake_ninja_wrapper.py не предлагать, ибо от него больше проблем чем пользы.


    1. anastasiak2512 Автор
      30.03.2018 15:27

      Пока не знаем, как порешать некоторые технические проблемы. Но раз уж начали отделение CMake от CLion, может и сможем скоро сделать.


      1. borisxm
        01.04.2018 12:40

        начали отделение CMake от CLion


        Надеюсь, это не ухудшит поддержку cmake проектов.


        1. anastasiak2512 Автор
          02.04.2018 01:26

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


  1. axel92
    30.03.2018 16:26

    А почему комплектный дебагер с версии 2017.3 перестал вообще выводить на экран текст(printf)? Тяжело ориентироваться в таком режиме, по этому все еще пользуюсь версией 2017.2.3.


    1. anastasiak2512 Автор
      30.03.2018 16:31

      Мы не в курсе о чем речь, кажется. Какой дебагер — GDB или LLDB? Какая платформа? Можно пример и логи дебагера?

      Есть такая проблема на винде, но она не сейчас появилась.


      1. axel92
        30.03.2018 16:36

        Да именно такая проблема как по ссылке, этим багом занимаются?


        1. anastasiak2512 Автор
          30.03.2018 16:41

          Это, к сожалению, не очень тривиальная проблема с pty на Windows. И появилась именно с GDB 8. fflush помогает. Хорошего решения в виде фикса пока не придумали.


  1. Inobelar
    30.03.2018 16:34

    Мы начали процесс отделения проектной модели CMake от CLion

    Можно ждать поддержку QMake / Qbs?


    1. anastasiak2512 Автор
      30.03.2018 16:36

      qmake вряд ли будет первым на очереди. А вот что-то из makefiles, open folder, compilation database – весьма вероятно. А еще project model API, чтобы можно было плагины для любых проектных моделей любым желающим писать.


  1. nexmean
    31.03.2018 01:08

    А не использовать даже под дулом пистолета RLS для Rust — это у вас принципиальное решение? А то нынче ваш плагин для Rust не способен определить и 5% ошибок, только самые тривиальные, в то время как RLS выдаёт все те же ошибки, что выдаёт компилятор.


    1. anastasiak2512 Автор
      31.03.2018 13:11

      Передаю со слов разработчика плагина:


      1. по поводу RLS (Rust Language Server) — да, это принципиальное решение, так как позволяет нам использовать полноценную инфраструктуру нашей платформы (что было бы несколько затруднительно, если бы мы просто использовали RSL). Есть соответствующее issue по данному поводу https://github.com/intellij-rust/intellij-rust/issues/964 с соответствующими комментариями. Я не большой эксперт в RLS, но судя по комментариям (в том числе этому https://github.com/intellij-rust/intellij-rust/issues/964#issuecomment-328878107) за счет этого мы имеем как минимум лучший auto completion.


      2. по поводу ошибок. По умолчанию мы действительно мало что показываем в текущий момент, в этом у RLS действительно есть преимущество (так как для этого дергается компилятор). Но это можно улучшить уже сейчас как минимум двумя способами:
        • Включить cargo check (Language & frameworks > Rust > Use cargo check to analyze code). Это external annotator, которые для ошибок просто дергает компилятор. Сооответственно, он показывает все ошибки, что может показывать компилятор. К сожалению, он не очень быстрый (собственно из-за постоянного вызова компилятора), поэтому будет тормозить на не маленьких проектах и поэтому отключен по умолчанию. В целом сделан для того, чтобы иметь такую возможность, пока мы сами не заимплементим большее количество ошибок.
        • Включить инспекцию “Experimental checks”. Показывает ошибки при вводе типов (кажется одна из самых распространненых) + добавляет несколько простых quick fix’ов. Она была отключена по умолчанию, так как могла генерировать много false positive ошибок. В данный момент мы хотим включить ее по умолчанию, так как, кажется, что большинство недоработок там было поправлено.


  1. melon
    31.03.2018 11:20
    +4

    Фичи это конечно хорошо, но основаная проблема вашей среды — это дикие тормоза на больших проектах!!! И это кажется нужно решать в первую очередь, не знаю куда смотрят ваши менеджеры вообще, если честно. youtrack.jetbrains.com/issue/CPP-7168 youtrack.jetbrains.com/issue/CPP-8459. Каждый день у меня зависает Clion по 3-5 раз на дню, приходится его прибивать или юзать другой редактор(походу придётся перейти, раз вы никак не хотите это фиксить). Зависания до 300 секунд — это ни в какие ворота.


    1. anastasiak2512 Автор
      31.03.2018 13:00
      +1

      Проблем с производительностью на больших и сложных проектах действительно довольно много. И мы над ними работаем. Есть некоторые принципиальные ограничения платформы, которые, как выяснилось, очень критичны для C++. Именно с ними мы сейчас и работаем. Если точнее, есть большой план на этот год, как убирать фризы в редакторе. В 2018.1 уже попала часть изменений, связанная с фризами при печати в редакторе. Стало значительно лучше. Задачки, на которые Вы ссылаетесь, тоже есть в плане.
      И да, менеджеров у нас почти нет, но есть команда, которой не все равно, поверьте. И мы сами сожалеем, что не успеваем быстрее такие проблемы решать.


  1. melon
    31.03.2018 11:27
    +1

    А ещё конечно вот эта мега просто крутой баг! Очень мешает жить! youtrack.jetbrains.com/issue/CPP-5715 В кракце, у тебя 2 одинаковых файла cool_class.hpp в разных папках проекта. И при навигации из cool_class.cpp в разных папках ты попадаешь в тот, который находится в папке, которая выше по алфавитному порядку. Причём воспроизводитмость 100%. Бесит жутко, потому что в больших проектах имена классов часто повторяеются в разных папках. И это вы не можете поправить 2 года ?!!! Серьёзно? Да это любой студент поправит за 1 неделю! Дайте уже нормального леща вашим менеджерам, чтобы они фиксили боли разработчиков, которые реально пользуются вашей IDE, иначе всё больше народу уйдёт с неё на что-то другое.


    1. anastasiak2512 Автор
      31.03.2018 13:02

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


  1. Ktator
    31.03.2018 12:11

    А что с поддержкой Qt? Есть удобный импорт из проекта Qt Creator?


    1. anastasiak2512 Автор
      31.03.2018 13:04

      Qmake не поддерживается и я не уверена, что существует хороший конвертер из qmake в cmake. Есть как бы встроенная Import Project функциональность, но она, конечно, довольно базовая.


  1. VAAKAraceGUM
    01.04.2018 02:25

    Мне иногда кажется, что лучшим решением для CLion, на текущий момент, было бы — немного притормозить с внедрением новой функциональности и в 1 релиз все силы кинуть на фикс существующих многочисленных багов в уже существующей функциональности. За последние 2 года я насоздавал в Вашем баг-трекере более 70 откровенных багов и проблем, приводящих к тому, что пользоваться той или иной функцией IDE затруднительно или невозможно. Ни один баг так и не был поправлен. Видимо это связано с «есть более приоритетные задачи». Я разрабатываю несколько кросс-платформеных приложений и у меня возникало непонимание — почему в одной и той-же версии IDE и одном и том же проекте — баги (в области работы с исходным кодом) разные. Начал изучать вопрос и понял. У Вас существует проблема — часть фиксов, которая идет с обновлением просто не применяется к старой версии. На всех 3 моих IDE CLion на разных ОС с и с разной начальной версией установки разный набор «недоисправленных» багов. Жду момента когда смогу всецело пересесть с громоздкой и неповоротливой VS и пока так и не получается…


    1. anastasiak2512 Автор
      02.04.2018 01:25

      Давайте попробуем разобраться:

      1. «Притормозить» — именно это и означают большие переработки в парсере и огромные усилия, которые затрачиваются сейчас на кардинальные изменения для улучшения перфоманса. Потому что можно было бы и дальше делать 20-30 мелких багов методом заплаток, пока все не развалиться, а можно – перерабатывать код большими кусками. Именно вторым мы и занимаемся. Возможно, «вашим» багам не везет и они не попадают в те огромные пласты, которые связаны в общее целое и закрываются пачками в каждом релизе. Если так, ты мы приносим извинения, что «ваши» баги пока не попали в наш текущий todo-список.
      2. Отсюда вытекает и проблема с обратным портированием фиксов. К сожалению, фикс, который полностью переписывает ту или иную часть подсистемы порою очень затратно, а иногда и невозможно положить в старые версии (меняется код CLion, код платформы, код других компонент). К тому же, на старых версиях почти не бывает EAP-билдов, а значит есть риск сломать что-то и он очень велик. Конечно, каждый случай рассматривается отдельно, но портирование обратно происходит в основном только в самую близкую, то есть в текущую релизную версию (то есть например, идет EAP 2018.2, а фиксы по-возможности портируются еще в 2018.1).
      3. Ну и, наверное, самое очевидное, но все же, в команде есть разные люди, отвечающие за разный функционал. Можно всех людей на языковой поддержке занять баг-фиксами по языковой поддержке, но это не будет никак мешать заниматься реализацией поддержки удаленной разработки человеку, который отвечает за эту подсистему.