Возможность проверки на исчерпывающую совместимость макропрограммированных типов
Я написал макрос, который генерирует ADT, и хотел бы иметь возможность написать тест, доказывающий, что я сделал это таким образом, который позволяет выполнять проверку исчерпанности. Обе спецификации2 (через typecheck
) и Shapeless (через illTyped
) позволяют проверить, правильно ли введен код или нет, однако это, кажется, не поможет мне обнаружить неисчерпывающее совпадение с образцом (даже при компиляции с -Xfatal-warnings
).
Есть ли способ обнаружить неисчерпывающее совпадение с образцом, который я могу использовать в своем тесте?
1 ответ
Насколько я понимаю, исчерпывающая проверка на самом деле не является особенностью системы типов, то есть если вы посмотрите на правила набора, это не их часть, а что-то, что делается поверх программы с проверкой типов.
Я думаю, что вы могли бы сделать, это использовать макрос для генерации кода как часть ваших тестовых случаев. Ваши тесты не пройдут во время компиляции тестового набора. Или вы используете 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)
Это печатает следующее предупреждение
Информация (NoPosition,match может быть не исчерпывающим. Ошибка при следующем вводе: None,WARNING)
Вы также можете проанализировать код, который вы хотите протестировать, скомпилировать из какой-либо строки или собрать части AST, соединяя их в квазицитаты или что угодно еще.