MPS 2018.3: планы генерации, улучшения в языке сборки и упаковки и в языке редактора, обновленный интерфейс

в 15:31, , рубрики: domain-specific language, dsl, jetbrains, mps, Блог компании JetBrains, Программирование

Привет! Недавно мы выпустили [MPS 2018.3](https://www.jetbrains.com/mps/download/). В этой версии много новых функций, с которыми работа над проектами станет еще эффективнее. Мы улучшили планы генерации и язык описания редактора, добавили новые конструкции в язык сборки и упаковки, обновили элементы интерфейса для удобной навигации по иерархии наследования и внесли много других изменений для продуктивной работы.

image

BaseLanguage

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

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

image

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

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

image

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

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

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

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

image

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

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

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

image

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

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

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

image

Генератор

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

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

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

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

Элементы UI/UX

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

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

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

image

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

Как и в IntelliJ Platform в MPS появилась новая высококонтрастная тема. Ее можно включить в Settings/Preferences -> Appearance & Behavior.

image

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

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

image

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

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

image

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

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

image

Изменения в finders

В этой версии мы обновили и оптимизировали finders. Для асинхронного выполнения finder используйте специальное выражение OnEachNodeFoundByExpression, представляющее собой простой вызов finder c функцией обратного вызова для каждого обнаруженного узла.

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

image

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

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

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

image

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

Tips & Tricks

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

image

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

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

image

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

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

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

image

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

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

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

image

Редактор

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

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

image

Прочие улучшения

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

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

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

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

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

image

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

image

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

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

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

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

image

Скачать новую версию можно здесь, надеемся, она вас порадует. В любом случае будем ждать ваших [отзывов](https://mps-support.jetbrains.com/hc/en-us/requests/new?ticket_form_id=360000119880)! Полный список исправлений доступен на этой странице. О любых проблемах сообщайте нам, пожалуйста, в трекере.

*Ваша команда JetBrains MPS*
*The Drive to Develop*

Автор: advertka

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js