错误格式化

语言
此文档页面特定于 Scala 2 中发布的功能,这些功能在 Scala 3 中已被删除或被替代功能所取代。除非另有说明,此页面中的所有代码示例均假定你使用的是 Scala 2。

简介

Scala 2.13.6 中引入了一种用于格式化类型错误和检查缺失隐式实例的高级机制。它基于编译器插件 splain

此工具使用可以由一些内置例程以及 用户提供的分析器插件 处理的简单数据类型抽象了多类编译器错误。

最重要的功能是隐式实例链的说明,它允许用户确定隐式错误的根本原因

implicits

基本配置

  • -Vimplicits 启用隐式链的打印
  • -Vtype-diffs 启用已找到/必需错误的彩色差异

其他配置

-Vimplicits-verbose-tree 显示错误站点和根本原因之间的隐式实例,请参阅 [#implicit-resolution-chains]。

-Vimplicits-max-refined 减少精炼类型的冗长性,请参阅 [#truncating-refined-types]。

功能

错误格式化引擎提供以下增强功能

中缀类型

代替 shapeless.::[A, HNil],打印 A :: HNil

已找到/必需的类型

而不是打印多达四种类型,仅将别名类型显示为彩色差异

foundreq

隐式解析链

如果未找到隐式,则常规错误报告程序仅打印调用点处最外层的错误。以前,标志 -Xlog-implicits 导致编译器打印有关已处理隐式的全部信息,但输出非常冗长,并且包含已成功解析的参数的所有无效隐式。该标志已重命名为 -Vimplicits,并打印所有涉及的隐式实例的紧凑列表。 -Xlog-implicits 将继续作为已弃用的别名使用。

compact

此处,!I 表示找不到隐式值,隐式参数的名称为黄色,其类型为绿色。

如果给出了参数 -Vimplicits-verbose-tree,则将打印所有中间隐式,可能跨越几十行。页面顶部的 circe 错误就是一个示例。

为了进行比较,这是此情况下的常规编译器输出

[error] /path/Example.scala:20:5: could not find implicit value for parameter a: io.circe.Decoder[A]
[error]   A.fun
[error]     ^

中缀类型和类型参数换行

长度超过 79 个字符的类型将被拆分为多行

implicit error;
!I e: String
f invalid because
!I impPar4: List[
  (
    VeryLongTypeName ::::
    VeryLongTypeName ::::
    VeryLongTypeName ::::
    VeryLongTypeName
  )
  ::::
  (Short :::: Short) ::::
  (
    VeryLongTypeName ::::
    VeryLongTypeName ::::
    VeryLongTypeName ::::
    VeryLongTypeName
  )
  ::::
  VeryLongTypeName ::::
  VeryLongTypeName ::::
  VeryLongTypeName ::::
  VeryLongTypeName
]

截断精炼类型

精炼类型(如 T { type A = X; type B = Y })可能会变得很长,并使错误消息混乱不堪。选项 -Vimplicits-max-refined 控制精炼在显示为 T {...} 之前可以占用多少个字符。默认情况下,显示未删节的类型。

此页面的贡献者