Sawmill

Namespace Sawmill

Classes

AutoRewriter<T>

An experimental implementation of IRewriter<T> using reflection.

AutoRewriter<T> looks for the subtype's constructor, and gets/sets the T-children in the order that they appear in the constructor.

Cursor<T>

A Cursor<T> is a mutable view of a location in a T-structure, allowing efficient access to (and editing of) a node and its parent, siblings, and immediate children.

You can think of a Cursor<T> as being focused on a particular node. After zooming in on a node, you can efficiently go up to the node's parent, down to the node's first child, or left or right to the node's immediate siblings.

Cursor<T> is generally not as efficient or useful as the SelfAndDescendantsInContext<T>(IRewriter<T>, T) family for replacing single nodes, but it efficiently supports longer sequences of edits to a location and its neighbours.

Direction

Represents a direction that a Cursor<T> can move in

Rewritable

Extension methods for IRewritable<T> implementations.

RewritableRewriter<T>

An implementation of IRewriter<T> for Ts which implement IRewritable<T>.

Rewriter

Extension methods for IRewriter<T> implementations.

RewriterBuilder

Tools for building rewriters.

RewriterBuilder<T>

Tools for building rewriters.

RewriterBuilderCase

Tools for building rewriters for a single subclass of a base type.

RewriterBuilderCase<TArgs, TBase, TSub>

Tools for building rewriters for a single subclass of a base type.

SpanFunc<T, U, R>

A Func<T1,T2,TResult> whose first argument is a Span<T>.

Interfaces

IRewritable<T>

A object is rewriterable if it knows how to access its immediate children.

Implementations should ensure that you always get the children you just set (rewritable.SetChildren(children).GetChildren() == children), and that successive sets overwrite the earlier operation (rewritable.SetChildren(children1).SetChildren(children2) == rewritable.SetChildren(children2)).

IRewriter<T>.

IRewriter<T>

A rewriter is an object which knows how to access the immediate children of a value of type T.

Implementations should ensure that you always get the children you just set (rewriter.GetChildren(rewriter.SetChildren(children, expr)) == children), and that successive sets overwrite the earlier operation (rewriter.SetChildren(children2, rewriter.SetChildren(children1, expr)) == rewriter.SetChildren(children2, expr)).

IRewritable<T>.