Что нового в MPS 2022.2

В MPS 2022.2 вас ждет множество улучшений, включая аннотации в окне Inspector, улучшенную поддержку Kotlin и новый API SModel.

Аннотации в окне инспектора

Аннотации в окне Inspector

Работать с аннотациями теперь можно из окна Inspector. Процесс аннотации выполняется для всего корня — вы можете запустить его, кликнув правой кнопкой мыши по левому полю окна Inspector. Аннотации отобразятся в окне Inspector, а также в специальном поле слева от редактора.

Подробнее

Улучшения для MPS Kotlin

Улучшения для MPS Kotlin

Мы исправили ряд проблем, связанных с редактированием кода, а именно:

  • Мы поддержали больше пользовательских сценариев при работе с областями (например, пользовательские типы ресиверов). Также мы улучшили возможности фильтрации (доступ к скрытым функциям, меньше повторений).
  • Мы поддержали операторы деконструкции в системе типов.
  • Мы упростили вставку чисел с плавающей запятой и длинных чисел, а также преобразование беззнаковых и знаковых чисел.
  • Теперь вы можете преобразовать стоковый литерал в многострочный просто нажав Enter. Также мы исправили проблемы со вставкой.
  • В новой версии заглушки Kotlin поддерживают загрузку аннотаций и типов функций с ресивером. К примеру, T.() -> R больше не будет загружаться как (T) -> R).
  • Лямбды:
    • Мы поддержали неявный параметр it.
    • Лямбды, тип которых включает ресивер (например, Receiver.() -> Unit), теперь корректно используют тип ресивера в качестве неявного this в теле лямбды.

Подробнее

Язык SModel для MPS Kotlin

Язык SModel для MPS Kotlin

В MPS Kotlin появилась поддержка языка SModel — jetbrains.mps.kotlin.smodel. Язык включает улучшенную поддержку компиляции и позволяет использовать код на Kotlin в модулях Language (к примеру, вы можете создавать вспомогательные классы).

Помимо обычных типов (узлов, концептов, ассоциаций и ссылок), язык поддерживает параметры типа Concept. Их можно объявлять и использовать в функциях, переменных и классах. Также вы можете использовать их повторно во внутренних типах — это упрощает процесс написания кода и позволяет задействовать приведение типов Kotlin.

Обновления компиляции Kotlin

Обновления компиляции Kotlin

Компиляция Kotlin стала более стабильной. Классы Kotlin больше не стираются при перезапуске MPS.

В билд-скриптах теперь можно указать модули, для которых необходимо использовать компилятор Kotlin. Флаг прописывается вручную, специальных проверок, выставляющих значение true, пока нет. Добавьте этот флаг, если модуль с файлами Kotlin нужно скомпилировать в JVM.

Оформление текста комментариев BaseLanguage

Оформление текста комментариев BaseLanguage

Теперь к тексту комментариев BaseLanguage можно применять стили. Поддерживаемые начертания шрифтов: полужирное (Ctrl + B), обычное (Ctrl + I), подчеркнутое (Ctrl + U) и полужирное обычное (Ctrl + B -> Ctrl + I).

Постфиксное преобразование

Постфиксное преобразование

Мы поддержали постфиксное преобразование для BaseLanguage. Теперь вы можете менять код BaseLanguage, попросту добавляя текст к выражению. Это экономит время при написании кода: вам не придется лишний раз перемещать курсор или выделять код.

Ленивое обнаружение модели с помощью SModel

Раньше MPS выявлял модели в момент регистрации в репозитории. Чтобы найти модель в обычном модуле проекта, нужно было обойти файловую систему — найти файлы и установить их типы, а также считать информацию о модели (хотя бы из заголовочного файла).

Модули узнают о модели только при наличии обращения к ней. Мы реализовали API SModule (SModule.forEachRegisteredModel()), с помощью которого можно получить доступ к моделям, о которых знает модуль, не запуская при этом поиск или загрузку модели. Новый API будет полезен, если вы используете клиенты API SModel (особенно для подклассов SRepositoryContentAdapter).

Улучшенные ассоциативные ссылки (SReference)

Новая версия MPS включает API для создания ссылок и меняет внутреннее представление ссылок. Эти изменения должны улучшить систему ссылок/хранения модели, которую мы планируем выпустить в будущем. Однако они уже позволяют сократить объем оперативной памяти любой модели примерно на 5%.

Заглушки Java

Теперь MPS учитывает версионированные JAR-файлы и предлагает классы заглушек, версия которых совпадает с запущенной версией Java.

Переход с Log4j на Java Util Logging (JUL)

Раньше MPS и платформа IntelliJ использовали урезанную версию библиотеки Log4j, для которой не было зафиксировано проблем с безопасностью. Тем не менее мы решили заменить Log4j на стандартный пакет java.util.logging. Мы добавили прослойку совместимости (на основе SLF4J), которая перенаправляет запросы API Log4j реализации Java Util Logging (JUL).

С помощью действия Debug Log Settings можно настроить уровни DEBUG и TRACE для разных категорий. Также появился конфигурационный файл bin/log.properties в формате JUL. В отличие от файла log.xml, который использовался ранее, bin/log.properties не считывается по умолчанию, но пользователи могут запросить доступ к этому (или любому другому) конфигурационному файлу через свойство idea.log.config.properties.file.

Запуск Make из командной строки

Билд-скрипты Ant, которые MPS составляет на основе объявлений lang.build, генерируют и компилируют исходники в рамках отдельных задач (<generate> в случае MPS, <javac> в случае Ant). Мы добавили новую задачу <mps.make>. Она соответствует процессу Make, запускаемому из IDE, и переводит модель в скомпилированный код. В ходе этого процесса выполняется генерация и компиляция кода. Это позволяет убить двух зайцев (и не выполнять лишнюю работу, как в случае с <javac> и <generate>), поскольку MPS все равно нужны скомпилированные классы — для загрузки классов модулей. Также это сглаживает различия между сборкой Ant, выполненной из командной строки, и процессом Make, запущенным из IDE, благодаря чему процесс сборки становится более надежным.

Подробнее

Тесты генераторов

Тесты генераторов теперь позволяют сопоставлять результаты с образцами моделей, игнорируя порядок узлов. Также появилось новое действие для переупорядочивания корней модели: с помощью него можно привести тестовые образцы моделей к нужному состоянию.

Подробнее

Временное ограничение для TextGen

MPS ограничивает время на преобразование моделей в текст (Model-to-Text), чтобы избежать ошибок в аспектах TextGen. Временное ограничение всегда прописывалось жестко. Однако в последнее время некоторые крупные модели сумели приблизиться к лимиту и вызвать тайм-аут, поэтому мы сделали этот параметр настраиваемым. Теперь вы можете самостоятельно прописать временное ограничение в настройках IDE. В будущем это значение также можено будет указать при запуске сборки из командной строки.

Оптимизация управления зависимостями Java BaseLanguage для процесса Make

Раньше MPS хранил информацию о зависимостях между генерируемыми классами BaseLanguage в файле dependencies. На основе него компилятор Java решал, нужно ли обновить зависимые скомпилированные классы. Но с 2021.2 мы начали записывать в dependencies верхнеуровневые зависимости, поэтому необходимость сохранять имена классов для каждого корня исчезла. Это ускоряет процесс TextGen для кода BaseLanguage, так как больше не нужно собирать информацию об отдельных зависимостях. Также ускоряется компиляция Java, поскольку больше не нужно анализировать зависимости между файлами, соотносить зависимости с модулями и путями, а также помечать файлы как измененные.

Файл для хранения зависимостей модуля

Зависимости модуля теперь хранятся в файле deps.cp. На основе него MPS строит граф компиляции модулей. Файл хранит состояние преобразования и перечисляет только те зависимости, которые в нем используются. Механизм принципиально отличается от механизма построения графа зависимостей, который создается во время выполнения на основе реальных зависимостей модуля.

Изменения интерфейса

Теперь по умолчанию runtime- и sandbox-решения создаются не внутри модуля Language, а наравне с ним. При этом связь между ними по-прежнему учитывается: если вы переименуете языковой модуль «main», MPS также автоматически переименует модули runtime и sandbox.

Подробнее

Составные ключи для меток сопоставления

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

Возможности платформы

Индикатор выполнения при клонировании репозитория

Индикатор выполнения при клонировании репозитория

Теперь вы можете следить за процессом клонирования репозитория — соответствующий индикатор отображается на начальном экране прямо в списке проектов.

Генерация оглавления в Markdown-файлах

Генерация оглавления в Markdown-файлах

Мы добавили действие, позволяющее сгенерировать оглавление Markdown-файла на основе заголовков в документе.

Подпись коммитов GPG-ключом

Подпись коммитов GPG-ключом

Теперь вы можете сопровождать коммиты подписью GPG. Подпись отобразится в разделе Commit Details в окне Git.

Выполнение команд из Markdown-файлов

Выполнение команд из Markdown-файлов

Если вы работаете с файлом Markdown, в котором есть команды, их можно выполнить прямо из файла, используя специальные иконки на полях редактора.

Руководство по миграции

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