I would like to view this page in
В MPS 2022.2 вас ждет множество улучшений, включая аннотации в окне Inspector, улучшенную поддержку Kotlin и новый API SModel.
Работать с аннотациями теперь можно из окна Inspector. Процесс аннотации выполняется для всего корня — вы можете запустить его, кликнув правой кнопкой мыши по левому полю окна Inspector. Аннотации отобразятся в окне Inspector, а также в специальном поле слева от редактора.
Мы исправили ряд проблем, связанных с редактированием кода, а именно:
T.() -> R
больше не будет загружаться как (T) -> R
). it
. Receiver.() -> Unit
), теперь корректно используют тип ресивера в качестве неявного this
в теле лямбды. В MPS Kotlin появилась поддержка языка SModel — jetbrains.mps.kotlin.smodel. Язык включает улучшенную поддержку компиляции и позволяет использовать код на Kotlin в модулях Language (к примеру, вы можете создавать вспомогательные классы).
Помимо обычных типов (узлов, концептов, ассоциаций и ссылок), язык поддерживает параметры типа Concept. Их можно объявлять и использовать в функциях, переменных и классах. Также вы можете использовать их повторно во внутренних типах — это упрощает процесс написания кода и позволяет задействовать приведение типов Kotlin.
Компиляция Kotlin стала более стабильной. Классы Kotlin больше не стираются при перезапуске MPS.
В билд-скриптах теперь можно указать модули, для которых необходимо использовать компилятор Kotlin. Флаг прописывается вручную, специальных проверок, выставляющих значение true, пока нет. Добавьте этот флаг, если модуль с файлами Kotlin нужно скомпилировать в JVM.
Теперь к тексту комментариев BaseLanguage можно применять стили. Поддерживаемые начертания шрифтов: полужирное (Ctrl + B), обычное (Ctrl + I), подчеркнутое (Ctrl + U) и полужирное обычное (Ctrl + B -> Ctrl + I).
Мы поддержали постфиксное преобразование для BaseLanguage. Теперь вы можете менять код BaseLanguage, попросту добавляя текст к выражению. Это экономит время при написании кода: вам не придется лишний раз перемещать курсор или выделять код.
Раньше MPS выявлял модели в момент регистрации в репозитории. Чтобы найти модель в обычном модуле проекта, нужно было обойти файловую систему — найти файлы и установить их типы, а также считать информацию о модели (хотя бы из заголовочного файла).
Модули узнают о модели только при наличии обращения к ней. Мы реализовали API SModule (SModule.forEachRegisteredModel()), с помощью которого можно получить доступ к моделям, о которых знает модуль, не запуская при этом поиск или загрузку модели. Новый API будет полезен, если вы используете клиенты API SModel (особенно для подклассов SRepositoryContentAdapter).
Новая версия MPS включает API для создания ссылок и меняет внутреннее представление ссылок. Эти изменения должны улучшить систему ссылок/хранения модели, которую мы планируем выпустить в будущем. Однако они уже позволяют сократить объем оперативной памяти любой модели примерно на 5%.
Теперь MPS учитывает версионированные JAR-файлы и предлагает классы заглушек, версия которых совпадает с запущенной версией Java.
Раньше 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.
Билд-скрипты Ant, которые MPS составляет на основе объявлений lang.build, генерируют и компилируют исходники в рамках отдельных задач (<generate> в случае MPS, <javac> в случае Ant). Мы добавили новую задачу <mps.make>. Она соответствует процессу Make, запускаемому из IDE, и переводит модель в скомпилированный код. В ходе этого процесса выполняется генерация и компиляция кода. Это позволяет убить двух зайцев (и не выполнять лишнюю работу, как в случае с <javac> и <generate>), поскольку MPS все равно нужны скомпилированные классы — для загрузки классов модулей. Также это сглаживает различия между сборкой Ant, выполненной из командной строки, и процессом Make, запущенным из IDE, благодаря чему процесс сборки становится более надежным.
Тесты генераторов теперь позволяют сопоставлять результаты с образцами моделей, игнорируя порядок узлов. Также появилось новое действие для переупорядочивания корней модели: с помощью него можно привести тестовые образцы моделей к нужному состоянию.
MPS ограничивает время на преобразование моделей в текст (Model-to-Text), чтобы избежать ошибок в аспектах TextGen. Временное ограничение всегда прописывалось жестко. Однако в последнее время некоторые крупные модели сумели приблизиться к лимиту и вызвать тайм-аут, поэтому мы сделали этот параметр настраиваемым. Теперь вы можете самостоятельно прописать временное ограничение в настройках IDE. В будущем это значение также можено будет указать при запуске сборки из командной строки.
Раньше MPS хранил информацию о зависимостях между генерируемыми классами BaseLanguage в файле dependencies. На основе него компилятор Java решал, нужно ли обновить зависимые скомпилированные классы. Но с 2021.2 мы начали записывать в dependencies верхнеуровневые зависимости, поэтому необходимость сохранять имена классов для каждого корня исчезла. Это ускоряет процесс TextGen для кода BaseLanguage, так как больше не нужно собирать информацию об отдельных зависимостях. Также ускоряется компиляция Java, поскольку больше не нужно анализировать зависимости между файлами, соотносить зависимости с модулями и путями, а также помечать файлы как измененные.
Зависимости модуля теперь хранятся в файле deps.cp. На основе него MPS строит граф компиляции модулей. Файл хранит состояние преобразования и перечисляет только те зависимости, которые в нем используются. Механизм принципиально отличается от механизма построения графа зависимостей, который создается во время выполнения на основе реальных зависимостей модуля.
Теперь по умолчанию runtime- и sandbox-решения создаются не внутри модуля Language, а наравне с ним. При этом связь между ними по-прежнему учитывается: если вы переименуете языковой модуль «main», MPS также автоматически переименует модули runtime и sandbox.
Не так давно MPS поддержал работу с составными ключами для меток. Новая версия позволяет хранить составные ключи в моделях контрольных точек.
Теперь вы можете следить за процессом клонирования репозитория — соответствующий индикатор отображается на начальном экране прямо в списке проектов.
Мы добавили действие, позволяющее сгенерировать оглавление Markdown-файла на основе заголовков в документе.
Теперь вы можете сопровождать коммиты подписью GPG. Подпись отобразится в разделе Commit Details в окне Git.
Если вы работаете с файлом Markdown, в котором есть команды, их можно выполнить прямо из файла, используя специальные иконки на полях редактора.
Перед каждым крупным релизом мы готовим инструкции по миграции с более старых версий MPS, чтобы все прошло гладко. Не забудьте ознакомиться с ними.