scala.tools.refactoring.transformation
Applies a transformation to all subtrees of a tree T, returning a new tree,typically of the same kind as T.
Applies a transformation to all subtrees of a tree T, returning a new tree,typically of the same kind as T.
If the transformation fails on one child, abort and fail the whole application.
Creates a transformation that always returns the value x.
Always fails, independent of the input.
Applies a transformation to all subtrees of a tree T, returning a new tree,typically of the same kind as T.
Applies a transformation to all subtrees of a tree T, returning a new tree,typically of the same kind as T.
If the transformation fails on one child, apply the
identity transformation id
and don't fail, unlike
allChildren
.
Do a transformation until it succeeded once, then just fail.
Do a transformation until it succeeded once, then just fail.
Note that because of the statefulness of once, you need to make sure that it isn't accidentally passed as a by-name parameter to another transformation and instantiated multiple times.
We often want to use transformations as predicates, which execute the next transformations if the result is true.
We often want to use transformations as predicates, which execute the next transformations if the result is true. For example:
val tree_with_range_pos = filter[Tree] { case t: Tree => t.pos.isRange }
We can then use the predicate like this: tree_with_range_pos andThen do_something_with_the_tree orElse nothing
Always succeeds and returns the input unchanged.
Construct a transformation from a partial function; this is the most commonly used way to create new transformations, for example like:
Construct a transformation from a partial function; this is the most commonly used way to create new transformations, for example like:
val reverse_all_class_members = transformation[Tree, Tree] { case t: Template => t.copy(body = t.body.reverse) }
Applies a transformation bottom-up, that is, it applies the transformation to the children of the tree first and then to their parent.
Applies a transformation bottom-up, that is, it applies the transformation to the children of the tree first and then to their parent. The consequence is that the parent "sees" its transformed children.
Applies a transformation top-down, that is, it applies the transformation to the tree T and then passes the transformed T to all children.
Applies a transformation top-down, that is, it applies the transformation to the tree T and then passes the transformed T to all children. The consequence is that the children "see" their new parent.
Transformations is the basis for all refactoring transformations.
A transformation is a Function from X ⇒ Option[X], and can be combined with other transformations in two ways: andThen - which applies the second transformation only if the first one was successful, i.e. returned Some(_). orElse - which is applied only when the first transformation returned None.
Xs are typically instances of global.Tree, but this is not enforced. Once a transformations is assembled, it has to be applied to a tree and its children. The function
all
applies a transformation to the children of a tree. In the case of the trees, the tree has to apply the transformation to all children and return one single tree.Additional functions are provided that apply a transformation top-down or bottom-up.