MPS 2018.3 最新变化

BaseLanguage

概念重写/实现的图标

MPS 使用重写/实现的图标来标记概念,帮助您轻松导航到当前概念的超概念或子概念。

BaseLanguage 类的自定义包

很长一段时间以来,管理生成类的 Java 包的唯一方法是通过包含模型的名称。 不过,使用新的分类器属性 “packageName”,您可以管理生成类的 Java 包。 此属性也可用于根分类器。

BaseLanguage 扩展的新一代工具

BaseLanguage 始终需要通过大量扩展进行自定义。 不过,对于某些扩展,实现适当的生成器可能非常棘手。 现在,BaseLanguage 提供了几个新的生成时概念,帮助简化编写扩展的生成器。

生成左值表达式

左值表达式计算为可以使用值读取或写入的变量。 对于某些情况,生成左值表达式十分困难,因为它可能取决于使用表达式的上下文类型。 现在,全新的 'generic lvalue-expression' 生成时概念可以用来简化生成器,而且不需要上下文。

幸运的是,在新版本中,您可以使用 '@byRef' 表达式包装任意的左值表达式。 BaseLanguage 生成器随后将包装的表达式转换为 'Reference <T>' 类型的表达式,这将为您提供包装变量的 get 和 set 操作。

这两个新引入的生成时概念在本文中有更详细的介绍。

将左值转换为引用

某些表达式可以聚合其他左值表达式,使用从聚合表达式(例如,plus assignment 或 increment and get 表达式)生成的变量进行复合操作。 引入具有此类语义的新表达式并不可行,因为很难为此类结构编写适当的生成器。

BaseLanguage 中的默认方法支持

在 2018.3 版中,MPS 可以在 BaseLanguage 接口中创建 'default' 方法。 'default' 关键字由 DefaultModifier 概念实现,此概念扩展了 BaseLanguage 中的 Modifier 概念。 DefaultModifier 位于 jetbrains.mps.baseLanguage.jdk8 语言中。 这意味着,要在接口中创建 'default' 方法,您需要导入 jdk8 语言。

生成器

生成器语言

$INCLUDE$ 宏已被弃用,有一个将其实例替换为 $CALL$ 的迁移。 前者不支持带参数的模板,而我们没有必要同时保持这两种机制来调用模板。

$WEAVE$ 宏和编织规则现在可以调用带参数的模板。 当解释的模板从“编译的”生成器编织外部模板时,将不再对它进行解释,但仍然会执行编译的模板代码。 “编译的”模板现在可以编织解释的模板。

Java反射不用于从模板模型访问查询集合,模板模型也称为QueriesGenerated。

UI/UX

MacBook TouchBar

默认上下文包括用于运行、生成和调试应用程序的控件,能够快速选择或创建新的运行/调试配置。 现在,Preferences | Appearance & Behavior | Menus and Toolbars 下有一个新的 Touch Bar 页面可以自定义操作。

是的,它可以扩展! 只需将任何所需操作添加到特殊的 MPS 'InterfaceGroup' 中。

高对比度 UI 主题

我们添加了对新的高对比度主题的支持,您可以使用 Preferences -> Appearance & Behavior 下主题选项中的下拉列表访问这些主题。

查找已弃用代码的新操作

Find Usages of Deprecated 操作可以找到弃用元素的所有用法。 现在,已发现用法的报告按预期的代码移除版本对条目进行分组,因此可以更轻松地识别其严重性并优先考虑先消除哪些代码。

重写或实现行为方法的新图标

行为方法已采用新图标。 以下屏幕截图显示了重写或实现所选方法的 getPresentation() 方法列表,并允许您从那里导航到这些方法。

重写/实现图标的进一步增强

包含重写/实现的概念/类/方法的弹出窗口已变为异步状态,这意味着在后台,MPS 将使用搜索结果填充弹出窗口。 此外,您现在还可以使用搜索对象的名称进行筛选。

查找器更改

MPS 分发的查找器已经更新和优化。 要异步执行查找器,您需要使用特殊的OnEachNodeFoundByExpression,它表示一个简单的查找器调用,其中包含为每个找到的节点执行的回调。 这样一来,概念的查找用法选项已更改。 这些选项已使用派生概念和概念上级进行了扩展,它们分别产生子概念和超概念列表。 此外,行为方法的查找用法选项使用“Overridden Methods”和“Overriding Methods”进行了扩展。

禁止特定错误

错误抑制曾经是一个粗略的工具,用于防止 MPS 显示由 typesystem 检查器不当发现的错误。 如果使用“Suppress error for node ...”意图并通过“SuppressErrorAnnotation“属性对节点进行了注释,则不会显示该节点或其任何子节点的错误消息。

现在,可以仅禁止特定的错误消息。 将禁止该节点及其所有子节点的错误消息,但任何其他消息仍将保持存在。 有关详情,请参阅文档

编辑器

可重复使用的单元操作映射

通过导入,可以将来自现有操作映射的单元操作映射项在新的操作映射中重复使用。

生成语言

提示和技巧

现在,您可以自定义 MPS 的默认提示和技巧。 自定义操作可以在生成脚本中通过新的提示和技巧概念完成。 提示可以从常规MPS分发中重用,也可以从目录或解决方案中导入。

提示和技巧语言

要从解决方案导入提示和技巧,请使用模型创建解决方案,然后添加语言 jetbrains.mps.build.tips 和 jetbrains.mps.core.xml,对使用的语言进行建模。 随后,您可以创建 MPSTipsAndTricks 概念的实例,在其中可以创建多个提示。 每个提示都是HTML格式的文本,最多可包含一张图像。

生成打包选项

BuildMps_IdeaPlugin 中的自定义打包选项已被弃用,从现在开始不应再使用。 现在可以直接在布局 BuildMpsLayout_Plugin 结构中选择封装。

通过自动封装,提供的所有语言和解决方案都放在插件根目录下的“languages”文件夹中。 另一方面,手动封装意味着开发者必须自己提供整个插件布局。

生成语言中的新构造

生成语言中的测试模块配置已进行扩展,会指定在执行 MPS ant 测试时必须加载的其他 IntelliJ IDEA 插件。

在某些情况下,测试需要在其环境中使用特定插件,而 MPS 生成语言引擎无法从包含测试的模块中推断出该插件。 现在,您可以确保在执行 MPS Ant 测试期间存在所需的插件。

杂项

完全编译的数据类型

我们已经完全生成数据类型。 现在,可以从 SModel API 获得有关数据类型的所有生成信息。

将迁移数据保存为注释

现在,MPS 支持一种传输迁移数据的全新机制,强烈建议将这种机制用于新创建的迁移。 现在,包含数据的生成节点应附加到足够接近与数据相关的位置的任何节点。

生成包含数据的节点的迁移脚本应声明此类节点的概念,并使用 putData() 结构将每个这样的注释插入到模型中:

检索包含数据的节点的方式与以前类似:

更完善的冲突解决方案

之前,无法同时从本地和远程端应用更改,因为从一端应用更改会直接拒绝另一端的更改。

对于具有多种角色的子项,如果同时应用这两种更改,有些不切实际。 这就是为什么现在,在您从冲突的一端应用更改后,其他存在冲突的更改将在更改组的末尾转换为附加项。 必须单独应用或忽略这些更改。

应用冲突的左侧版本后,您仍然可以应用或忽略右侧的行。