Я хотел бы написать макрос, который компилирует код, который он получает как литерал String, и обнаруживает ошибку проверки типа в скомпилированном коде, которая возникает из-за сбоя расширения макроса (либо макрос был прерван, либо расширенный макрос не удалось проверить тип)
Я думал примерно так:
def myMacro(c: Context)(codeStringLiteral: c.Expr[String]): c.Expr[Unit] = {
val codeString = getString(codeStringLiteral) // this part is easy
val ast = c.parse(code)
val actualCode = util.Try(c.typecheck(ast)).recover{ case t: TypecheckException =>
if(t.isMacroExpansionFailure) doOneThing
else doOtherThing
}
c.Expr(actualCode.get)
}
Это возможно?
Контекст
Такой макрос сделал бы тестирование других макросов намного более приятным, откладывая сбой, вызванный расширением макроса, во время выполнения, что позволяет выполнить весь набор тестов, даже если тестовый пример для вашего макроса не работает.
Конечно, достаточно просто полностью отличать проверку типов от среды выполнения, но было бы действительно изящно различать только те ошибки, которые связаны с макросом, который вы пишете при тестировании, и сбой во время компиляции, если сам тестовый код находится в состоянии вина.
Конечно, макрос, не связанный с ним, может дать сбой, но вряд ли это произойдет очень часто.
illTyped
Shapeless для примера общего подхода. - person Travis Brown   schedule 13.04.2015