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

Scala 可以测试宏生成类型匹配的穷尽性,scala,specs2,shapeless,Scala,Specs2,Shapeless,我已经编写了一个生成ADT的宏,并且希望能够编写一个测试来证明我是以一种允许穷尽性检查工作的方式这样做的。specs2(通过typecheck)和Shapeless(通过illTyped)都允许测试代码的类型是否正确,但是这似乎无法让我检测到非穷举模式匹配(即使在使用-Xfatal warnings编译时) 有没有一种方法可以检测我可以在测试中使用的非穷举模式匹配?据我所知,穷举性检查实际上不是类型系统的一个功能,也就是说,如果你查看类型规则,它不是类型规则的一部分,而是在类型检查程序的基础上完

我已经编写了一个生成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)
这将打印以下警告

信息(无位置,匹配可能不详尽。 它将在以下输入时失败:无,警告)

您还可以从某个字符串中解析要测试编译的代码,或者将AST的拼接部分构建为Quasiquetes或其他适合您的内容