Что нового в MPS 2024.1

В MPS 2024.1 добавлена асинхронная реализация панели Logical View в окне Project, существенно улучшена поддержка Kotlin для разных платформ, заметно сокращено время выполнения тестов. Кроме того, появились условные ветвления в планах генерации, прекращена поддержка путей к проектам в TestInfo, улучшен новый интерфейс и существенно обновлена платформа.

Подробнее о нововведениях читайте далее.

Улучшенная поддержка разных платформ для Kotlin

Первоначально поддержка Kotlin в MPS должна была распространяться только на общий код. Однако единственным возможным вариантом использования в MPS была компиляция в JVM, и в результате разница между общим кодом и кодом JVM становилась неочевидной.

В этом выпуске мы добавили настройку исходных наборов платформ для узлов Kotlin. Это позволяет определить целевые платформы, которые поддерживает тот или иной фрагмент кода, и скрыть объявления несовместимого кода.

Исходные наборы

В обычном проекте Kotlin вы можете использовать исходные наборы для разделения кода, предназначенного для разных платформ. В MPS эта возможность реализована на уровне корня: можно указать набор поддерживаемых платформ для каждого корневого узла Kotlin. Исходные наборы можно настроить на уровне корневого узла с помощью intention-действия.

На практике это означает следующее:

  • Коду из определенного исходного набора доступны только объявления на совместимых платформах. Например, код для JVM получает доступ только к коду, предназначенному для JVM, и общему коду, для которого JVM является целевой платформой.
  • Сгенерированные исходники распределяются по директориям исходных наборов. Если директория не определена, используется исходный набор по умолчанию, соответствующий настройкам по умолчанию для модуля.
  • Мы обеспечили поддержку ожидаемых и фактических объявлений.

По умолчанию код Kotlin, для которого платформа не указана явно, использует JVM, гарантируя обратную совместимость.

Загрузка и компиляция шаблонов

Мы улучшили шаблоны, и теперь они поддерживают использование для разных платформ. Раньше MPS предлагал разные варианты для шаблонов Kotlin и Kotlin/JVM, при этом загружались соответственно общие шаблоны и шаблоны JVM.

Теперь вместо этих двух вариантов используется один: шаблоны Kotlin, которые автоматически определяют, какой код раскрывает тот или иной артефакт: общий код, код JVM или код для других платформ.

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

Конфигурация зависимостей осталась прежней:

  • И общие библиотеки, и библиотеки конкретных платформ можно использовать в качестве шаблонов.
  • Библиотеки JVM необходимы для компиляции общего кода в JVM, поэтому они должны быть объявлены в фасете Java.

В частности, когда вы пишете общий код, нужно использовать для шаблонов общую библиотеку с общим исходным набором, но при этом артефакт Java надо объявить в фасете Java.

Улучшение читаемости Kotlin без системы типов CodeRules

Раньше в коде Kotlin в MPS обнаруживалось множество ошибок typesystem, а также ошибок области доступа, если был недоступен плагин Kotlin Typesystem на основе CodeRules. Чтобы улучшить читаемость кода и его пригодность для тестирования, мы дали возможность игнорировать эти проверки и ошибки, если плагин на основе системы типов CodeRules недоступен.

В таких случаях все области доступа в языках Kotlin заменяются областью по умолчанию, которая включает в себя все узлы совместимых концептов. В результате ложные срабатывания отсутствуют, поскольку все действительные узлы включены в область доступа.

Инструкции по работе с кодом Kotlin не изменились:

  • Писать и проверять код на Kotlin следует, включив CodeRules и установив плагин Kotlin Typesystem.
  • Читать и генерировать Kotlin можно и без них.

Новая реализация панели Logical View

Теперь в основе панели Logical View лежит асинхронная архитектура. Это помогло сократить отклик интерфейса и в целом повысить производительность IDE. Кроме того, новая реализация упрощает добавление расширений и модификаций. Подробнее см. в статье базы знаний Реализация панели ProjectPane поверх дерева ProjectViewTree (на английском языке).

