Изменение узла в Scala AST

Я понимаю, что можно получить Дерево, соответствующее выражению Scala, а также пройтись по полученному дереву. Предположим, что данный узел дерева соответствует некоторому критерию, какие вызовы методов мне нужны, чтобы иметь возможность модифицировать его на месте?, то есть заменить его каким-то другим деревом?

object traverser extends Traverser {
    var applies = List[Apply]()

    override def traverse(tree: Tree): Unit = tree match {
        case someCriterion => modifyNodeSomehow // How to do this?
        // Otherwise...
        case app @ Apply(fun, args) =>
            applies = app :: applies
            super.traverse(fun)
            super.traverseTrees(args)
        case _ => super.traverse(tree)
    }
}

person NietzscheanAI    schedule 05.02.2013    source источник


Ответы (1)


В другом вопросе мне предложили использовать Transformer, чтобы что-то сделать похожий. Однако, насколько я знаю, невозможно изменить дерево на месте.

person ghik    schedule 05.02.2013
comment
Спасибо - Трансформер точно делает то, что требуется (пусть и не на месте, а в функциональном стиле). - person NietzscheanAI; 07.02.2013