Привет, Хабр! Недавно мы выпустили MPS 2018.3. В этой версии много новых функций, с которыми работа над проектами станет еще эффективнее. Мы улучшили планы генерации и язык описания редактора, добавили новые конструкции в язык сборки и упаковки, обновили элементы интерфейса для удобной навигации по иерархии наследования и внесли много других изменений для продуктивной работы. На полях концептов и интерфейс-концептов появились иконки переопределенных/реализованных концептов, которые упрощают навигацию к дочерним концептам. В предыдущих версиях MPS Java-пакет сгенерированных классов однозначно определялся именем модели, в которой находились исходные элементы. В новой версии для BaseLanguage Classifiers добавлено свойство packageName, позволяющее переопределить имя конечного Java-пакета. Свойство packageName имеет смысл только для BL classifiers верхнего уровня, как и в случае с Java classifiers. Для языка BaseLanguage часто создают расширения. Однако для некоторых расширений бывает непросто написать подходящий генератор. Мы добавили в BaseLanguage несколько новых концептов, чтобы упростить процесс написания генераторов для расширений. Lvalue-выражение представляет собой переменную, в которую можно произвести чтение или запись значения. В некоторых случаях сгенерировать Lvalue-выражение трудно, поскольку оно может зависеть от контекста, в котором используется. Новый вспомогательный концепт generic lvalue-expression упростит генератор и сделает его контекстно-независимым.  Некоторые выражения включают другие Lvalue-выражения для осуществления более сложных операций с переменными (например, выражения plus assignment или increment and get). Вводить конструкции с такой семантикой было трудно, потому что для них непросто написать правильный генератор. В новой версии можно обернуть любое Lvalue-выражение выражением @byRef. Генератор BaseLanguage преобразует обернутое выражение в выражение типа Reference<T>, что обеспечит методы get и set для обернутой переменной. Подробнее о новых концептах читайте в этой статье. В новой версии MPS вы можете создавать default-методы в интерфейсах BaseLanguage. Ключевое слово default реализуется концептом DefaultModifier — расширением концепта Modifier. DefaultModifier содержится в языке jetbrains.mps.baseLanguage.jdk8, поэтому, чтобы создать default-метод в интерфейсе, импортируйте язык jdk8. Мы убрали макрос $INCLUDE$, заменив его использование на $CALL$. Соответствующая миграция поможет обновить ваши проекты. Макрос $INCLUDE$ не поддерживает шаблоны с аргументами, а наличие двух схожих по функциональности макросов усложняет язык. Макроc $WEAVE$ и weaving-правила теперь научились вызывать шаблоны с аргументами. Кроме того, мы исправили неприятный, хотя и не очень заметный дефект, возникающий при одновременном использовании скомпилированных и интерпретируемых шаблонов. «Внедрение» (weave) внешнего шаблона из интерпретируемого кода раньше всегда приводило к интерпретации, теперь же будет работать скомпилированный шаблон (конечно, при условии, что использование скомпилированных шаблонов включено в свойствах генератора). Аналогичным образом работает «внедрение» (weave) интерпретируемого внешнего шаблона из скомпилированного. QueriesGenerated, набор скомпилированных модельных запросов для модели с шаблонами, всегда полагался на соглашение имен и механизм Java reflection для исполнения кода. Вы могли видеть это в стектрейсах, когда в модельном запросе из генератора что-то прошло не так. Мы, наконец, избавились от этого механизма. Обладатели макбуков с тачбаром теперь могут использовать его для работы в MPS: например, вызывать действия запуска, сборки и отладки приложения из тачбара, а также быстро выбирать run/debug конфигурацию или создавать новую. Элементы управления тачбара можно настроить на странице Settings/Preferences | Appearance & Behavior | Menus and Toolbars. И конечно, возможности тачбара можно расширить! Просто добавьте нужное действие в соответствующую InterfaceGroup. Как и в IntelliJ Platform в MPS появилась новая высококонтрастная тема. Ее можно включить в Settings/Preferences -> Appearance & Behavior. В меню Migration | Deprecated Code собраны действия для поиска deprecated кода и работы с его использованиями. Find Usages of Deprecated группирует результаты поиска по предполагаемой версии удаления, что помогает определить критичность и выбрать, какие из использований следует удалить в первую очередь. На полях behavior-классов мы добавили иконки для навигации по переопределенным/реализованным behavior-методам. Ниже показан список методов getPresentation(), которые переопределяют или реализуют выбранный метод. Из списка можно легко перейти к любому из указанных методов. Всплывающие окна переопределенных/реализованных концептов/классов/методов стали асинхронными. Это означает, что MPS будет добавлять результаты поиска во всплывающее окно в фоновом режиме. Кроме того, теперь можно фильтровать результаты поиска по имени объекта. В этой версии мы обновили и оптимизировали finders. Для асинхронного выполнения finder используйте специальное выражение OnEachNodeFoundByExpression, представляющее собой простой вызов finder c функцией обратного вызова для каждого обнаруженного узла. Также изменились настройки поиска использований (Find Usages settings) для концептов. Мы добавили опции поиска Concept Ancestors и Derived Concepts, которые выдают список родительских и дочерних концептов соответственно. Кроме того, возможности поиска для behavior-методов были расширены опциями Overridden Methods и Overriding Methods. В MPS можно игнорировать ошибки на узлах. Это удобно в случаях, когда ошибка отображается в редакторе, но в конкретном контексте не имеет смысла (например, в шаблонах генератора). Раньше возможности для подавления таких ошибок были негибкими. Если узел был аннотирован атрибутом ‘SuppressErrorAnnotation’, то на нем вызывали интеншен ‘Suppress error for node …’. Применение этого интеншена подавляло все виды ошибок на этом узле и всех его потомках — таким образом могли быть проигнорированы актуальные ошибки. Теперь появилась возможно игнорировать только определенные виды ошибок. Выбранная ошибка будет проигнорирована для данного узла и всех его потомков, но при этом все остальные сообщения будут отображаться. Подробнее о новых возможностях управления ошибками читайте в документации. В RCP (Rich Client Platform) приложения раньше по умолчанию добавлялись tips & tricks из MPS. Теперь tips & tricks для своего приложения возможно переопределять с помощью с новой конструкции tips & tricks в билд-скрипте. Как и раньше можно использовать tips из дистрибутива MPS или определять их самостоятельно в каталоге или solution-модуле и импортировать. Чтобы импортировать 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 конструкции. Элементы сell action map из существующего action map можно использовать повторно при помощи импортов. Двигаясь в направлении полностью компилируемых языков, мы создали полностью сгенерированные datatypes. Вся сгенерированная информация о datatypes доступна через SModel API. Мы реализовали новый способ сохранения данных при миграциях, который рекомендуем использовать в дальнейшем. Производный узел, содержащий данные, теперь должен быть прикреплен к любому узлу, расположенному достаточно близко к месту, к которому относятся эти данные.  В скрипте миграции, создающем узлы с данными, нужно объявить концепт таких узлов и использовать конструкцию putData () для вставки каждой такой аннотации в модель:  Извлечение узлов, содержащих данные, выполняется так же, как и раньше: Раньше при конфликте можно было применить изменения только с одной стороны. Но иногда важно не потерять и другие изменения. Это касается изменений соседних узлов, находящихся в одной и той же множественной роли. Теперь после применения изменений с одной стороны конфликта изменения из другой ветки будут отображены как добавление. Чтобы закончить разрешение конфликта, это добавление нужно обязательно применить или отклонить. После применения изменений с левой стороны конфликта можно применить или проигнорировать строку с правой стороны: Скачать новую версию можно здесь, надеемся, она вас порадует. В любом случае будем ждать ваших отзывов! Полный список исправлений доступен на этой странице. О любых проблемах сообщайте нам, пожалуйста, в трекере. Ваша команда JetBrains MPS
The Drive to Develop Менеджер по маркетингу в СНГ, JetBrains