MPS 2024.1 最新变化

MPS 2024.1 为 Project(项目)工具窗口中的 Logical View(逻辑视图)窗格带来了新的异步实现,显著改进了对各种平台的 Kotlin 支持,并大幅缩短了测试运行时间。您还将发现生成方案中的条件复刻、TestInfo 中项目路径的弃用、新 UI 改进以及大量平台更新。

具体增强如下所示。

针对 Kotlin 的增强平台支持

MPS 中的 Kotlin 支持最初设计为仅支持通用代码。不过,MPS 中唯一可能的用例是编译到 JVM,并且通用代码和 JVM 代码之间的区别并不清晰。

在这个版本中,我们为 Kotlin 节点引入了平台源集配置。这让您可以识别一段代码支持哪些目标平台并隐藏不兼容代码中的声明。

源集

在常规 Kotlin 项目中,您可以使用源集来分离针对不同平台的代码。在 MPS 中,我们在根级别引入了此功能,其中包含为每个 Kotlin 根节点指定一组支持平台的选项。这些源集可以在意图操作的帮助下在根节点级别进行配置。

在实践中,这意味着:

  • 给定源集下的代码只能访问具有兼容平台的声明。例如,特定于 JVM 的代码可能只访问 JVM 特定代码和针对 JVM 的通用代码。
  • 生成的源在源集特定目录下组织。如果未指定目录,它将使用默认源集,该集对应于模块的默认值。
  • expect 和 actual 声明现已得到支持。

没有显式平台的 Kotlin 代码默认使用 JVM,旨在保持向后兼容。

存根的加载和编译

存根已经得到改进,支持新的多平台用例。过去,MPS 为 Kotlin 和 Kotlin/JVM 存根提供独立选项,分别加载通用存根和 JVM 存根。

这两个选项现已统一在 Kotlin 存根下,可以自动确定提供的工件是公开通用代码、JVM 代码还是其他平台的代码。

由于通用库和平台特定库之间的声明冗余(两个工件都包含所有必要声明),我们引入了一种新的重复筛选机制来保持存根整洁。在同一模块下声明时,平台特定库可以访问通用声明,因此您不必再次声明。

依赖项配置与以前相同:

  • 通用库和平台特定库均可用作存根。
  • JVM 库是将通用代码编译到 JVM 的必要条件,并且应该在 Java facet 中声明。

例如,编写通用代码要求您使用通用存根库(使用通用源集),但您还必须在 Java facet 中声明 Java 工件。

在没有 CodeRules typesystem 的情况下提高的 Kotlin 可读性

当基于 CodeRules 的 Kotlin Typesystem 插件不可用时,MPS 中的 Kotlin 代码此前会引发大量 typesystem 和作用域错误。为了提高可读性和可测试性,当基于 CodeRules 的 typesystem 插件不可用时,这些检查和错误现在会被忽略。

在这种情况下,Kotlin 语言中的所有作用域都被替换为包括所有兼容概念节点的默认作用域。由于所有有效节点都在作用域内,这会移除误报错误。

处理 Kotlin 代码的准则与以前相同:

  • 编写和检查 Kotlin 代码应在启用 CodeRules 和安装 Kotlin Typesystem 插件的情况下完成。
  • 即使没有它们,也可以安全读取和生成 Kotlin。

Logical View(逻辑视图)窗格重新实现

Logical View(逻辑视图)窗格现在基于异步架构,这有助于保持 UI 快速响应和提高 IDE 的整体性能。新实现还简化了扩展和修改。有关详情,请参阅知识库中题为 ProjectPane implementation on top of ProjectViewTree 的文章。

新实现带来了一些显著变化:

  • 错误和警告指示器不再可用。
  • 层次结构中发现的错误和警告都以红色下划线标出。
  • Show Descriptor Models(显示描述符模型)选项会影响所有描述符模型。
  • 一些拖放操作的工作方式有所不同。
  • Logical View(逻辑视图)窗格中的设置已稍微重新组织。

占位符单元

