Struct cstree::GreenNodeBuilder[][src]

pub struct GreenNodeBuilder<'cache, 'interner, I = TokenInterner> { /* fields omitted */ }

A builder for green trees. Construct with new or with_cache. To add tree nodes, start them with start_node, add tokens and then finish_node. When the whole tree is constructed, call finish to obtain the root.

Examples

let mut builder = GreenNodeBuilder::new();
builder.start_node(ROOT);
builder.token(INT, "42");
builder.finish_node();
let (tree, interner) = builder.finish();
assert_eq!(tree.kind(), ROOT);
let int = tree.children().next().unwrap();
assert_eq!(int.kind(), INT);
let resolver = interner.unwrap().into_resolver();
assert_eq!(int.as_token().unwrap().text(&resolver), "42");

Implementations

impl GreenNodeBuilder<'static, 'static>[src]

pub fn new() -> Self[src]

Creates new builder with an empty NodeCache.

impl<'cache, 'interner, I> GreenNodeBuilder<'cache, 'interner, I> where
    I: Interner
[src]

pub fn with_cache(cache: &'cache mut NodeCache<'interner, I>) -> Self[src]

Reusing a NodeCache between multiple builders saves memory, as it allows to structurally share underlying trees.

pub fn token(&mut self, kind: SyntaxKind, text: &str)[src]

Add new token to the current branch.

pub fn start_node(&mut self, kind: SyntaxKind)[src]

Start new node of the given kind and make it current.

pub fn finish_node(&mut self)[src]

Finish the current branch and restore the previous branch as current.

pub fn checkpoint(&self) -> Checkpoint[src]

Prepare for maybe wrapping the next node with a surrounding node.

The way wrapping works is that you first get a checkpoint, then you add nodes and tokens as normal, and then you maybe call start_node_at.

Examples

let checkpoint = builder.checkpoint();
parser.parse_expr();
if parser.peek() == Some(PLUS) {
    // 1 + 2 = Add(1, 2)
    builder.start_node_at(checkpoint, OPERATION);
    parser.parse_expr();
    builder.finish_node();
}

pub fn start_node_at(&mut self, checkpoint: Checkpoint, kind: SyntaxKind)[src]

Wrap the previous branch marked by checkpoint in a new branch and make it current.

pub fn finish(self) -> (GreenNode, Option<I>)[src]

Complete building the tree.

Make sure that calls to start_node / start_node_at and finish_node are balanced, i.e. that every started node has been completed!

If this builder was constructed with new, this method returns the interner used to deduplicate source text (strings) as its second return value to allow resolving tree tokens back to text and re-using the interner to build additonal trees.

Trait Implementations

impl<'cache, 'interner, I: Debug> Debug for GreenNodeBuilder<'cache, 'interner, I>[src]

impl Default for GreenNodeBuilder<'static, 'static>[src]

Auto Trait Implementations

impl<'cache, 'interner, I> RefUnwindSafe for GreenNodeBuilder<'cache, 'interner, I> where
    I: RefUnwindSafe

impl<'cache, 'interner, I> Send for GreenNodeBuilder<'cache, 'interner, I> where
    I: Send

impl<'cache, 'interner, I> Sync for GreenNodeBuilder<'cache, 'interner, I> where
    I: Sync

impl<'cache, 'interner, I> Unpin for GreenNodeBuilder<'cache, 'interner, I> where
    I: Unpin,
    'interner: 'cache, 

impl<'cache, 'interner, I = TokenInterner> !UnwindSafe for GreenNodeBuilder<'cache, 'interner, I>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.