此文档页面特定于 Scala 2 中发布的功能,这些功能在 Scala 3 中已被删除或被替代功能所取代。除非另有说明,此页面中的所有代码示例均假定你使用的是 Scala 2。
简介
Scala 2.13.6 中引入了一种用于格式化类型错误和检查缺失隐式实例的高级机制。它基于编译器插件 splain。
此工具使用可以由一些内置例程以及 用户提供的分析器插件 处理的简单数据类型抽象了多类编译器错误。
最重要的功能是隐式实例链的说明,它允许用户确定隐式错误的根本原因
基本配置
-Vimplicits
启用隐式链的打印-Vtype-diffs
启用已找到/必需错误的彩色差异
其他配置
-Vimplicits-verbose-tree
显示错误站点和根本原因之间的隐式实例,请参阅 [#implicit-resolution-chains]。
-Vimplicits-max-refined
减少精炼类型的冗长性,请参阅 [#truncating-refined-types]。
功能
错误格式化引擎提供以下增强功能
中缀类型
代替 shapeless.::[A, HNil]
,打印 A :: HNil
。
已找到/必需的类型
而不是打印多达四种类型,仅将别名类型显示为彩色差异
隐式解析链
如果未找到隐式,则常规错误报告程序仅打印调用点处最外层的错误。以前,标志 -Xlog-implicits
导致编译器打印有关已处理隐式的全部信息,但输出非常冗长,并且包含已成功解析的参数的所有无效隐式。该标志已重命名为 -Vimplicits
,并打印所有涉及的隐式实例的紧凑列表。 -Xlog-implicits
将继续作为已弃用的别名使用。
此处,!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 {...}
之前可以占用多少个字符。默认情况下,显示未删节的类型。