В MPS 2024.1 добавлена асинхронная реализация панели Logical View в окне Project, существенно улучшена поддержка Kotlin для разных платформ, заметно сокращено время выполнения тестов. Кроме того, появились условные ветвления в планах генерации, прекращена поддержка путей к проектам в TestInfo
, улучшен новый интерфейс и существенно обновлена платформа.
Подробнее о нововведениях читайте далее.
Первоначально поддержка Kotlin в MPS должна была распространяться только на общий код. Однако единственным возможным вариантом использования в MPS была компиляция в JVM, и в результате разница между общим кодом и кодом JVM становилась неочевидной.
В этом выпуске мы добавили настройку исходных наборов платформ для узлов Kotlin. Это позволяет определить целевые платформы, которые поддерживает тот или иной фрагмент кода, и скрыть объявления несовместимого кода.
В обычном проекте Kotlin вы можете использовать исходные наборы для разделения кода, предназначенного для разных платформ. В MPS эта возможность реализована на уровне корня: можно указать набор поддерживаемых платформ для каждого корневого узла Kotlin. Исходные наборы можно настроить на уровне корневого узла с помощью intention-действия.
На практике это означает следующее:
По умолчанию код Kotlin, для которого платформа не указана явно, использует JVM, гарантируя обратную совместимость.
Мы улучшили шаблоны, и теперь они поддерживают использование для разных платформ. Раньше MPS предлагал разные варианты для шаблонов Kotlin и Kotlin/JVM, при этом загружались соответственно общие шаблоны и шаблоны JVM.
Теперь вместо этих двух вариантов используется один: шаблоны Kotlin, которые автоматически определяют, какой код раскрывает тот или иной артефакт: общий код, код JVM или код для других платформ.
Поскольку объявления общих библиотек и библиотек для конкретных платформ дублируют другу друга (все артефакты содержат все необходимые объявления), мы добавили новый механизм фильтрации дубликатов для очистки шаблонов. При объявлении библиотек для конкретной платформы в том же самом модуле они получают доступ к общим объявлениям, так что объявлять их повторно не нужно.
Конфигурация зависимостей осталась прежней:
В частности, когда вы пишете общий код, нужно использовать для шаблонов общую библиотеку с общим исходным набором, но при этом артефакт Java надо объявить в фасете Java.
Раньше в коде Kotlin в MPS обнаруживалось множество ошибок typesystem
, а также ошибок области доступа, если был недоступен плагин Kotlin Typesystem на основе CodeRules. Чтобы улучшить читаемость кода и его пригодность для тестирования, мы дали возможность игнорировать эти проверки и ошибки, если плагин на основе системы типов CodeRules недоступен.
В таких случаях все области доступа в языках Kotlin заменяются областью по умолчанию, которая включает в себя все узлы совместимых концептов. В результате ложные срабатывания отсутствуют, поскольку все действительные узлы включены в область доступа.
Инструкции по работе с кодом Kotlin не изменились:
Теперь в основе панели Logical View лежит асинхронная архитектура. Это помогло сократить отклик интерфейса и в целом повысить производительность IDE. Кроме того, новая реализация упрощает добавление расширений и модификаций. Подробнее см. в статье базы знаний Реализация панели ProjectPane поверх дерева ProjectViewTree (на английском языке).
Это привело к несколькими заметным изменениям:
Мы добавили новый стиль в BaseLanguage
, который позволяет использовать постоянные ячейки в качестве плейсхолдеров, если отсутствует значение (дочерний узел или ссылка). Например, если в классе нет конструктора, вместо него может отображаться ячейка-плейсхолдер <no default constructor>
. При использовании этого стиля неизменяемые ячейки ведут себя, как должны вести себя плейсхолдеры. Курсор можно поместить только на первый символ, изменить значение невозможно. Допускаются только изменения, предусмотренные доступным в этом месте меню трансформации.
Логический параметр doNotCompile
модулей языка сборки был заменен на перечисление Java. Это позволяет лучше различать следующие случаи:
Раньше в обоих этих случаях параметр принимал значение true
.
Новое перечисление Java содержит три возможных значения:
compile in MPS
compile externally
no code
При переходе на версию 2024.1 первоначальное значение false
параметра doNotCompile
будет изменено на compile in MPS
, а значение true
параметра doNotCompile
— на compile externally
.
Небольшая новая экспериментальная функция позволяет добавить ветвление к плану генерации, не меняя исходный план. План генерации можно отметить как ветвление другого плана. Помеченный таким образом план будет обрабатываться, как если бы на него была явно сделана ссылка со стандартной инструкцией fork
в самом начале исходного плана генерации.
Кроме того, при определении ветвления можно использовать модификатор строки, служащий триггером. Ветвление произойдет, только если владельцем генерируемой модели является модуль, у которого идентификатор фасета цели генерации соответствует триггеру.
Тесты JUnit в MPS теперь могут создавать отчеты не только в форматах Vintage и Jupiter, но и в формате Open Test Reporting. Новая возможность доступна в параметрах тестирования языка сборки и позволяет сгенерировать отчет в формате Open Test. Если параметр имеет значение true
, в директории проекта создаются файлы отчета с именем junit-platform-events*-$BUILD_NAME$.xml
.
Если параметр имеет значение false
, создаются, как и раньше, отчеты для движков Vintage и Jupiter.
Теперь в отчетах MPS о тестировании соблюдается аннотация JUnit @DisplayName
, и имя добавляется в отчеты, показанные в окне отчетов о тестировании.
Раньше при выполнении теста узла или редактора MPS копировал всю тестовую модель во временные модели и делал дополнительные копии каждого узла тест-кейса (начиная с корневого NodeTestCase
или EditorTestCase
). На больших тестовых моделях это существенно снижало производительность. Кроме того, в итоге возникала странная конфигурация с дубликатами тестовых узлов. В MPS 2024.1 модели с тестами больше не копируются. Создаются копии только дочерних узлов TestNode
узла NodeTestCase
или EditorTestCase
, а также соответствующие узлы окружения (целевые узлы ссылок).
Для тестов, которые требуют открытия проекта MPS, объявления TestInfo
больше не нужны. Это касается всех вариантов выполнения тестов JUnit:
<launchtests>
, можно указать путь project path
как дополнительный параметр задачи. Если путь не указан, используется ${basedir}
, т. е. домашняя директория текущего проекта.-Dmps.test.project.path
.Поддержка существующих объявлений TestInfo
сохраняется, и их можно использовать по-прежнему.
Стремясь отделить загрузку классов от доступа к моделям и с учетом прекращения поддержки ReloadableSModule
, мы изменили порядок загрузки классов для модулей. Мы постарались ограничиться минимальными изменениями для конечных пользователей, но тем не менее после обновления могут наблюдаться проблемы с загрузкой классов, которых раньше не было.
В результате этого обновления MPS для развернутых модулей придерживается зависимостей, объявленных в module.xml
, и не пытается вычислять их при запуске на основе информации, рассеянной по файлам модуля. На этапе проектирования зависимости выводятся из информации, собранной на этапе трансформации модели. В этот момент повторные вычисления также не производятся. Старая логика, анализирующая зависимости модуля на основе файлов .mpl
или .msd
, по-прежнему доступна на случай сбоя новых методов.
Эти изменения внесены в рамках работы по улучшению фасетов модулей вообще и модулей Java в частности.
Опираясь на вычисление области доступа по умолчанию, комментированные потенциальные целевые узлы автоматически исключаются из этой области.
BaseLanguage
вводится шестнадцатеричный литерал типа long.В MPS 2024.1 переработан интерфейс и функционал терминала, так что работать с командной строкой стало проще и удобнее. Знакомый инструмент выглядит по-новому: теперь команды разбиты на отдельные блоки с удобной навигацией между ними. Мы также добавили автодополнение для команд и простой доступ к истории команд. Подробнее
Начиная с этой версии, MPS не поддерживает проекты, использующие версии Gradle старше 4.5, и не будет выполнять синхронизацию с Gradle для таких проектов.
В MPS 2024.1 проще выполнять код-ревью благодаря удобному отображению изменений, связанных с ветками. Теперь в GitHub, GitLab и Space можно посмотреть изменения в определенной ветке на отдельной вкладке Log в окне Git. Для этого нажмите на имя ветки в окне Pull Requests и выберите в меню пункт Show in Git Log.
Мы добавили визуальные индикаторы для отслеживания обновлений в процессе ревью. Если какие-то изменения требуют вашего внимания, на иконке окна появляется голубая точка. Непросмотренные пул-реквесты тоже помечаются голубой точкой, так что вы точно не пропустите изменений в ходе ревью.
Чтобы вы могли сосредоточиться только на значимых изменениях, в инструменте просмотра различий теперь можно указать, какие папки и файлы следует игнорировать в процессе сравнения. Просто щелкните правой кнопкой мыши по файлу или папке, которые не должны отображаться в результатах сравнения, и выберите Exclude from results в контекстном меню.
Перед каждым крупным релизом мы готовим инструкции по миграции с более старых версий MPS, чтобы все прошло гладко. Внимательно прочитайте обновленное руководство по миграции.