Могу ли я сохранить дерево, созданное в одном макросе Scala Def, а затем передать его в другой - PullRequest
0 голосов
/ 04 января 2019

Скажем, у меня есть выражение, дерево которого я хочу записать (не оценивая его!), А затем передать его в другой макрос через некоторое время:

// capture a tree from some arbitrary expression
val capturedTree = captureMacro( some(expression(tree())) )

// plug the tree into here
val result = processMacro(capturedTree, otherStuff)

Есть ли способ сделать это?Я попытался сделать capturedTree усовершенствованным типом, надеясь, что это сохранит исходное дерево, но этого не произошло:

trait WithCapturedTree { def tree:Any }
class ReturnTreeMacro(val c:MacroContext) {
    import c.universe._

    def run(expression: Tree) =
        q"new WithCapturedTree {val tree = ${expression}}"
    }
def returnTree(expression:String):WithCapturedTree = macro ReturnTreeMacro.run

reify { returnTree("foo"+"bar") }
// returns Expr[WithCapturedTree{val tree: java.lang.String}](returnTree("foobar"))
// I.e. the result of "foo"+"bar" has already been evaluated!

Есть ли способ заставить этот подход работать?Есть ли лучшая оценка для этой проблемы?

...