company_banner

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

    Привет, Хабр! Недавно мы выпустили MPS 2018.3. В этой версии много новых функций, с которыми работа над проектами станет еще эффективнее. Мы улучшили планы генерации и язык описания редактора, добавили новые конструкции в язык сборки и упаковки, обновили элементы интерфейса для удобной навигации по иерархии наследования и внесли много других изменений для продуктивной работы.


    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<T>, что обеспечит методы 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

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


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

    JetBrains
    214,00
    Делаем эффективные инструменты для разработчиков
    Поделиться публикацией

    Похожие публикации

    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое