MPS 2023.2 最新变化

MPS 2023.2 带来了 BaseLanguage lambda 生成改进、JUnit 5 支持、类型系统推断规则重写等更新。

JUnit 5 支持

JUnit 5

MPS 中的测试现在作为 JUnit 5 测试生成。 仍提供对 JUnit 4 的有限支持。

  • 任何适当注解的 Java 类都可以作为测试执行。
  • 运行 MPS 测试的两种选项(进程内和派生)均可用。
  • 现有测试根使用 JUP Jupiter API 注解生成:
    • BTestCase
    • NodeTestCase
    • EditorTestCase
    • MigrationTestCase
    • PatternTest
    • GeneratorTest

用于以 JUnit 5 启动模块测试的 Ant 任务

新的 launchtests Ant 任务支持以下元素:

  • 插件
  • testmodules

支持除 JUnit 3 之外的所有测试工件的执行,并充当测试配置构建部分的新目标。

从 MPS 执行测试

  • 任何适当注解的 Java 类都可以作为测试执行。
  • 现在对 JUnit 4 只有有限支持。
  • 进程内和派生执行均受支持。

测试平台 API

此 API 允许扩展 MPS 中可用的测试类型,以及为测试会话实现侦听器。

jetbrains.mps.baseLanguage.unitTest.platform 中的类构成 MPS 测试平台 API:

TestPlatform 为 MPS 测试平台定义 API。
TestDescriptor 表示 MPS 测试平台上的单个测试。
TestSource 表示测试源,例如 SNode
TestSession 表示测试会话。
TestDiscoveryParticipant 允许加入测试发现进程。
TestSessionListener 允许从测试会话接收通知。

对自定义测试引擎的实验性支持

JUnit 5 还引入了对实现使用自定义引擎执行的测试的支持。 这种引擎的一个流行示例是 jqwik – 基于属性的测试框架。

增强了对重写类型系统规则的支持
客户赞助

TS 重写

我们最近添加了一项功能,允许类型系统规则重写超级概念上定义的规则。 这适用于子概念以扩展包含超概念的语言的语言定义的情况。 该功能支持 Inference 规则。

BaseLanguage 改进

在较早更新中,MPS 获得了对方法引用以及将闭包转换为 Java lambda 的增强支持。 我们通过大量小功能和 bug 修正扩展了此支持。

Lambda

以 lambda 形式生成闭包

集合运算中使用的闭包现在作为 Java lambda 生成,其最初仅可用于使用 Java 接口的常规函数调用。 为了保持向后兼容,在某些情况下,闭包仍将作为匿名类生成:

  • 变量名称与外部变量冲突时 – 现在会显示警告,建议重命名。
  • 目标 Java 版本低于或等于 8 时。
  • 使用原始类型时 – 它们无法与 Java lambda 良好配合。

通常,这会提高生成代码的质量,因为 lambda 不仅可读性更高,还不太可能错误生成。 另一方面,MPS 允许具有 Java 不允许的原始类型的功能,因为检测此类实例仍然具有挑战性。 因此,在使用原始类型的位置,生成可能失败。

闭包形参

闭包形参

先前的闭包形参有多种可能的形式:~param<type> paramparamvar param。 跳过类型的同时添加形参相当麻烦。 在这个版本中,我们已弃用 ~param 形式,转而采用简单的无类型形参,现在会默认插入这种形参。 另外,在函数调用中插入闭包时,默认形参将从预期函数类型插入。 最后,如果源代码中省略了其类型,则生成的形参现在将省略类型,从而进一步提高编译质量。

流

流互操作性

虽然序列在 MPS 中广泛使用,但有时也必须使用 Java 流。 此更新提供了改进的推断,缓解与 Stream API 可能使用的复杂方法相关的类型系统问题。 我们添加了两个操作来桥接流和序列:

  • <stream>.asSequence 可将序列转换为流。
  • <sequence>.toStream(parallel=…) 可将流转换为序列。

除了允许您选择要使用的 API 之外,这还允许您将序列的优势(可重复性)和流的优势(各种收集器、更多运算符)结合起来。

集合改进

我们之前为 BaseLanguage 构造函数引入了菱形运算符 (new ArrayList<>()),但集合创建器被排除在此改进之外。 在此更新中,您可以省略新集合中的类型形参,简化代码编写流程:

  • 从初始值推断的类型:var myList = new arraylist<> {myInitialValue}
  • 从变量声明推断的类型:map<int, string> myMap = new hashmap<>

此外,我们还改进了对集合差异的支持。 例如,无法再指定 ? extends Number 表示法。 不过,当有界类型有效时,类型系统将不再反对使用。 默认情况下,sequence<> 类型将保持协变,因为它不会导致不安全的后果,因为您无法将其插入不属于其类型的元素序列中。 在不安全的代码先前未检测到的位置,这可能会带来新的类型检查问题。 为此,可以使用有界类型 list<? extends node<>> 或序列类型 sequence<node<>>

配置设置

禁用 Make

启动时禁用 Make

我们添加了新选项 Disable Make On Startup(启动时禁用 Make),该选项位于 Settings | Project Settings | Make(设置 | 项目设置 | Make)中。 选择此选项后,MPS 在启动时将不会编译项目的所有模块。 如果您想在初始编译流程花费太长时间或可能失败的情况下提高启动速度(因为在成功编译项目之前需要手动配置),这可能会派上用场。

编辑库

在模块 Java 属性下编辑库和源路径

模块属性对话框的 Java 标签页中新增了 Edit(编辑)选项。 虽然不显眼,但是非常方便。 需要更改模块的 jar 库集时,使用这个新选项即可,不必费力移除和添加条目。

其他

TODO 注释

自定义注释的 TODO 功能

扩展 IGenericComment 概念允许用自定义语言表示注释的概念参与 MPS 的 TODO 功能。 表示 TODO 的注释将由 TODO Finder 收集,在 TODO Viewer 中列出,并在提交流程中检查。

语言切面:管理 Create New(新建)操作

对于在切面模型中创建实例,MPS 到目前为止一直遵循涉及可设为根的非抽象概念的通用逻辑,按名称或标志排序。 现在,可选配置可以与切面声明一起指定,允许语言设计者控制向用户呈现哪些概念,及其分组和排序。

“Please re-export dependency…”(请重新导出依赖项…)检查现已废弃

ClassConcept 扩展或以其他方式公开它对来自另一个模块的 ClassConcept 的使用时,会显示此令人困惑的警告。 在版本 2023.2 之前,MPS 依赖模块描述符中指定的模块依赖项来构建依赖关系图。 现在,MPS 基于转换模型涉及的实际生成器和语言构建依赖关系信息,您不再需要显式指定这些依赖项,因此不再需要检查。

从旧版本移植的客户赞助功能

分享是任何社区的一种有用特征。 以下功能根据赞助我们开发这些功能的商业 MPS 用户的请求实现。 现在,您也可以充分利用这些方便的新增功能。

并行模型检查器

模型检查器现在可以有效地利用并行硬件,从而加快模型检查过程。 根据 Settings | Tools | Model Checker(设置 | 工具 | 模型检查器)中的设置,它可以在启动此进程时生成多个线程。

改进了 File-per-root 持久性性能

FilePerRootDataSource.getStreamByName() 方法已经过优化,可提高模型数据加载的性能。 如果您使用 File-per-root 持久性来存储相当大的模型,这种变化会显而易见。

固定对话框

改进了对 Find text in project(在项目中查找文本)的支持

现有的 Find text in project(在项目中查找文本)操作已得到改进,现在也可用于搜索命名节点的引用,从而显示其他相关结果。 添加了一个预览面板,允许您直接在搜索对话框中查看结果。 现在,包含 HTML 内容的文本在结果中以纯文本形式呈现,而不是像之前的版本那样以 HTML 形式呈现。

跳过 Ant 任务中的依赖项迁移

在使用 MPS 提供的 Ant 任务迁移项目时,依赖项可能无法正确迁移。 我们添加了一个标志,即使在这种情况下也可以继续迁移项目。 一旦发现未迁移的依赖项就立即停止迁移过程仍然是默认行为。 要使用此标志,请将 haltOnDependencyError="false" 添加到您的 migrate Ant 任务中。

平台更新

全 IDE 缩放

在 v2023.2 中,可以完全放大和缩小 IDE,同时增加或缩减所有 UI 元素的大小。 从主菜单中,选择 View | Appearance(视图 | 外观),调整 IDE 的缩放比例。 此外,您可以在 Settings/Preferences | Keymap | Main Menu | View | Appearance(设置/偏好设置 | 按键映射 | 主菜单 | 视图 | 外观)中指定调用这些操作的自定义快捷键。

新的 Remember size for each tool window(记住每个工具窗口的大小)设置

在 MPS 2023.2 中,我们引入了一个新的布局选项,允许您统一侧面工具窗口的宽度或保留在自定义布局时自由调整其大小的能力。 新的 Remember size for each tool window(记住每个工具窗口的大小)复选框位于 Settings/Preferences | Appearance & Behavior | Appearance | Tool Windows(设置/偏好设置 | 外观与行为 | 外观 | 工具窗口)中。 在这篇博文中了解此设置如何适用于新旧 UI。

检查描述中的语法高亮显示

检查描述中的语法高亮显示

Settings / Preferences | Editor | Inspections(设置/偏好设置 | 编辑器 | 检查)中,代码示例现在将包含语法高亮显示,让您可以更容易理解是什么触发了检查并决定使其处于有效状态还是停用状态。

Markdown 文件的 Fill Paragraph(填充段落)

Markdown 文件的 Fill Paragraph(填充段落)

Markdown 文件现在支持 Fill Paragraph(填充段落)编辑器操作,可以将长文本分成几个长度相等的行。 为此,将文本光标置于要编辑的段落内,然后使用 Find Action(查找操作,Ctrl+Shift+A)搜索 Fill Paragraph(填充段落)命令。

改进了 Branches(分支)弹出窗口

改进了 Branches(分支)弹出窗口

我们改进了 Branches(分支)弹出窗口的实用性。 例如,分支被分组并存储在可扩展列表中,导航更加轻松。

Create New Branch(创建新分支)弹出窗口中的自动补全

Create New Branch(创建新分支)弹出窗口中的自动补全

MPS 2023.2 在 Create New Branch(创建新分支)弹出窗口中提供了自动补全。 为新分支输入名称时,IDE 将根据现有本地分支的名称建议相关前缀。

迁移指南

对于每一个主要版本,我们都会准备从旧版本 MPS 迁移的说明,以确保一切顺利。 请仔细查阅。