可以测试宏生成类型匹配的穷尽性

Possible to test for exhaustivity of match of macro-generated types

我已经编写了一个生成 ADT 的宏,并且希望能够编写一个测试来证明我已经以允许穷举检查起作用的方式完成了此操作。 specs2(通过 typecheck)和 Shapeless(通过 illTyped)都允许测试代码是否正确输入,但这似乎并没有让我检测到非详尽的模式匹配(即使使用 -Xfatal-warnings 进行编译)。

有没有一种方法可以检测我可以在测试中使用的非详尽模式匹配?

据我所知,穷尽性检查并不是类型系统的真正特征,也就是说,如果你看一下类型规则,它不是它们的一部分,而是在类型检查程序之上完成的事情.

我想您可以做的是使用宏生成代码作为测试用例的一部分。然后,您的测试将在测试套件的编译过程中失败。或者您使用编译器 api 在测试执行期间编译代码。应该可以在那里得到这些警告。

我发现你可以使用工具箱来做到这一点 API:

import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._

val code = q"""
  val s: Option[Int] = Some(1)
  s match{case Some(x)=>}
"""

val toolbox = currentMirror.mkToolBox(new tools.reflect.FrontEnd {
  override def display(info: Info) = println(info)
  override def interactive() {}
})
toolbox.eval(code)

这将打印以下警告

Info(NoPosition,match may not be exhaustive. It would fail on the following input: None,WARNING)

您还可以从一些字符串中解析您想要测试编译的代码,或者将 AST 拼接成准引号或其他任何适合您的方式。