JetBrains Meta Programming System MPS 2019.2 - новые функции в подсистемах
В Meta Programming System MPS 2019.2 JetBrains подготовил много новых функций в различных подсистемах и исправил ряд ошибок.
Перечисляемые типы данных
Новый способ объявления перечисляемых типов данных позволяет определить список вариантов в компактной форме, указав для каждого варианта именованное значение. При необходимости вы можете настроить способ отображения некоторых значений или выбрать значение по умолчанию, которое будет использоваться, если свойству не было явно задано какое-либо значение.
Также усовершенствовали аспекты языка SModel, касающиеся работы со свойствами перечисляемых типов. Теперь при чтении и записи свойств используются типизированные экземпляры перечисляемых членов вместо исходных элементарных значений, что помогает разработчикам писать код с меньшим количеством ошибок.
В язык SModel был добавлен оператор Enum Switch для множественного выбора членов перечисления. Его также можно использовать как выражение для вычисления различных значений в зависимости от того, какой член перечисления удовлетворяет требованиям.
Индивидуальная настройка сообщений об ошибках
Уже довольно давно JetBrains получал просьбы реализовать возможность настройки в MPS некоторых сообщений об ошибках. Благодаря запросу, поступившему от одного из коммерческих клиентов, JetBrains смог присвоить этой функциональности максимальный приоритет. Теперь можно настраивать все сообщения об ошибках, касающиеся проверки ограничений. В следующих версиях JetBrains собирается сделать эти возможности по настройке доступными и для других видов ошибок.
В этой версии JetBrains добавил новый аспект языка под названием «feedback». Этот аспект можно использовать для настройки текста сообщений об ошибках, связанных с проверкой структуры, ограничениями свойств и областей видимости.
Обратите внимание: вы можете задать свой feedback, расширив предоставляемый набор языков обратной связи. Например, можно описать feedback, который будет подсвечивать ребра или вершины в редакторе диаграмм.
Чтобы получать настраиваемые сообщения об ошибках для ограничений canBe*, используйте язык ограничений на основе правил.
Язык ограничений на основе правил
JetBrains создал язык ограничений на основе правил, который в будущем заменит доступное в настоящий момент ограничение canBe* из стандартного языка ограничений MPS. В настоящее время язык ограничений на основе правил является экспериментальной функциональностью, поэтому, вероятнее всего, сильно изменится в последующих релизах.
На данный момент предыдущий вариант ограничений остается приоритетным, поэтому, чтобы ввести ограничения на основе правил, старые ограничения canBe* нужно полностью удалить. Новый язык определения ограничений более декларативный, он требует указывать набор изолированных ограничений (правил) вместо одного условного блока.
В версии 2019.2 это позволяет получать индивидуальное сообщение об ошибке для каждого правила в отдельности.
В меню Git теперь есть новое действие, позволяющее отобразить историю изменений в VCS для конкретного корня. Действие доступно из контекстного меню редактора
Обратите внимание, что сбор данных об истории корня, как и любое другое действие VCS, связанное с историей, занимает много времени. В строке состояния есть индикатор выполнения, который поможет вам оценить временные затраты
Поиск по данным
Теперь доступен полнотекстовый поиск по значениям свойств. Действие Edit–>Find–>Find Text in Project action (Ctrl+Alt+Shift+F) позволяет находить узлы со свойствами, в значениях которых встречается указанный текст.
Проверка на конкретные ошибки
Один из распространенных сценариев использования языка для написания тестов — это проверка узлов на наличие сообщений об ошибках и предупреждений. В некоторых случаях подсистема тестирования MPS не различала разные виды ошибок, затрагивающие один и тот же узел. Это могло приводить к путанице: даже если пользователь явно указывал ожидаемый тип ошибки в аннотации теста, другие ошибки и предупреждения, затрагивающие соответствующий узел, не генерировали ошибок тестирования.
Имейте в виду, что при переходе на новую версию некоторые тесты могут не пройти, поскольку теперь они будут подавлять только те предупреждения и ошибки, которые пользователь указывает в аннотации к проверке.
Шаблоны в определениях правил проверки
Если вы определили правило проверки для концепта, оно будет вызываться для каждого узла, являющегося экземпляром этого концепта.
Теперь вместо переопределения каждого правила, унаследованного от родительского концепта, вы можете явно указать список правил, которые необходимо переопределить. Мы настоятельно рекомендуем просмотреть все ваши правила проверки, использующие функцию overrides, и указать, какие правила следует переопределять.
Раньше можно было определить правило проверки для концепта с помощью языка шаблонов. Эта возможность служила для ограничения условий применимости правила (по сравнению с правилами, определенными исключительно для концепта), а также для удобного именования свойств, дочерних и внучатых элементов, и т.д. Для обеих целей подойдет применение языка шаблонов внутри тела правила, в частности, использование оператора match в верхней части блока do
Java 11 в качестве среды выполнения
MPS теперь будет запускаться в JDK 11. Это повлияет на механизм загрузки моделей-заглушек. Большей части вашего проекта миграция не потребуется, за исключением редких случаев использования некоторых классов и полей, которые были переупакованы в JDK 11.
При использовании плагина для IntelliJ IDEA модули с MPS Facet теперь должны быть ассоциированы с JDK версии 11. В противном случае генерация кода завершится неудачно.
API-фасад для проверки соответствия типов
Теперь запросы проверки соответствия типов можно выполнять только с помощью нового API-фасада.
Новый API: см. jetbrains.mps.typechecking.TypecheckingFacade и связанные с ним классы.
Устаревший API: иерархия пакетов jetbrains.mps.typesystem.* теперь является устаревшей. Использовать классы из этой иерархии не рекомендуется, за исключением кода, автоматически сгенерированного из содержимого аспекта typesystem.
Планируемые изменения в будущих релизах
Вот предварительный план изменений, затрагивающих поддержку систем типов:
- Аспект, отвечающий за реализацию системы типов, и использующийся в нем язык будут объявлены устаревшими. Со временем язык и его поддержка в среде выполнения будут вынесены в отдельный плагин.
- Будет добавлен новый аспект, который фактически заменит часть аспекта typesystem, не относящуюся к системе типов. Для извлечения правил проверки из старого аспекта typesystem будет предоставлена миграция.
- Будет реализован новый фреймворк проверки соответствия типов с поддержкой со стороны среды выполнения, вследствие чего устаревшие механизмы будут переписаны с нуля.
Сборка в фоне
JetBrains повысил отзывчивость интерфейса во время фоновой сборки. Если процесс сборки был отправлен в фоновый режим один раз, он всегда будет производиться в фоне при последующих выполнениях. Действие сохраняется в меню Preferences-> Project Settings-> Perform in background.
BaseLanguage
Одной из главных целей данного релиза были улучшения в BaseLanguage. JetBrains исправил ряд проблем, затрагивающих языки BaseLanguage, начиная с ошибок и заканчивая проблемами, влияющими на удобство использования.
Проверка орфографии в комментариях BL
Теперь доступна проверка орфографии для однострочных комментариев, текста Javadoc и строковых литералов.
Новый образец проекта
JetBrains учел пожелания сообщества и добавил новый образец проекта с генерацией XML.
Локальная конфигурация Git
Теперь настройки merge-драйвера являются не глобальными, а локальными (отдельными для каждого Git-репозитория), благодаря чему каждая установленная копия MPS может иметь свой merge-драйвер.