Что нового в MPS 2018.3

BaseLanguage

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

На полях концептов и интерфейс-концептов появились иконки переопределенных/реализованных концептов, которые упрощают навигацию к дочерним концептам.

Настраиваемые пакеты для классов BaseLanguage

В предыдущих версиях MPS Java-пакет сгенерированных классов однозначно определялся именем модели, в которой находились исходные элементы. В новой версии для BaseLanguage Classifiers добавлено свойство packageName, позволяющее переопределить имя конечного Java-пакета. Свойство packageName имеет смысл только для BL classifiers верхнего уровня, как и в случае с Java classifiers.

Новые возможности генераторов для расширений BaseLanguage

Для языка BaseLanguage часто создают расширения. Однако для некоторых расширений бывает непросто написать подходящий генератор. Мы добавили в BaseLanguage несколько новых концептов, чтобы упростить процесс написания генераторов для расширений.

Генерация Lvalue-выражений

Lvalue-выражение представляет собой переменную, в которую можно произвести чтение или запись значения. В некоторых случаях сгенерировать Lvalue-выражение трудно, поскольку оно может зависеть от контекста, в котором используется. Новый вспомогательный концепт generic lvalue-expression упростит генератор и сделает его контекстно-независимым.

В новой версии можно обернуть любое Lvalue-выражение выражением @byRef. Генератор BaseLanguage преобразует обернутое выражение в выражение типа Reference <T>, что обеспечит методы get и set для обернутой переменной.

Подробнее о новых концептах читайте в этой статье.

Преобразование Lvalue-выражения в ссылки

Некоторые выражения включают другие Lvalue-выражения для осуществления более сложных операций с переменными (например, выражения plus assignment или increment and get). Вводить конструкции с такой семантикой было трудно, потому что для них непросто написать правильный генератор.

Поддержка default-методов

В новой версии MPS вы можете создавать default-методы в интерфейсах BaseLanguage. Ключевое слово default реализуется концептом DefaultModifier — расширением концепта Modifier. DefaultModifier содержится в языке jetbrains.mps.baseLanguage.jdk8, поэтому, чтобы создать default-метод в интерфейсе, импортируйте язык jdk8.

Генератор

Язык генератора (язык трансформации моделей)

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

Макроc $WEAVE$ и weaving-правила теперь научились вызывать шаблоны с аргументами. Кроме того, мы исправили неприятный, хотя и не очень заметный дефект, возникающий при одновременном использовании скомпилированных и интерпретируемых шаблонов. «Внедрение» (weave) внешнего шаблона из интерпретируемого кода раньше всегда приводило к интерпретации, теперь же будет работать скомпилированный шаблон (конечно, при условии, что использование скомпилированных шаблонов включено в свойствах генератора). Аналогичным образом работает «внедрение» (weave) интерпретируемого внешнего шаблона из скомпилированного.

QueriesGenerated, набор скомпилированных модельных запросов для модели с шаблонами, всегда полагался на соглашение имен и механизм Java reflection для исполнения кода. Вы могли видеть это в стектрейсах, когда в модельном запросе из генератора что-то прошло не так. Мы, наконец, избавились от этого механизма.

Элементы UI/UX

Поддержка тачбара MacBook

Обладатели макбуков с тачбаром теперь могут использовать его для работы в MPS: например, вызывать действия запуска, сборки и отладки приложения из тачбара, а также быстро выбирать run/debug конфигурацию или создавать новую. Элементы управления тачбара можно настроить в меню Preferences | Appearance & Behavior | Menus and Toolbars.

И конечно, возможности тачбара можно расширить! Просто добавьте нужное действие в соответствующую InterfaceGroup'.

Высококонтрастная тема

В MPS появилась новая высококонтрастная тема интерфейса. Ее можно включить в Preferences -> Appearance & Behavior.

Инструменты для поиска deprecated кода

В меню Migration | Deprecated Code собраны действия для поиска deprecated кода и работы с его использованиями. Find Usages of Deprecated группирует результаты поиска по предполагаемой версии удаления, что помогает определить критичность и выбрать, какие из использований следует удалить в первую очередь.

Иконки для навигации по переопределенным/реализованным behavior-методам

На полях behavior-классов мы добавили иконки для навигации по переопределенным/реализованным behavior-методам. Ниже показан список методов getPresentation(), которые переопределяют или реализуют выбранный метод. Из списка можно легко перейти к любому из указанных методов.

Улучшения всплывающих окон для навигации по переопределенным элементам

Всплывающие окна переопределенных/реализованных концептов/классов/методов стали асинхронными. Это означает, что MPS будет добавлять результаты поиска во всплывающее окно в фоновом режиме. Кроме того, теперь можно фильтровать результаты поиска по имени объекта.

Изменения в finders

В этой версии мы обновили и оптимизировали finders. Для асинхронного выполнения finder используйте специальное выражение OnEachNodeFoundByExpression, представляющее собой простой вызов finder c функцией обратного вызова для каждого обнаруженного узла. Также изменились настройки поиска использований (Find Usages settings) для концептов. Мы добавили опции поиска Concept Ancestors и Derived Concepts, которые выдают список родительских и дочерних концептов соответственно. Кроме того, возможности поиска для behavior-методов были расширены опциями Overridden Methods и Overriding Methods.

Игнорирование ошибок

В MPS можно игнорировать ошибки на узлах. Это удобно в случаях, когда ошибка отображается в редакторе, но в конкретном контексте не имеет смысла (например, в шаблонах генератора). Раньше возможности для подавления таких ошибок были негибкими. Если узел был аннотирован атрибутом SuppressErrorAnnotation, то на нем вызывали интеншен Suppress error for node . Применение этого интеншена подавляло все виды ошибок на этом узле и всех его потомках — таким образом могли быть проигнорированы актуальные ошибки.

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

Редактор

Повторное использование cell action maps

Элементы сell action map из существующего action map можно использовать повторно при помощи импортов.

Язык сборки и упаковки

Tips & Tricks

В RCP (Rich Client Platform) приложения раньше по умолчанию добавлялись tips & tricks из MPS. Теперь tips & tricks для своего приложения возможно переопределять с помощью с новой конструкции tips & tricks в билд-скрипте. Как и раньше можно использовать tips из дистрибутива MPS или определять их самостоятельно в каталоге или solution-модуле и импортировать.

Язык описания Tips & Tricks

Чтобы импортировать tips & tricks в билд-скрипт из solution-модуля, создайте solution и импортируйте языки jetbrains.mps.build.tips и jetbrains.mps.core.xml. Затем создайте экземпляр концепта MPSTipsAndTricks и опишите в нем ваши tips (советы). Каждый совет представляет собой HTML-текст и может содержать не более одного изображения.

Способы упаковки

Мы пометили способ упаковки (custom packaging) в BuildMps_IdeaPlugin как deprecated. Вместо него используйте способ упаковки в конструкции BuildMpsLayout_Plugin.

Способ сборки Auto packaging помещает все модули типа language и solution в папку ‘languages’ корневого каталога плагина, а опция Manual packaging позволяет разработчику задавать структуру плагина самостоятельно.

Новая конструкция языка сборки и упаковки

Мы расширили возможности тестовой конфигурации (test configuration) в языке сборки и упаковки. Теперь в ней можно указывать дополнительные IntelliJ IDEA плагины, которые должны быть загружены для выполнения MPS тестов из Ant.

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

Прочее

Полностью компилируемые datatypes

Двигаясь в направлении полностью компилируемых языков, мы создали полностью сгенерированные datatypes. Вся сгенерированная информация о datatypes доступна через SModel API.

Сохранение данных миграции в аннотациях

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

В скрипте миграции, создающем узлы с данными, нужно объявить концепт таких узлов и использовать конструкцию putData () для вставки каждой такой аннотации в модель:

Извлечение узлов, содержащих данные, выполняется так же, как и раньше:

Изменения в диалоге разрешения конфликтов

Раньше при конфликте можно было применить изменения только с одной стороны. Но иногда важно не потерять и другие изменения.

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

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