我们在 BaseLanguage 中引入了一种新样式,这种新样式使常量单元在存在缺失值(子节点或引用)时可以充当占位符。例如,当类中没有构造函数时,可以显示 <no default constructor> 占位符单元。该样式使常量单元表现出您期望从此类占位符单元中得到的行为。光标只能放在第一个位置,并且不能编辑值。只可以进行附加转换菜单提供的修改。

构建语言的更改

构建语言中模块的布尔 doNotCompile 选项已被替换为 Java 枚举,可以更好地区分以下情况:

  • 模块不包含任何代码。
  • 模块包含代码,但代码是由 MPS 以外的工具编译。

这两种情况都曾以值 true 表示。

新的 Java 枚举有三个可能的值:

  • compile in MPS
  • compile externally
  • no code

迁移到 2024.1 时,doNotCompile 的原始 false 值将迁移到 compile in MPS,而 doNotCompiletrue 值将迁移到 compile externally

生成方案中的条件复刻

一个小型实验性新功能,让您能够为生成方案添加复刻,而无需实际修改正在复刻的原始方案。生成方案可以被标记为另一个生成方案的复刻。标记的方案将被视为显式引用并在复刻的生成方案的最开始处插入了标准 fork 语句。

此外,定义复刻时,您可以使用字符串修饰符作为触发器。只有当生成的模型由具有生成目标 facet 且 facet ID 与字符串触发器匹配的模块拥有时,才会发生复刻。

MPS 中的 JUnit5 XML 报告

MPS 中的 JUnit 测试现在不仅可以生成 Vintage 和 Jupiter 格式的测试报告,还可以生成 Open Test Reporting 格式的测试报告。构建语言的测试选项中有一个新选项,用于控制是否在生成的报告中包含 Open Test 报告。如果该选项设为 true,会在项目目录中创建名为 junit-platform-events*-$BUILD_NAME$.xml 的报告文件。

如果该选项设为 false,将为 Vintage 和 Jupiter 引擎创建旧版报告。

传播到测试报告的 JUnit5 注解 @DisplayName

MPS 测试报告现在会考量 JUnit @DisplayName 注解并将名称传播到测试报告工具窗口中显示的报告。

测试运行时改进

运行节点或编辑器测试时,MPS 过去会将整个测试模型复制到瞬态模型中,并为每个测试用例节点制作额外副本(从根 NodeTestCaseEditorTestCase 开始)。对于大型测试模型,这往往会明显影响性能。它还会导致带有重复测试节点的奇怪设置。在 MPS 2024.1 中,带有测试的模型将不再被复制,只有 NodeTestCaseEditorTestCaseTestNode 子项及其各自环境节点(它们的引用的目标)会被复制。

TestInfo 中的项目路径不再需要

对于需要打开 MPS 项目的测试,不再需要 TestInfo 声明。这适用于执行 JUnit 测试的所有方式:

  • 如果测试是从 IDE 运行,无论是在进程内还是进程外,都将使用当前打开的项目。
  • 如果测试是使用 <launchtests> 任务运行,则可以将 project path 指定为任务的额外项目路径选项。如果未指定,将使用 ${basedir},它对应于当前项目的主目录。
  • 对于上述方式均无法使用的特殊情况,您可以通过 -Dmps.test.project.path 系统属性指定项目位置。

现有 TestInfo 声明仍然受支持并且可以保留。

模块类加载的彻底重做

在将类加载与模型访问和 ReloadableSModule 的弃用分离的过程中,我们改变了模块的类加载的工作方式。虽然我们已经尽力为最终用户避免明显更改,但更新可能导致以前不存在的类加载问题。

作为此次重做的一部分,MPS 现在继续使用在 module.xml 中为部署的模块声明的依赖关系,而不会尝试在启动时根据分散在模块文件中的信息来计算。在设计阶段,依赖关系派生自模型转换阶段收集的信息,并且在这里也不会重新计算。分析 .mpl.msd 文件的模块依赖项的旧逻辑仍然有效,以防新方法失败。