Это привело к несколькими заметным изменениям:

  • Индикаторы ошибок и предупреждений больше недоступны.
  • Как ошибки, так и предупреждения, обнаруженные в иерархии, подчеркиваются красным.
  • Параметр Show Descriptor Models распространяется на все модели дескрипторов.
  • В некоторых случаях перетаскивание работает по-новому.
  • Настройки на панели Logical View были немного реорганизованы.

Ячейки-плейсхолдеры

Мы добавили новый стиль в BaseLanguage, который позволяет использовать постоянные ячейки в качестве плейсхолдеров, если отсутствует значение (дочерний узел или ссылка). Например, если в классе нет конструктора, вместо него может отображаться ячейка-плейсхолдер <no default constructor>. При использовании этого стиля неизменяемые ячейки ведут себя, как должны вести себя плейсхолдеры. Курсор можно поместить только на первый символ, изменить значение невозможно. Допускаются только изменения, предусмотренные доступным в этом месте меню трансформации.

Изменения в языке сборки

Логический параметр doNotCompile модулей языка сборки был заменен на перечисление Java. Это позволяет лучше различать следующие случаи:

  • Модуль вообще не содержит кода.
  • Модуль содержит код, но этот код компилируется с помощью других инструментов, а не MPS.

Раньше в обоих этих случаях параметр принимал значение true.

Новое перечисление Java содержит три возможных значения:

  • compile in MPS
  • compile externally
  • no code

При переходе на версию 2024.1 первоначальное значение false параметра doNotCompile будет изменено на compile in MPS, а значение true параметра doNotCompile — на compile externally.

Условные ветвления в планах генерации

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

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

XML-отчеты JUnit5 в MPS

Тесты JUnit в MPS теперь могут создавать отчеты не только в форматах Vintage и Jupiter, но и в формате Open Test Reporting. Новая возможность доступна в параметрах тестирования языка сборки и позволяет сгенерировать отчет в формате Open Test. Если параметр имеет значение true, в директории проекта создаются файлы отчета с именем junit-platform-events*-$BUILD_NAME$.xml.

Если параметр имеет значение false, создаются, как и раньше, отчеты для движков Vintage и Jupiter.

Использование аннотацииJUnit5 @DisplayName в отчетах о тестировании

Теперь в отчетах MPS о тестировании соблюдается аннотация JUnit @DisplayName, и имя добавляется в отчеты, показанные в окне отчетов о тестировании.

Улучшения тестовой среды выполнения

Раньше при выполнении теста узла или редактора MPS копировал всю тестовую модель во временные модели и делал дополнительные копии каждого узла тест-кейса (начиная с корневого NodeTestCase или EditorTestCase). На больших тестовых моделях это существенно снижало производительность. Кроме того, в итоге возникала странная конфигурация с дубликатами тестовых узлов. В MPS 2024.1 модели с тестами больше не копируются. Создаются копии только дочерних узлов TestNode узла NodeTestCase или EditorTestCase, а также соответствующие узлы окружения (целевые узлы ссылок).

Путь к проекту в TestInfo больше не требуется

Для тестов, которые требуют открытия проекта MPS, объявления TestInfo больше не нужны. Это касается всех вариантов выполнения тестов JUnit:

  • Если тест выполняется из IDE (как внутри процесса, так и вне его), используется уже открытый проект.
  • Если тест выполняется с использованием задачи <launchtests>, можно указать путь project path как дополнительный параметр задачи. Если путь не указан, используется ${basedir}, т. е. домашняя директория текущего проекта.
  • В особых случаях, когда ни один из этих вариантов не подходит, можно указать местоположение проекта с помощью системной настройки -Dmps.test.project.path.

Поддержка существующих объявлений TestInfo сохраняется, и их можно использовать по-прежнему.

Полностью переработанная загрузка классов модулей

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

В результате этого обновления MPS для развернутых модулей придерживается зависимостей, объявленных в module.xml, и не пытается вычислять их при запуске на основе информации, рассеянной по файлам модуля. На этапе проектирования зависимости выводятся из информации, собранной на этапе трансформации модели. В этот момент повторные вычисления также не производятся. Старая логика, анализирующая зависимости модуля на основе файлов .mpl или .msd, по-прежнему доступна на случай сбоя новых методов.