这些更改是改进 Java 模块 facet 以及模块 facet 的长期工作的一部分。

从作用域中排除注释掉的节点(在 2022.3.2 中也可用)

依赖默认作用域计算时,注释掉的潜在目标节点现在会自动从作用域中排除。

其他

  • 十六进制长字面量已引入 BaseLanguage
  • 当项目需要迁移并且存在模块/模型版本不兼容时(例如,如果模块提到的语言版本与模型中提到的版本不同),将弹出通知窗口,显示所有存在不兼容问题的模块。这有助于合并迁移的代码,因为您可以确保合并的状态反映正确的语言和模块版本。
  • Logical View(逻辑视图)窗格中 devkit 下的模块显示为模块引用节点。这类似于语言模块下运行时模块的呈现方式。

大量 bug 修正

  • 同样,这个版本修正了许多 bug。这里列出了我们修正的所有问题。

平台更新

新 UI 中的新终端

测试版

MPS 2024.1 推出了重做的终端,具有可视化和功能增强,有助于简化命令行任务。此更新为既有工具带来了全新的外观,命令被分为不同的块,扩展的功能集包括块间丝滑导航、命令补全和命令历史记录的轻松访问等。在这篇博文中了解详情。

用于缩小整个 IDE 的选项

您现在可以将 IDE 缩小到 90%、80% 或 70%,从而可以灵活地调整 IDE 元素的大小。

Gradle 版本支持更新

从这个版本开始,MPS 不再支持使用低于 Gradle 版本 4.5 的项目,并且 IDE 不会对带有不支持的 Gradle 版本的项目执行 Gradle 同步。

大量 VCS 功能

在 Log(日志)标签页中显示审查分支更改的选项

MPS 2024.1 通过提供分支相关更改的集中视图简化了代码审查工作流。对于 GitHub、GitLab 和 Space,现在可以在 Git 工具窗口中的单独 Log(日志)标签页中查看具体分支中的更改。为此,点击 Pull Requests(拉取请求)工具窗口中的分支名称,然后从菜单中选择 Show in Git Log(在 Git 日志中显示)。

对代码审查评论回应的支持

MPS 2024.1 开始支持对 GitHub 拉取请求和 GitLab 合并请求的审查评论发表回应,已有一组表情符号可供选择。

从推送通知创建拉取/合并请求

成功将更改推送到版本控制系统后,IDE 现在将发布一条通知,提醒您已成功推送并建议创建拉取/合并请求的操作。

待处理 GitHub 更新的可视化指示器

我们引入了可视化指示器来提示代码审查工作流中待处理的更新。有需要您注意的更改时,工具窗口的图标上会出现一个点。未查看的拉取请求也将用点标记,确保您不会错过代码审查流程中的更新。

防止大文件提交到仓库

为了帮助您避免由于文件过大而导致版本控制拒绝,IDE 现在包含预提交检查,防止您提交此类文件并通知您该限制。

Git 工具窗口中 History(历史记录)标签页的分支筛选器

Git 工具窗口中,Show all branches(显示所有分支)按钮已被替换为分支筛选器,允许您审查对指定分支内的文件所做的更改。我们还调整了工具栏的方向,将其水平放置以提高实用性。

Branches(分支)弹出窗口中改进的搜索

Branches(分支)弹出窗口中,您可以按操作和仓库筛选搜索结果,以在版本控制系统中更快、更精确地导航。

Allow unrelated histories(允许不相关的历史记录)合并选项

Merge into(合并到)对话框的下拉菜单中新增了 Allow unrelated histories(允许不相关的历史记录)选项。选择后,该选项允许合并两个分支,即使它们没有共同的历史记录。

从比较中排除文件夹和文件的选项

在差异查看器中,您可以指定在比较中要忽略的文件夹和文件,从而仅关注有意义的更改。右键点击您不想在比较结果中看到的文件或文件夹,然后从上下文菜单中选择 Exclude from results(从结果中排除)。

迁移指南

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