Эти изменения внесены в рамках работы по улучшению фасетов модулей вообще и модулей Java в частности.

Исключение комментированных узлов из областей доступа (доступно также в версии 2022.3.2)

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

Другое

  • В BaseLanguage вводится шестнадцатеричный литерал типа long.
  • Если необходимо мигрировать проект при наличии несовместимости версий модуля и модели (в частности, если в модуле указана другая версия языка, чем в модели), появляется всплывающее окно с уведомлением. Оно предлагает действие, которое показывает все модули с совместимыми версиями. Это удобно при слиянии отмигрированного кода, поскольку позволяет убедиться, что после слияния отображаются правильные версии языка и модуля.
  • Модули в devkit на панели Logical View отображаются как узлы «модуль-ссылка». Аналогичным образом представлены модули среды выполнения в модуле языка.

Исправленные ошибки

  • Как обычно, в новой версии мы исправили немало ошибок. Полный список устраненных проблем приведен здесь.

Обновления платформы

Новый терминал в новом интерфейсе

Бета-версия

В MPS 2024.1 переработан интерфейс и функционал терминала, так что работать с командной строкой стало проще и удобнее. Знакомый инструмент выглядит по-новому: теперь команды разбиты на отдельные блоки с удобной навигацией между ними. Мы также добавили автодополнение для команд и простой доступ к истории команд. Подробнее

Уменьшение масштаба IDE

Теперь масштаб интерфейса можно не только увеличить, но и уменьшить до 90%, 80% или 70%.

Изменения в поддержке версий Gradle

Начиная с этой версии, MPS не поддерживает проекты, использующие версии Gradle старше 4.5, и не будет выполнять синхронизацию с Gradle для таких проектов.

Различные возможности работы с VCS

Просмотр изменений в ветках на вкладке Log

В MPS 2024.1 проще выполнять код-ревью благодаря удобному отображению изменений, связанных с ветками. Теперь в GitHub, GitLab и Space можно посмотреть изменения в определенной ветке на отдельной вкладке Log в окне Git. Для этого нажмите на имя ветки в окне Pull Requests и выберите в меню пункт Show in Git Log.

Реакции на комментарии в код-ревью

В MPS 2024.1 можно реагировать на комментарии к пул-реквестам на GitHub и мердж-реквестам на GitLab с помощью эмодзи.

Создание пул/мердж-реквестов из уведомлений о пуше изменений

После отправки изменений в систему контроля версий IDE в одном уведомлении сообщит вам об успешном пуше и предложит создать пул- или мердж-реквест.

Индикаторы обновлений кода в GitHub, ожидающих одобрения

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

Предотвращение коммитов больших файлов в репозитории

Чтобы избежать отклонения изменений из-за размера файлов, в IDE добавлена проверка перед коммитом, которая не позволяет коммитить слишком большие файлы и сообщает об ограничении.

Фильтр веток на вкладке History в окне Git

В окне Git кнопка Show all branches заменена на фильтр веток, позволяющий просматривать изменения в указанной ветке для конкретного файла. Во-вторых, панель инструментов теперь располагается горизонтально для удобства использования.

Улучшенный поиск в диалоге Branches

Во окне Branches теперь можно фильтровать результаты поиска по действиям и репозиториям для более быстрой и точной навигации в системе контроля версий.

Опция слияния Allow unrelated histories

В раскрывающемся меню диалога Merge into теперь есть опция Allow unrelated histories. При выборе этой опции можно объединить две ветки, даже если у них нет общей истории.

Исключение папок и файлов из сравнения

Чтобы вы могли сосредоточиться только на значимых изменениях, в инструменте просмотра различий теперь можно указать, какие папки и файлы следует игнорировать в процессе сравнения. Просто щелкните правой кнопкой мыши по файлу или папке, которые не должны отображаться в результатах сравнения, и выберите Exclude from results в контекстном меню.

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

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